feat(cli): --fuzzy honors an explicit --no-incremental
The --fuzzy implication previously forced use_incremental back on even when the user passed --no-incremental, while --no-delta and -W were honored. Track a --no-incremental latch (like the no_delta latch): with it set, do not force the handshake on, and because delta needs the handshake, also suppress the delta implication so no invalid '--delta requires --incremental' config results. A --fuzzy --no-incremental run is therefore a plain default-mode transfer (fuzzy inert), consistent with -W/--no-delta. Documented in the usage text (this deliberately differs from the basis-dir options, which still force incremental unconditionally).
This commit is contained in:
+18
-9
@@ -610,9 +610,11 @@ static int apply_table_option(Config* config, const OptionEntry* entry, const ch
|
|||||||
int parse_args(Config* config, int argc, char* argv[], int* positional_args,
|
int parse_args(Config* config, int argc, char* argv[], int* positional_args,
|
||||||
int* positional_count) {
|
int* positional_count) {
|
||||||
bool verbose = false;
|
bool verbose = false;
|
||||||
/* --no-delta seen on the command line: the user explicitly switched the
|
/* Explicit --no-delta / --no-incremental seen on the command line: the user
|
||||||
delta machinery off, so the --fuzzy implication must not override it. */
|
switched part of the delta machinery off, so the --fuzzy implication must
|
||||||
|
not silently turn it back on. */
|
||||||
bool no_delta = false;
|
bool no_delta = false;
|
||||||
|
bool no_incremental = false;
|
||||||
protocol_set_8_bit_output(config->eight_bit_output);
|
protocol_set_8_bit_output(config->eight_bit_output);
|
||||||
|
|
||||||
/* Apply output controls before processing other options so their order is irrelevant. */
|
/* Apply output controls before processing other options so their order is irrelevant. */
|
||||||
@@ -644,6 +646,8 @@ int parse_args(Config* config, int argc, char* argv[], int* positional_args,
|
|||||||
if (strncmp(argv[i], "--no-", strlen("--no-")) == 0) {
|
if (strncmp(argv[i], "--no-", strlen("--no-")) == 0) {
|
||||||
if (strcmp(argv[i], "--no-delta") == 0)
|
if (strcmp(argv[i], "--no-delta") == 0)
|
||||||
no_delta = true;
|
no_delta = true;
|
||||||
|
else if (strcmp(argv[i], "--no-incremental") == 0)
|
||||||
|
no_incremental = true;
|
||||||
if (apply_negation(config, argv[i]) != 0)
|
if (apply_negation(config, argv[i]) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
continue;
|
continue;
|
||||||
@@ -1077,14 +1081,19 @@ int parse_args(Config* config, int argc, char* argv[], int* positional_args,
|
|||||||
|
|
||||||
/* -y/--fuzzy reuses an existing similar-named destination file as the delta
|
/* -y/--fuzzy reuses an existing similar-named destination file as the delta
|
||||||
* basis, so it is meaningless without the receiver-driven delta path:
|
* basis, so it is meaningless without the receiver-driven delta path:
|
||||||
* imply --incremental, and --delta unless --whole-file (or an explicit
|
* imply --incremental and --delta unless --whole-file or an explicit
|
||||||
* --no-delta) switched the delta machinery off. FastSync has delta OFF by
|
* --no-delta / --no-incremental switched the machinery off. FastSync has
|
||||||
* default (unlike rsync), so a bare --fuzzy must turn it on or it would be
|
* delta OFF by default (unlike rsync), so a bare --fuzzy must turn it on or
|
||||||
* a silent no-op. --whole-file/--no-delta after --fuzzy therefore leave
|
* it would be a silent no-op. -W/--no-delta/--no-incremental therefore
|
||||||
* fuzzy inert, matching rsync where --fuzzy only affects delta transfers. */
|
* leave fuzzy inert, matching rsync where --whole-file makes fuzzy
|
||||||
|
* irrelevant (note: unlike the basis-dir options, --fuzzy honors an
|
||||||
|
* explicit --no-incremental instead of forcing the handshake back on). */
|
||||||
if (config->fuzzy) {
|
if (config->fuzzy) {
|
||||||
config->use_incremental = true;
|
if (!no_incremental)
|
||||||
if (!config->whole_file && !no_delta)
|
config->use_incremental = true;
|
||||||
|
/* Delta needs the incremental per-file handshake, so an explicit
|
||||||
|
* --no-incremental also suppresses the delta implication. */
|
||||||
|
if (!config->whole_file && !no_delta && !no_incremental)
|
||||||
config->use_delta = true;
|
config->use_delta = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -84,7 +84,8 @@ void print_usage(void) {
|
|||||||
printf(" -y, --fuzzy Use a similar-named file already in the destination\n");
|
printf(" -y, --fuzzy Use a similar-named file already in the destination\n");
|
||||||
printf(" directory as the delta basis when the destination has no\n");
|
printf(" directory as the delta basis when the destination has no\n");
|
||||||
printf(" usable file at the exact path (saves bandwidth; implies\n");
|
printf(" usable file at the exact path (saves bandwidth; implies\n");
|
||||||
printf(" --incremental and --delta; inert with --whole-file)\n");
|
printf(" --incremental and --delta; inert with --whole-file,\n");
|
||||||
|
printf(" --no-delta, or --no-incremental)\n");
|
||||||
printf(" --no-fuzzy Disable --fuzzy\n");
|
printf(" --no-fuzzy Disable --fuzzy\n");
|
||||||
printf(" --delta-block <n> Delta block size in bytes (default: %d)\n",
|
printf(" --delta-block <n> Delta block size in bytes (default: %d)\n",
|
||||||
DELTA_BLOCK_SIZE_DEFAULT);
|
DELTA_BLOCK_SIZE_DEFAULT);
|
||||||
|
|||||||
Reference in New Issue
Block a user