extern int preserve_hard_links;
extern int update_only;
extern int opt_ignore_existing;
-extern int whole_file;
extern int block_size;
extern int csum_length;
extern int ignore_times;
}
}
+
+/**
+ * Perhaps we want to just send an empty checksum set for this file,
+ * which will force the whole thing to be literally transferred.
+ *
+ * When do we do this? If the user's explicitly said they
+ * want the whole thing, or if { they haven't explicitly
+ * requested a delta, and it's local but not batch mode.}
+ *
+ * Whew. */
+static BOOL disable_deltas_p(void)
+{
+ extern int whole_file, no_whole_file;
+ extern int local_server;
+ extern int write_batch;
+
+ assert(whole_file == 0 || whole_file == 1);
+
+ /* OK, we don't explicitly handle both whole_file and
+ * no_whole_file; perhaps somebody will care to add an
+ * error. */
+
+ if (whole_file)
+ return True;
+ else if (no_whole_file)
+ return False;
+ else if (write_batch)
+ return False;
+ else
+ return local_server;
+}
+
+
/*
generate a stream of signatures/checksums that describe a buffer
return;
}
- assert(whole_file == 0 || whole_file == 1);
- /* We should have decided by now. */
- if (whole_file) {
+ if (disable_deltas_p()) {
write_int(f_out,i);
send_sums(NULL,f_out);
return;
p = find_colon(argv[argc-1]);
if (!p) {
local_server = 1;
- /*
- * disable "rsync algorithm" when both sides local,
- * except when creating a batch update
- */
- if (!write_batch && whole_file == -1)
- whole_file = 1;
} else if (p[1] == ':') {
*p = 0;
return start_socket_client(argv[argc-1], p+2, argc-1, argv);
* because there it's no cheaper to read the whole basis file than to
* just rewrite it.
*
- * -1 means "unspecified", i.e. depend on is_local; 0 means off; 1 means on.
+ * If both are 0, then look at whether we're local or remote and go by
+ * that.
**/
-int whole_file = -1;
+int whole_file = 0;
+int no_whole_file = 0;
int copy_links = 0;
int preserve_links = 0;
{"links", 'l', POPT_ARG_NONE, &preserve_links},
{"copy-links", 'L', POPT_ARG_NONE, ©_links},
{"whole-file", 'W', POPT_ARG_NONE, &whole_file},
- {"no-whole-file", 0, POPT_ARG_NONE, 0, OPT_NO_WHOLE_FILE},
+ {"no-whole-file", 0, POPT_ARG_NONE, &no_whole_file},
{"copy-unsafe-links", 0, POPT_ARG_NONE, ©_unsafe_links},
{"perms", 'p', POPT_ARG_NONE, &preserve_perms},
{"owner", 'o', POPT_ARG_NONE, &preserve_uid},
add_exclude_file(poptGetOptArg(pc), 1, 1);
break;
- case OPT_NO_WHOLE_FILE:
- whole_file = 0;
- break;
-
case OPT_NO_BLOCKING_IO:
blocking_io = 0;
break;
int i, x;
- if (whole_file == -1)
- whole_file = 0;
if (blocking_io == -1)
blocking_io = 0;
assert(whole_file == 0 || whole_file == -1);
if (whole_file)
argstr[x++] = 'W';
+ /* We don't need to send --no-whole-file, because it's the
+ * default for remote transfers, and in any case old versions
+ * of rsync will not understand it. */
if (preserve_hard_links)
argstr[x++] = 'H';