From 79f132a15fbace5ee4f352248973ff53a2326961 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Fri, 28 Jan 2005 19:36:25 +0000 Subject: [PATCH] Fixed failing hunks. --- backup-dir-dels.diff | 182 +++++++++++++++++++++---------------------- date-only.diff | 38 ++++----- fname-convert.diff | 40 +++++----- fuzzy.diff | 48 ++++++------ link-by-hash.diff | 58 ++++++++------ links-depth.diff | 32 +++++--- time-limit.diff | 50 ++++++------ 7 files changed, 233 insertions(+), 215 deletions(-) diff --git a/backup-dir-dels.diff b/backup-dir-dels.diff index 0c17fec..be7f3c0 100644 --- a/backup-dir-dels.diff +++ b/backup-dir-dels.diff @@ -1,12 +1,11 @@ This patches creates two new command line options as follows: - --delete-dir - --delete-suffix + --backup-dir-rm + --backup-suffix-rm=SUFFIX -The delete-dir and delete-suffix options give the ability to store -backup of deleted files on the receiver in different directories -or with different suffix than the backup of files that have been -changed but that are still on the source drive. Both commands can -be combined. +The backup-dir-rm and backup-suffix-rm options give the ability to store +backup of removed files on the receiver in different directories or with +different suffix than the backup of files that have been changed but that +are still on the source drive. Both commands can be combined. The default behaviour if one or both of the options are not specified is the previous behaviour, both backups use the same directory or @@ -20,17 +19,17 @@ Marc St-Onge extern int verbose; extern int backup_suffix_len; -+extern int delete_suffix_len; ++extern int backup_suffix_rm_len; extern int backup_dir_len; -+extern int delete_dir_len; ++extern int backup_dir_rm_len; extern unsigned int backup_dir_remainder; -+extern unsigned int delete_dir_remainder; ++extern unsigned int backup_dir_rm_remainder; extern char backup_dir_buf[MAXPATHLEN]; -+extern char delete_dir_buf[MAXPATHLEN]; ++extern char backup_dir_rm_buf[MAXPATHLEN]; extern char *backup_suffix; -+extern char *delete_suffix; ++extern char *backup_suffix_rm; extern char *backup_dir; -+extern char *delete_dir; ++extern char *backup_dir_rm; extern int am_root; extern int preserve_devices; @@ -49,14 +48,14 @@ Marc St-Onge +static char *get_delete_name(char *fname) +{ -+ if (delete_dir) { -+ if (stringjoin(delete_dir_buf + delete_dir_len, delete_dir_remainder, -+ fname, delete_suffix, NULL) < delete_dir_remainder) -+ return delete_dir_buf; ++ if (backup_dir_rm) { ++ if (stringjoin(backup_dir_rm_buf + backup_dir_rm_len, backup_dir_rm_remainder, ++ fname, backup_suffix_rm, NULL) < backup_dir_rm_remainder) ++ return backup_dir_rm_buf; + } else { -+ if (stringjoin(delete_dir_buf, MAXPATHLEN, -+ fname, delete_suffix, NULL) < MAXPATHLEN) -+ return delete_dir_buf; ++ if (stringjoin(backup_dir_rm_buf, MAXPATHLEN, ++ fname, backup_suffix_rm, NULL) < MAXPATHLEN) ++ return backup_dir_rm_buf; + } + + rprintf(FERROR, "delete filename too long\n"); @@ -77,7 +76,7 @@ Marc St-Onge { STRUCT_STAT st; - char *rel = fullpath + backup_dir_len; -+ int dir_len = deleting ? delete_dir_len : backup_dir_len; ++ int dir_len = deleting ? backup_dir_rm_len : backup_dir_len; + char *rel = fullpath + dir_len; char *end = rel + strlen(rel); char *p = end; @@ -97,7 +96,7 @@ Marc St-Onge return make_simple_backup(fname); } + -+/* backup switch routine called only when backing-up deleted file */ ++/* backup switch routine called only when backing-up removed file */ +int safe_delete(char *fname) +{ + int ret; @@ -106,14 +105,14 @@ Marc St-Onge + deleting = 0; + return ret; +} ---- orig/flist.c 2005-01-25 12:14:14 +--- orig/flist.c 2005-01-28 19:08:20 +++ flist.c 2005-01-24 02:21:33 @@ -47,6 +47,8 @@ extern char curr_dir[MAXPATHLEN]; extern unsigned int curr_dir_len; extern char *backup_dir; extern char *backup_suffix; -+extern char *delete_dir; -+extern char *delete_suffix; ++extern char *backup_dir_rm; ++extern char *backup_suffix_rm; extern int filesfrom_fd; extern int one_file_system; @@ -121,11 +120,11 @@ Marc St-Onge extern int implied_dirs; extern int make_backups; extern int backup_suffix_len; -+extern int delete_suffix_len; ++extern int backup_suffix_rm_len; extern int copy_links; extern int copy_unsafe_links; extern int protocol_version; -@@ -1659,10 +1662,14 @@ char *f_name(struct file_struct *f) +@@ -1674,10 +1677,14 @@ char *f_name(struct file_struct *f) return f_name_to(f, names[n]); } @@ -136,18 +135,18 @@ Marc St-Onge - return k > 0 && strcmp(fn+k, backup_suffix) == 0; + if (k > 0 && strcmp(fn+k, backup_suffix) == 0) + return 1; -+ k += backup_suffix_len - delete_suffix_len; -+ return k > 0 && strcmp(fn+k, delete_suffix) == 0; ++ k += backup_suffix_len - backup_suffix_rm_len; ++ return k > 0 && strcmp(fn+k, backup_suffix_rm) == 0; } void delete_in_dir(struct file_list *flist, char *fname) -@@ -1716,11 +1723,12 @@ void delete_in_dir(struct file_list *fli +@@ -1731,11 +1738,12 @@ void delete_in_dir(struct file_list *fli || (delete_during && S_ISDIR(mode) && !S_ISDIR(flist->files[j]->mode))) { char *f = f_name(del_flist->files[i]); - if (make_backups && (backup_dir || !is_backup_file(f)) + int backup_file = is_backup_file(f); -+ if (make_backups && (delete_dir || !backup_file) ++ if (make_backups && (backup_dir_rm || !backup_file) && !S_ISDIR(mode)) { - make_backup(f); + safe_delete(f); @@ -157,20 +156,20 @@ Marc St-Onge safe_fname(f)); } } else { ---- orig/options.c 2005-01-25 12:14:14 -+++ options.c 2004-11-27 18:37:18 +--- orig/options.c 2005-01-28 19:08:20 ++++ options.c 2005-01-28 19:17:35 @@ -119,10 +119,14 @@ int no_detach = 0; int write_batch = 0; int read_batch = 0; int backup_dir_len = 0; -+int delete_dir_len = 0; ++int backup_dir_rm_len = 0; int backup_suffix_len; -+int delete_suffix_len; ++int backup_suffix_rm_len; unsigned int backup_dir_remainder; -+unsigned int delete_dir_remainder; ++unsigned int backup_dir_rm_remainder; char *backup_suffix = NULL; -+char *delete_suffix = NULL; ++char *backup_suffix_rm = NULL; char *tmpdir = NULL; char *partial_dir = NULL; char *basis_dir[MAX_BASIS_DIRS+1]; @@ -178,129 +177,128 @@ Marc St-Onge char *password_file = NULL; char *rsync_path = RSYNC_PATH; char *backup_dir = NULL; -+char *delete_dir = NULL; ++char *backup_dir_rm = NULL; char backup_dir_buf[MAXPATHLEN]; -+char delete_dir_buf[MAXPATHLEN]; ++char backup_dir_rm_buf[MAXPATHLEN]; int rsync_port = 0; int compare_dest = 0; int copy_dest = 0; -@@ -251,7 +257,9 @@ void usage(enum logcode F) - rprintf(F," --no-implied-dirs don't send implied dirs with -R\n"); +@@ -256,6 +262,8 @@ void usage(enum logcode F) rprintf(F," -b, --backup make backups (see --suffix & --backup-dir)\n"); - rprintf(F," --backup-dir make backups into this directory\n"); -+ rprintf(F," --delete-dir make backups of deleted files into this directory\n"); - rprintf(F," --suffix=SUFFIX backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX); -+ rprintf(F," --delete-suffix=SUFFIX deleted files suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX); - rprintf(F," -u, --update update only (don't overwrite newer files)\n"); + rprintf(F," --backup-dir=DIR make backups into hierarchy based in DIR\n"); + rprintf(F," --suffix=SUFFIX set backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX); ++ rprintf(F," --backup-dir-rm make backups of removed files into current dir\n"); ++ rprintf(F," --backup-suffix-rm=SUF set removed-files suffix (defaults to --suffix)\n"); + rprintf(F," -u, --update skip files that are newer on the receiver\n"); rprintf(F," --inplace update destination files in-place (SEE MAN PAGE)\n"); rprintf(F," -d, --dirs transfer directories without recursing\n"); -@@ -342,6 +350,7 @@ static struct poptOption long_options[] +@@ -348,6 +356,7 @@ static struct poptOption long_options[] /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0}, {"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 }, -+ {"delete-suffix", 0, POPT_ARG_STRING, &delete_suffix, 0, 0, 0 }, ++ {"backup-suffix-rm", 0, POPT_ARG_STRING, &backup_suffix_rm, 0, 0, 0 }, {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 }, {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 }, {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 }, -@@ -416,6 +425,7 @@ static struct poptOption long_options[] +@@ -424,6 +433,7 @@ static struct poptOption long_options[] {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 }, {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 }, {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 }, -+ {"delete-dir", 0, POPT_ARG_STRING, &delete_dir, 0, 0, 0 }, ++ {"backup-dir-rm", 0, POPT_ARG_STRING, &backup_dir_rm, 0, 0, 0 }, {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 }, {"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 }, {"write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_WRITE_BATCH, 0, 0 }, -@@ -918,6 +928,8 @@ int parse_arguments(int *argc, const cha +@@ -932,6 +942,8 @@ int parse_arguments(int *argc, const cha partial_dir = sanitize_path(NULL, partial_dir, NULL, 0); if (backup_dir) backup_dir = sanitize_path(NULL, backup_dir, NULL, 0); -+ if (delete_dir) -+ delete_dir = sanitize_path(NULL, delete_dir, NULL, 0); ++ if (backup_dir_rm) ++ backup_dir_rm = sanitize_path(NULL, backup_dir_rm, NULL, 0); if (files_from) files_from = sanitize_path(NULL, files_from, NULL, 0); } -@@ -944,6 +956,12 @@ int parse_arguments(int *argc, const cha +@@ -958,6 +970,12 @@ int parse_arguments(int *argc, const cha if (check_filter(elp, backup_dir, 1) < 0) goto options_rejected; } -+ /* Clean delete_dir same as for backup_dir */ -+ if (delete_dir) { -+ clean_fname(delete_dir, 1); -+ if (check_exclude(elp, delete_dir, 1) < 0) ++ /* Clean backup_dir_rm same as for backup_dir */ ++ if (backup_dir_rm) { ++ clean_fname(backup_dir_rm, 1); ++ if (check_exclude(elp, backup_dir_rm, 1) < 0) + goto options_rejected; + } } if (server_filter_list.head && files_from) { clean_fname(files_from, 1); -@@ -964,6 +982,16 @@ int parse_arguments(int *argc, const cha +@@ -978,6 +996,16 @@ int parse_arguments(int *argc, const cha backup_suffix); return 0; } -+ /* if deleted_suffix not supplied, default to backup_suffix */ -+ if (!delete_suffix) -+ delete_suffix = delete_dir ? "" : backup_suffix; -+ delete_suffix_len = strlen(delete_suffix); -+ if (strchr(delete_suffix, '/') != NULL) { ++ /* if suffix_rm not supplied, default to backup_suffix */ ++ if (!backup_suffix_rm) ++ backup_suffix_rm = backup_dir_rm ? "" : backup_suffix; ++ backup_suffix_rm_len = strlen(backup_suffix_rm); ++ if (strchr(backup_suffix_rm, '/') != NULL) { + snprintf(err_buf, sizeof err_buf, -+ "--delete-suffix cannot contain slashes: %s\n", -+ delete_suffix); ++ "--backup-suffix-rm cannot contain slashes: %s\n", ++ backup_suffix_rm); + return 0; + } if (backup_dir) { backup_dir_len = strlcpy(backup_dir_buf, backup_dir, sizeof backup_dir_buf); backup_dir_remainder = sizeof backup_dir_buf - backup_dir_len; -@@ -983,6 +1011,31 @@ int parse_arguments(int *argc, const cha +@@ -997,6 +1025,31 @@ int parse_arguments(int *argc, const cha "--suffix cannot be a null string without --backup-dir\n"); return 0; } -+ /* If delete_dir not supplied default to backup_dir if it has been supplied */ -+ if (backup_dir && !delete_dir) { -+ delete_dir = backup_dir; -+ delete_dir_len = backup_dir_len; -+ delete_dir_remainder = backup_dir_remainder; -+ strlcpy(delete_dir_buf, backup_dir_buf, sizeof backup_dir_buf); -+ } else if (delete_dir) { -+ delete_dir_len = strlcpy(delete_dir_buf, delete_dir, sizeof delete_dir_buf); -+ delete_dir_remainder = sizeof delete_dir_buf - delete_dir_len; -+ if (delete_dir_remainder < 32) { ++ /* If backup_dir_rm not supplied default to backup_dir if it has been supplied */ ++ if (backup_dir && !backup_dir_rm) { ++ backup_dir_rm = backup_dir; ++ backup_dir_rm_len = backup_dir_len; ++ backup_dir_rm_remainder = backup_dir_remainder; ++ strlcpy(backup_dir_rm_buf, backup_dir_buf, sizeof backup_dir_buf); ++ } else if (backup_dir_rm) { ++ backup_dir_rm_len = strlcpy(backup_dir_rm_buf, backup_dir_rm, sizeof backup_dir_rm_buf); ++ backup_dir_rm_remainder = sizeof backup_dir_rm_buf - backup_dir_rm_len; ++ if (backup_dir_rm_remainder < 32) { + snprintf(err_buf, sizeof err_buf, -+ "the --delete-dir path is WAY too long.\n"); ++ "the --backup-dir-rm path is WAY too long.\n"); + return 0; + } -+ if (delete_dir_buf[delete_dir_len - 1] != '/') { -+ delete_dir_buf[delete_dir_len++] = '/'; -+ delete_dir_buf[delete_dir_len] = '\0'; ++ if (backup_dir_rm_buf[backup_dir_rm_len - 1] != '/') { ++ backup_dir_rm_buf[backup_dir_rm_len++] = '/'; ++ backup_dir_rm_buf[backup_dir_rm_len] = '\0'; + } + if (verbose > 1 && !am_sender) -+ rprintf(FINFO, "delete_dir is %s\n", delete_dir_buf); -+ } else if (!delete_suffix_len && (!am_server || !am_sender)) { ++ rprintf(FINFO, "backup_dir_rm is %s\n", backup_dir_rm_buf); ++ } else if (!backup_suffix_rm_len && (!am_server || !am_sender)) { + snprintf(err_buf, sizeof err_buf, -+ "--delete-suffix cannot be a null string without --delete-dir\n"); ++ "--backup-suffix-rm cannot be a null string without --backup-dir-rm\n"); + return 0; + } if (do_progress && !verbose) verbose = 1; -@@ -1196,6 +1249,10 @@ void server_options(char **args,int *arg +@@ -1214,6 +1267,10 @@ void server_options(char **args,int *arg args[ac++] = "--backup-dir"; args[ac++] = backup_dir; } -+ if (delete_dir) { -+ args[ac++] = "--delete-dir"; -+ args[ac++] = delete_dir; ++ if (backup_dir_rm) { ++ args[ac++] = "--backup-dir-rm"; ++ args[ac++] = backup_dir_rm; + } /* Only send --suffix if it specifies a non-default value. */ if (strcmp(backup_suffix, backup_dir ? "" : BACKUP_SUFFIX) != 0) { -@@ -1204,7 +1261,13 @@ void server_options(char **args,int *arg +@@ -1222,7 +1279,13 @@ void server_options(char **args,int *arg goto oom; args[ac++] = arg; } - -+ /* Only send --delete-suffix if it specifies a non-default value. */ -+ if (strcmp(delete_suffix, delete_dir ? "" : BACKUP_SUFFIX) != 0) { ++ /* Only send --backup-suffix-rm if it specifies a non-default value. */ ++ if (strcmp(backup_suffix_rm, backup_dir_rm ? "" : BACKUP_SUFFIX) != 0) { + /* We use the following syntax to avoid weirdness with '~'. */ -+ if (asprintf(&arg, "--delete-suffix=%s", delete_suffix) < 0) ++ if (asprintf(&arg, "--backup-suffix-rm=%s", backup_suffix_rm) < 0) + goto oom; + args[ac++] = arg; + } diff --git a/date-only.diff b/date-only.diff index 4d42512..8d6d3f4 100644 --- a/date-only.diff +++ b/date-only.diff @@ -15,7 +15,7 @@ Jeremy Bornstein [Patched update to have context and apply to latest CVS source.] ---- orig/generator.c 2005-01-24 06:20:37 +--- orig/generator.c 2005-01-25 12:14:14 +++ generator.c 2004-11-11 22:15:27 @@ -43,6 +43,7 @@ extern int inplace; extern int make_backups; @@ -34,9 +34,9 @@ Jeremy Bornstein if (st->st_size != file->length) return 0; ---- orig/options.c 2005-01-25 03:26:51 -+++ options.c 2004-11-17 19:41:59 -@@ -89,6 +89,7 @@ int keep_partial = 0; +--- orig/options.c 2005-01-28 19:08:20 ++++ options.c 2005-01-28 19:14:15 +@@ -88,6 +88,7 @@ int keep_partial = 0; int safe_symlinks = 0; int copy_unsafe_links = 0; int size_only = 0; @@ -44,15 +44,15 @@ Jeremy Bornstein int daemon_bwlimit = 0; int bwlimit = 0; size_t bwlimit_writemax = 0; -@@ -292,6 +293,7 @@ void usage(enum logcode F) +@@ -298,6 +299,7 @@ void usage(enum logcode F) rprintf(F," --timeout=TIME set I/O timeout in seconds\n"); - rprintf(F," -I, --ignore-times turn off mod time & file size quick check\n"); - rprintf(F," --size-only ignore mod time for quick check (use size)\n"); -+ rprintf(F," --date-only ignore size for quick check (use mod time)\n"); - rprintf(F," --modify-window=NUM compare mod times with reduced accuracy\n"); + rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n"); + rprintf(F," --size-only skip files that match in size\n"); ++ rprintf(F," --date-only skip files that match in mod-time\n"); + rprintf(F," --modify-window=NUM compare mod-times with reduced accuracy\n"); rprintf(F," -T, --temp-dir=DIR create temporary files in directory DIR\n"); rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n"); -@@ -346,6 +348,7 @@ static struct poptOption long_options[] +@@ -352,6 +354,7 @@ static struct poptOption long_options[] {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 }, {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 }, {"size-only", 0, POPT_ARG_NONE, &size_only, 0, 0, 0 }, @@ -60,7 +60,7 @@ Jeremy Bornstein {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 }, {"one-file-system", 'x', POPT_ARG_NONE, &one_file_system, 0, 0, 0 }, {"existing", 0, POPT_ARG_NONE, &only_existing, 0, 0, 0 }, -@@ -1221,6 +1224,9 @@ void server_options(char **args,int *arg +@@ -1241,6 +1244,9 @@ void server_options(char **args,int *arg if (size_only) args[ac++] = "--size-only"; @@ -70,17 +70,17 @@ Jeremy Bornstein if (modify_window_set) { if (asprintf(&arg, "--modify-window=%d", modify_window) < 0) goto oom; ---- orig/rsync.yo 2005-01-25 03:26:51 -+++ rsync.yo 2004-07-03 20:16:51 -@@ -357,6 +357,7 @@ verb( +--- orig/rsync.yo 2005-01-28 17:12:14 ++++ rsync.yo 2005-01-28 19:14:37 +@@ -360,6 +360,7 @@ verb( --timeout=TIME set I/O timeout in seconds - -I, --ignore-times turn off mod time & file size quick check - --size-only ignore mod time for quick check (use size) -+ --date-only ignore size for quick check (use mod time) - --modify-window=NUM compare mod times with reduced accuracy + -I, --ignore-times don't skip files that match size and time + --size-only skip files that match in size ++ --date-only skip files that match in mod-time + --modify-window=NUM compare mod-times with reduced accuracy -T --temp-dir=DIR create temporary files in directory DIR --compare-dest=DIR also compare received files relative to DIR -@@ -444,6 +445,12 @@ regardless of timestamp. This is useful +@@ -448,6 +449,12 @@ regardless of timestamp. This is useful after using another mirroring system which may not preserve timestamps exactly. diff --git a/fname-convert.diff b/fname-convert.diff index 1fe511c..cc9dccb 100644 --- a/fname-convert.diff +++ b/fname-convert.diff @@ -87,7 +87,7 @@ Note that you'll need to run 'make proto' after applying this patch. #define RERR_SIGNAL 20 /* status returned when sent SIGUSR1, SIGINT */ #define RERR_WAITCHILD 21 /* some error returned by waitpid() */ ---- orig/flist.c 2005-01-25 00:53:58 +--- orig/flist.c 2005-01-28 19:08:20 +++ flist.c 2005-01-21 19:10:03 @@ -69,6 +69,7 @@ extern int delete_excluded; extern int max_delete; @@ -97,7 +97,7 @@ Note that you'll need to run 'make proto' after applying this patch. extern struct filter_list_struct filter_list; extern struct filter_list_struct server_filter_list; -@@ -358,7 +359,10 @@ void send_file_entry(struct file_struct +@@ -356,7 +357,10 @@ void send_file_entry(struct file_struct io_write_phase = "send_file_entry"; @@ -109,7 +109,7 @@ Note that you'll need to run 'make proto' after applying this patch. flags = base_flags; -@@ -574,6 +578,9 @@ void receive_file_entry(struct file_stru +@@ -572,6 +576,9 @@ void receive_file_entry(struct file_stru strlcpy(lastname, thisname, MAXPATHLEN); @@ -120,8 +120,8 @@ Note that you'll need to run 'make proto' after applying this patch. if (sanitize_paths) @@ -1088,6 +1095,9 @@ struct file_list *send_file_list(int f, - start_write = stats.total_written; + gettimeofday(&start_tv, NULL); + if (!am_server) + init_fname_convert(); @@ -129,7 +129,7 @@ Note that you'll need to run 'make proto' after applying this patch. flist = flist_new(f == -1 ? WITHOUT_HLINK : WITH_HLINK, "send_file_list"); -@@ -1278,6 +1288,9 @@ struct file_list *send_file_list(int f, +@@ -1291,6 +1301,9 @@ struct file_list *send_file_list(int f, stats.num_files = flist->count; } @@ -139,7 +139,7 @@ Note that you'll need to run 'make proto' after applying this patch. if (verbose > 3) output_flist(flist, f < 0 ? "delete" : who_am_i()); -@@ -1299,6 +1312,9 @@ struct file_list *recv_file_list(int f) +@@ -1312,6 +1325,9 @@ struct file_list *recv_file_list(int f) start_read = stats.total_read; @@ -149,7 +149,7 @@ Note that you'll need to run 'make proto' after applying this patch. flist = flist_new(WITH_HLINK, "recv_file_list"); received_flist = flist; -@@ -1352,6 +1368,9 @@ struct file_list *recv_file_list(int f) +@@ -1365,6 +1381,9 @@ struct file_list *recv_file_list(int f) io_error |= read_int(f); } @@ -382,7 +382,7 @@ Note that you'll need to run 'make proto' after applying this patch. + if (verbose > 2) + rprintf(FINFO, "Converted filename: %s -> %s\n", src, dest); +} ---- orig/generator.c 2005-01-24 06:20:37 +--- orig/generator.c 2005-01-25 12:14:14 +++ generator.c 2004-07-03 20:18:02 @@ -235,6 +235,12 @@ static void generate_and_send_sums(int f * @@ -397,7 +397,7 @@ Note that you'll need to run 'make proto' after applying this patch. */ static void recv_generator(char *fname, struct file_list *flist, struct file_struct *file, int i, ---- orig/log.c 2004-09-07 19:54:51 +--- orig/log.c 2005-01-28 19:08:20 +++ log.c 2004-07-03 20:18:02 @@ -57,6 +57,7 @@ struct { { RERR_STREAMIO , "error in rsync protocol data stream" }, @@ -407,9 +407,9 @@ Note that you'll need to run 'make proto' after applying this patch. { RERR_SIGNAL , "received SIGUSR1 or SIGINT" }, { RERR_WAITCHILD , "some error returned by waitpid()" }, { RERR_MALLOC , "error allocating core memory buffers" }, ---- orig/main.c 2005-01-24 01:43:10 +--- orig/main.c 2005-01-28 19:08:20 +++ main.c 2004-07-22 00:31:47 -@@ -335,7 +335,7 @@ static pid_t do_cmd(char *cmd, char *mac +@@ -355,7 +355,7 @@ static pid_t do_cmd(char *cmd, char *mac whole_file = 1; ret = local_child(argc, args, f_in, f_out, child_main); } else @@ -418,8 +418,8 @@ Note that you'll need to run 'make proto' after applying this patch. if (dir) free(dir); ---- orig/options.c 2005-01-25 03:26:51 -+++ options.c 2005-01-15 21:28:07 +--- orig/options.c 2005-01-28 19:08:20 ++++ options.c 2005-01-28 19:29:38 @@ -129,6 +129,7 @@ char *basis_dir[MAX_BASIS_DIRS+1]; char *config_file = NULL; char *shell_cmd = NULL; @@ -428,15 +428,15 @@ Note that you'll need to run 'make proto' after applying this patch. char *password_file = NULL; char *rsync_path = RSYNC_PATH; char *backup_dir = NULL; -@@ -298,6 +299,7 @@ void usage(enum logcode F) +@@ -303,6 +304,7 @@ void usage(enum logcode F) + rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n"); rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n"); rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n"); - rprintf(F," -P equivalent to --partial --progress\n"); + rprintf(F," --fname-convert=CMD invoke CMD for filename conversion\n"); rprintf(F," -z, --compress compress file data\n"); - rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n"); + rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n"); rprintf(F," -f, --filter=RULE add a file-filtering RULE\n"); -@@ -401,6 +403,7 @@ static struct poptOption long_options[] +@@ -408,6 +410,7 @@ static struct poptOption long_options[] {"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 }, {"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 }, {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 }, @@ -475,9 +475,9 @@ Note that you'll need to run 'make proto' after applying this patch. if (pid == -1) { rsyserr(FERROR, errno, "fork"); exit_cleanup(RERR_IPC); ---- orig/syscall.c 2005-01-19 20:11:10 +--- orig/syscall.c 2005-01-28 17:12:14 +++ syscall.c 2004-07-02 21:39:00 -@@ -270,3 +270,34 @@ char *d_name(struct dirent *di) +@@ -259,3 +259,34 @@ char *d_name(struct dirent *di) return di->d_name; #endif } @@ -512,7 +512,7 @@ Note that you'll need to run 'make proto' after applying this patch. + + return result; +} ---- orig/util.c 2005-01-20 23:05:34 +--- orig/util.c 2005-01-28 19:08:20 +++ util.c 2004-07-03 20:18:02 @@ -1213,3 +1213,55 @@ void *_realloc_array(void *ptr, unsigned return malloc(size * num); diff --git a/fuzzy.diff b/fuzzy.diff index eb352b4..2aecf46 100644 --- a/fuzzy.diff +++ b/fuzzy.diff @@ -4,9 +4,9 @@ Lightly tested. Be sure to run "make proto" before "make". ---- orig/generator.c 2005-01-23 07:55:40 +--- orig/generator.c 2005-01-25 12:14:14 +++ generator.c 2005-01-19 18:39:15 -@@ -45,6 +45,7 @@ extern int size_only; +@@ -47,6 +47,7 @@ extern int size_only; extern OFF_T max_size; extern int io_timeout; extern int protocol_version; @@ -14,7 +14,7 @@ Be sure to run "make proto" before "make". extern int always_checksum; extern char *partial_dir; extern char *basis_dir[]; -@@ -225,6 +226,88 @@ static void generate_and_send_sums(int f +@@ -227,6 +228,88 @@ static void generate_and_send_sums(int f unmap_file(mapbuf); } @@ -154,7 +154,7 @@ Be sure to run "make proto" before "make". if (dry_run || read_batch) return; ---- orig/main.c 2005-01-23 01:48:52 +--- orig/main.c 2005-01-28 19:08:20 +++ main.c 2005-01-14 18:33:15 @@ -49,6 +49,7 @@ extern int keep_dirlinks; extern int preserve_hard_links; @@ -164,7 +164,7 @@ Be sure to run "make proto" before "make". extern int relative_paths; extern int rsync_port; extern int whole_file; -@@ -465,7 +466,8 @@ static int do_recv(int f_in,int f_out,st +@@ -485,7 +486,8 @@ static int do_recv(int f_in,int f_out,st int pid; int status = 0; int error_pipe[2], name_pipe[2]; @@ -174,8 +174,8 @@ Be sure to run "make proto" before "make". /* The receiving side mustn't obey this, or an existing symlink that * points to an identical file won't be replaced by the referent. */ ---- orig/options.c 2005-01-23 01:53:35 -+++ options.c 2005-01-15 21:08:13 +--- orig/options.c 2005-01-28 19:08:20 ++++ options.c 2005-01-28 19:31:20 @@ -90,6 +90,7 @@ int copy_unsafe_links = 0; int size_only = 0; int daemon_bwlimit = 0; @@ -184,15 +184,15 @@ Be sure to run "make proto" before "make". size_t bwlimit_writemax = 0; int only_existing = 0; int opt_ignore_existing = 0; -@@ -293,6 +294,7 @@ void usage(enum logcode F) +@@ -303,6 +304,7 @@ void usage(enum logcode F) rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n"); rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n"); rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n"); + rprintf(F," --fuzzy find similar file for basis when no dest file\n"); - rprintf(F," -P equivalent to --partial --progress\n"); rprintf(F," -z, --compress compress file data\n"); - rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n"); -@@ -393,6 +395,7 @@ static struct poptOption long_options[] + rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n"); + rprintf(F," -f, --filter=RULE add a file-filtering RULE\n"); +@@ -408,6 +410,7 @@ static struct poptOption long_options[] {"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 }, {"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 }, {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 }, @@ -200,7 +200,7 @@ Be sure to run "make proto" before "make". /* TODO: Should this take an optional int giving the compression level? */ {"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 }, {"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 }, -@@ -1251,6 +1254,9 @@ void server_options(char **args,int *arg +@@ -1315,6 +1318,9 @@ void server_options(char **args,int *arg if (!implied_dirs && !am_sender) args[ac++] = "--no-implied-dirs"; @@ -210,9 +210,9 @@ Be sure to run "make proto" before "make". *argc = ac; return; ---- orig/receiver.c 2005-01-23 07:55:58 +--- orig/receiver.c 2005-01-28 19:08:20 +++ receiver.c 2005-01-15 21:21:02 -@@ -251,6 +251,27 @@ static int receive_data(int f_in, char * +@@ -252,6 +252,27 @@ static int receive_data(int f_in, char * } @@ -240,7 +240,7 @@ Be sure to run "make proto" before "make". static void discard_receive_data(int f_in, OFF_T length) { receive_data(f_in, NULL, -1, 0, NULL, -1, length); -@@ -381,6 +402,10 @@ int recv_files(int f_in, struct file_lis +@@ -390,6 +411,10 @@ int recv_files(int f_in, struct file_lis case FNAMECMP_BACKUP: fnamecmp = get_backup_name(fname); break; @@ -251,9 +251,9 @@ Be sure to run "make proto" before "make". default: if (j >= basis_dir_cnt) { rprintf(FERROR, ---- orig/rsync.h 2005-01-21 00:35:26 +--- orig/rsync.h 2005-01-28 19:08:20 +++ rsync.h 2005-01-19 18:36:47 -@@ -128,6 +128,7 @@ +@@ -130,6 +130,7 @@ #define FNAMECMP_FNAME 0x80 #define FNAMECMP_PARTIAL_DIR 0x81 #define FNAMECMP_BACKUP 0x82 @@ -261,17 +261,17 @@ Be sure to run "make proto" before "make". /* For calling delete_file() */ #define DEL_DIR (1<<0) ---- orig/rsync.yo 2005-01-23 02:57:49 -+++ rsync.yo 2005-01-15 21:48:52 -@@ -360,6 +360,7 @@ verb( +--- orig/rsync.yo 2005-01-28 17:12:14 ++++ rsync.yo 2005-01-28 19:31:36 +@@ -365,6 +365,7 @@ verb( --compare-dest=DIR also compare received files relative to DIR --copy-dest=DIR ... and include copies of unchanged files --link-dest=DIR hardlink to files in DIR when unchanged + --fuzzy find similar file for basis when no dest - -P equivalent to --partial --progress -z, --compress compress file data - -C, --cvs-exclude auto ignore files in the same way CVS does -@@ -896,6 +897,14 @@ Note that rsync versions prior to 2.6.1 + -C, --cvs-exclude auto-ignore files in the same way CVS does + -f, --filter=RULE add a file-filtering RULE +@@ -949,6 +950,14 @@ Note that rsync versions prior to 2.6.1 (or implied by -a). You can work-around this bug by avoiding the -o option when sending to an old rsync. @@ -286,7 +286,7 @@ Be sure to run "make proto" before "make". dit(bf(-z, --compress)) With this option, rsync compresses any data from the files that it sends to the destination machine. This option is useful on slow connections. The compression method used is the ---- orig/util.c 2005-01-20 23:05:34 +--- orig/util.c 2005-01-28 19:08:20 +++ util.c 2005-01-19 17:30:51 @@ -1213,3 +1213,108 @@ void *_realloc_array(void *ptr, unsigned return malloc(size * num); diff --git a/link-by-hash.diff b/link-by-hash.diff index efe3c14..d8bd437 100644 --- a/link-by-hash.diff +++ b/link-by-hash.diff @@ -49,7 +49,7 @@ the file's name. + +extern char *link_by_hash_dir; + -+#ifdef HAVE_LINK ++#if HAVE_LINK + +char* make_hash_name(struct file_struct *file) +{ @@ -365,8 +365,8 @@ the file's name. +} + +#endif ---- orig/options.c 2005-01-25 03:26:51 -+++ options.c 2004-11-27 18:19:42 +--- orig/options.c 2005-01-28 19:08:20 ++++ options.c 2005-01-28 19:32:26 @@ -132,6 +132,7 @@ char *log_format = NULL; char *password_file = NULL; char *rsync_path = RSYNC_PATH; @@ -375,15 +375,15 @@ the file's name. char backup_dir_buf[MAXPATHLEN]; int rsync_port = 0; int compare_dest = 0; -@@ -297,6 +298,7 @@ void usage(enum logcode F) +@@ -303,6 +304,7 @@ void usage(enum logcode F) rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n"); rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n"); rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n"); + rprintf(F," --link-by-hash=DIR create hardlinks by hash to DIR for regular files\n"); - rprintf(F," -P equivalent to --partial --progress\n"); rprintf(F," -z, --compress compress file data\n"); - rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n"); -@@ -335,7 +337,7 @@ void usage(enum logcode F) + rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n"); + rprintf(F," -f, --filter=RULE add a file-filtering RULE\n"); +@@ -341,7 +343,7 @@ void usage(enum logcode F) enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM, OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST, OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, @@ -392,7 +392,7 @@ the file's name. OPT_REFUSED_BASE = 9000}; static struct poptOption long_options[] = { -@@ -401,6 +403,7 @@ static struct poptOption long_options[] +@@ -408,6 +410,7 @@ static struct poptOption long_options[] {"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 }, {"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 }, {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 }, @@ -400,7 +400,7 @@ the file's name. /* TODO: Should this take an optional int giving the compression level? */ {"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 }, {"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 }, -@@ -788,6 +791,21 @@ int parse_arguments(int *argc, const cha +@@ -802,6 +805,21 @@ int parse_arguments(int *argc, const cha basis_dir[basis_dir_cnt++] = (char *)arg; break; @@ -422,7 +422,7 @@ the file's name. default: /* A large opt value means that set_refuse_options() * turned this option off (opt-BASE is its index). */ -@@ -1277,6 +1295,11 @@ void server_options(char **args,int *arg +@@ -1299,6 +1317,11 @@ void server_options(char **args,int *arg } } @@ -434,7 +434,7 @@ the file's name. if (files_from && (!am_sender || remote_filesfrom_file)) { if (remote_filesfrom_file) { args[ac++] = "--files-from"; ---- orig/receiver.c 2005-01-24 01:43:10 +--- orig/receiver.c 2005-01-28 19:08:20 +++ receiver.c 2005-01-15 21:29:13 @@ -36,6 +36,7 @@ extern int preserve_hard_links; extern int preserve_perms; @@ -444,7 +444,7 @@ the file's name. extern char *partial_dir; extern char *basis_dir[]; extern int basis_dir_cnt; -@@ -131,12 +132,13 @@ static int get_tmpname(char *fnametmp, c +@@ -132,12 +133,13 @@ static int get_tmpname(char *fnametmp, c static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, @@ -459,7 +459,7 @@ the file's name. int32 len; OFF_T offset = 0; OFF_T offset2; -@@ -156,6 +158,9 @@ static int receive_data(int f_in, char * +@@ -157,6 +159,9 @@ static int receive_data(int f_in, char * } else mapbuf = NULL; @@ -469,7 +469,7 @@ the file's name. sum_init(checksum_seed); while ((i = recv_token(f_in, &data)) != 0) { -@@ -172,6 +177,8 @@ static int receive_data(int f_in, char * +@@ -173,6 +178,8 @@ static int receive_data(int f_in, char * cleanup_got_literal = 1; sum_update(data, i); @@ -478,7 +478,7 @@ the file's name. if (fd != -1 && write_file(fd,data,i) != i) goto report_write_error; -@@ -198,6 +205,8 @@ static int receive_data(int f_in, char * +@@ -199,6 +206,8 @@ static int receive_data(int f_in, char * see_token(map, len); sum_update(map, len); @@ -487,7 +487,7 @@ the file's name. } if (inplace) { -@@ -238,6 +247,8 @@ static int receive_data(int f_in, char * +@@ -239,6 +248,8 @@ static int receive_data(int f_in, char * } sum_end(file_sum1); @@ -496,7 +496,7 @@ the file's name. if (mapbuf) unmap_file(mapbuf); -@@ -253,7 +264,7 @@ static int receive_data(int f_in, char * +@@ -254,7 +265,7 @@ static int receive_data(int f_in, char * static void discard_receive_data(int f_in, OFF_T length) { @@ -505,11 +505,11 @@ the file's name. } -@@ -486,8 +497,12 @@ int recv_files(int f_in, struct file_lis +@@ -495,8 +506,12 @@ int recv_files(int f_in, struct file_lis rprintf(FINFO, "%s\n", safe_fname(fname)); /* recv file data */ -+#ifdef HAVE_LINK ++#if HAVE_LINK + if (link_by_hash_dir) + file->u.sum = (char*)malloc(MD4_SUM_LENGTH); +#endif @@ -519,7 +519,7 @@ the file's name. log_recv(file, &initial_stats); ---- orig/rsync.c 2005-01-24 00:57:24 +--- orig/rsync.c 2005-01-28 19:08:20 +++ rsync.c 2004-08-13 18:14:34 @@ -35,6 +35,7 @@ extern int force_delete; extern int recurse; @@ -529,12 +529,12 @@ the file's name. extern char *backup_dir; extern int inplace; -@@ -280,7 +281,12 @@ void finish_transfer(char *fname, char * +@@ -281,7 +282,12 @@ void finish_transfer(char *fname, char * /* move tmp file over real file */ if (verbose > 2) rprintf(FINFO, "renaming %s to %s\n", fnametmp, fname); - ret = robust_rename(fnametmp, fname, file->mode & INITACCESSPERMS); -+#ifdef HAVE_LINK ++#if HAVE_LINK + if (link_by_hash_dir) + ret = link_by_hash(fnametmp, fname, file); + else @@ -543,9 +543,9 @@ the file's name. if (ret < 0) { rsyserr(FERROR, errno, "%s %s -> \"%s\"", ret == -2 ? "copy" : "rename", ---- orig/rsync.h 2005-01-25 00:53:58 +--- orig/rsync.h 2005-01-28 19:08:20 +++ rsync.h 2004-07-03 20:20:15 -@@ -545,6 +545,14 @@ struct stats { +@@ -599,6 +599,14 @@ struct stats { int current_file_index; }; @@ -560,3 +560,13 @@ the file's name. /* we need this function because of the silly way in which duplicate entries are handled in the file lists - we can't change this +--- orig/rsync.yo 2005-01-28 17:12:14 ++++ rsync.yo 2005-01-28 19:32:45 +@@ -365,6 +365,7 @@ verb( + --compare-dest=DIR also compare received files relative to DIR + --copy-dest=DIR ... and include copies of unchanged files + --link-dest=DIR hardlink to files in DIR when unchanged ++ --link-by-hash=DIR create hardlinks by hash to DIR for regular files + -z, --compress compress file data + -C, --cvs-exclude auto-ignore files in the same way CVS does + -f, --filter=RULE add a file-filtering RULE diff --git a/links-depth.diff b/links-depth.diff index 64f7b8e..2a7cba6 100644 --- a/links-depth.diff +++ b/links-depth.diff @@ -6,9 +6,9 @@ with the latest codebase, but even in its original form it didn't handle relative symlinks properly, and that has not yet been fixed in this modified version. ---- orig/flist.c 2005-01-24 00:18:21 +--- orig/flist.c 2005-01-28 19:08:20 +++ flist.c 2004-07-16 16:58:04 -@@ -50,6 +50,7 @@ extern int filesfrom_fd; +@@ -52,6 +52,7 @@ extern int filesfrom_fd; extern int one_file_system; extern int keep_dirlinks; extern int preserve_links; @@ -16,7 +16,7 @@ in this modified version. extern int preserve_hard_links; extern int preserve_perms; extern int preserve_devices; -@@ -726,6 +727,30 @@ void receive_file_entry(struct file_stru +@@ -740,6 +741,30 @@ void receive_file_entry(struct file_stru } @@ -47,7 +47,7 @@ in this modified version. /** * Create a file_struct for a named file by reading its stat() * information and performing extensive checks against global -@@ -850,7 +875,13 @@ skip_excludes: +@@ -864,7 +889,13 @@ skip_filters: basename_len = strlen(basename) + 1; /* count the '\0' */ #if SUPPORT_LINKS @@ -62,8 +62,8 @@ in this modified version. #else linkname_len = 0; #endif ---- orig/options.c 2005-01-24 00:18:21 -+++ options.c 2004-07-16 16:12:29 +--- orig/options.c 2005-01-28 19:08:20 ++++ options.c 2005-01-28 19:33:24 @@ -42,6 +42,7 @@ int archive_mode = 0; int keep_dirlinks = 0; int copy_links = 0; @@ -72,15 +72,15 @@ in this modified version. int preserve_hard_links = 0; int preserve_perms = 0; int preserve_devices = 0; -@@ -253,6 +254,7 @@ void usage(enum logcode F) +@@ -260,6 +261,7 @@ void usage(enum logcode F) rprintf(F," --inplace update destination files in-place (SEE MAN PAGE)\n"); rprintf(F," -d, --dirs transfer directories without recursing\n"); rprintf(F," -l, --links copy symlinks as symlinks\n"); + rprintf(F," --links-depth=NUM follow symlinks up to NUM depth\n"); - rprintf(F," -L, --copy-links copy the referent of all symlinks\n"); - rprintf(F," --copy-unsafe-links copy the referent of \"unsafe\" symlinks\n"); - rprintf(F," --safe-links ignore \"unsafe\" symlinks\n"); -@@ -360,6 +362,7 @@ static struct poptOption long_options[] + rprintf(F," -L, --copy-links transform symlink into referent file/dir\n"); + rprintf(F," --copy-unsafe-links only \"unsafe\" symlinks are transformed\n"); + rprintf(F," --safe-links ignore symlinks that point outside the source tree\n"); +@@ -378,6 +380,7 @@ static struct poptOption long_options[] {"inplace", 0, POPT_ARG_NONE, &inplace, 0, 0, 0 }, {"dirs", 'd', POPT_ARG_VAL, &xfer_dirs, 2, 0, 0 }, {"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 }, @@ -88,3 +88,13 @@ in this modified version. {"copy-links", 'L', POPT_ARG_NONE, ©_links, 0, 0, 0 }, {"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 }, {"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 }, +--- orig/rsync.yo 2005-01-28 17:12:14 ++++ rsync.yo 2005-01-28 19:33:40 +@@ -322,6 +322,7 @@ verb( + --inplace update destination files in-place + -d, --dirs transfer directories without recursing + -l, --links copy symlinks as symlinks ++ --links-depth=NUM follow symlinks up to NUM depth + -L, --copy-links transform symlink into referent file/dir + --copy-unsafe-links only "unsafe" symlinks are transformed + --safe-links ignore symlinks that point outside the tree diff --git a/time-limit.diff b/time-limit.diff index a02ece7..149cb50 100644 --- a/time-limit.diff +++ b/time-limit.diff @@ -3,7 +3,7 @@ to be simpler and more efficient by Wayne Davison. Do we need configure support for mktime()? ---- orig/io.c 2005-01-19 20:11:10 +--- orig/io.c 2005-01-28 06:51:59 +++ io.c 2004-07-17 15:28:36 @@ -51,6 +51,7 @@ extern int eol_nulls; extern int csum_length; @@ -41,26 +41,26 @@ Do we need configure support for mktime()? if (!am_server && !am_daemon) { rprintf(FERROR, "io timeout after %d seconds - exiting\n", (int)(t-last_io)); ---- orig/options.c 2005-01-25 03:26:51 -+++ options.c 2005-01-01 21:19:56 -@@ -102,6 +102,7 @@ int blocking_io = -1; - int checksum_seed = 0; +--- orig/options.c 2005-01-28 19:08:20 ++++ options.c 2005-01-28 19:35:23 +@@ -102,6 +102,7 @@ int checksum_seed = 0; int inplace = 0; + int delay_updates = 0; long block_size = 0; /* "long" because popt can't set an int32. */ +time_t stop_at_utime = 0; /** Network address family. **/ -@@ -319,6 +320,8 @@ void usage(enum logcode F) - rprintf(F," --password-file=FILE get password from FILE\n"); +@@ -325,6 +326,8 @@ void usage(enum logcode F) + rprintf(F," --password-file=FILE read password from FILE\n"); rprintf(F," --list-only list the files instead of copying them\n"); - rprintf(F," --bwlimit=KBPS limit I/O bandwidth, KBytes per second\n"); + rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n"); + rprintf(F," --stop-at=y-m-dTh:m Stop rsync at year-month-dayThour:minute\n"); + rprintf(F," --time-limit=MINS Stop rsync after MINS minutes have elapsed\n"); - rprintf(F," --write-batch=FILE write a batch to FILE\n"); - rprintf(F," --read-batch=FILE read a batch from FILE\n"); - #ifdef INET6 -@@ -336,6 +339,7 @@ enum {OPT_VERSION = 1000, OPT_DAEMON, OP + rprintf(F," --write-batch=FILE write a batched update to FILE\n"); + rprintf(F," --read-batch=FILE read a batched update from FILE\n"); + #if INET6 +@@ -342,6 +345,7 @@ enum {OPT_VERSION = 1000, OPT_DAEMON, OP OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST, OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_MAX_SIZE, @@ -68,7 +68,7 @@ Do we need configure support for mktime()? OPT_REFUSED_BASE = 9000}; static struct poptOption long_options[] = { -@@ -415,6 +419,8 @@ static struct poptOption long_options[] +@@ -423,6 +427,8 @@ static struct poptOption long_options[] {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 }, {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 }, {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 }, @@ -77,7 +77,7 @@ Do we need configure support for mktime()? {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 }, {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 }, {"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 }, -@@ -788,6 +794,36 @@ int parse_arguments(int *argc, const cha +@@ -802,6 +808,36 @@ int parse_arguments(int *argc, const cha basis_dir[basis_dir_cnt++] = (char *)arg; break; @@ -114,7 +114,7 @@ Do we need configure support for mktime()? default: /* A large opt value means that set_refuse_options() * turned this option off (opt-BASE is its index). */ -@@ -1192,6 +1228,15 @@ void server_options(char **args,int *arg +@@ -1210,6 +1246,15 @@ void server_options(char **args,int *arg args[ac++] = arg; } @@ -130,18 +130,18 @@ Do we need configure support for mktime()? if (backup_dir) { args[ac++] = "--backup-dir"; args[ac++] = backup_dir; ---- orig/rsync.yo 2005-01-25 03:26:51 -+++ rsync.yo 2004-07-15 02:44:40 -@@ -384,6 +384,8 @@ verb( - --password-file=FILE get password from FILE +--- orig/rsync.yo 2005-01-28 17:12:14 ++++ rsync.yo 2005-01-28 19:35:35 +@@ -387,6 +387,8 @@ verb( + --password-file=FILE read password from FILE --list-only list the files instead of copying them - --bwlimit=KBPS limit I/O bandwidth, KBytes per second + --bwlimit=KBPS limit I/O bandwidth; KBytes per second + --stop-at=y-m-dTh:m Stop rsync at year-month-dayThour:minute + --time-limit=MINS Stop rsync after MINS minutes have elapsed - --write-batch=FILE write a batch to FILE - --read-batch=FILE read a batch from FILE - --checksum-seed=NUM set block/file checksum seed -@@ -1090,6 +1092,19 @@ transfer was too fast, it will wait befo + --write-batch=FILE write a batched update to FILE + --read-batch=FILE read a batched update from FILE + --checksum-seed=NUM set block/file checksum seed (advanced) +@@ -1124,6 +1126,19 @@ transfer was too fast, it will wait befo result is an average transfer rate equaling the specified limit. A value of zero specifies no limit. @@ -161,7 +161,7 @@ Do we need configure support for mktime()? dit(bf(--write-batch=FILE)) Record a file that can later be applied to another identical destination with --read-batch. See the "BATCH MODE" section for details. ---- orig/util.c 2005-01-20 23:05:34 +--- orig/util.c 2005-01-28 19:08:20 +++ util.c 2004-07-03 20:23:22 @@ -126,6 +126,132 @@ void overflow(char *str) exit_cleanup(RERR_MALLOC); -- 2.34.1