Updated to current cvs without the --exclude-from - patch.
This patch allows specifying a --link-dest path similar to
--compare-dest except that unchanged files are hard-linked to the
--link-dest path instead of producing a sparse tree.
--
________________________________________________________________
J.W. Schultz Pegasystems Technologies
email address: jw@pegasys.ws
Remember Cernan and Schmitt
-------------- next part --------------
Index: generator.c
==================================================================RCS file:
/cvsroot/rsync/generator.c,v
retrieving revision 1.44
diff -u -r1.44 generator.c
--- generator.c 31 Jul 2002 21:20:07 -0000 1.44
+++ generator.c 3 Aug 2002 00:08:47 -0000
@@ -41,6 +41,7 @@
extern int always_checksum;
extern int modify_window;
extern char *compare_dest;
+extern int link_dest;
/* choose whether to skip a particular file */
@@ -50,6 +51,15 @@
if (st->st_size != file->length) {
return 0;
}
+ if (link_dest) {
+ if((st->st_mode & ~_S_IFMT) != (file->mode & ~_S_IFMT)) {
+ return 0;
+ }
+ if (st->st_uid != file->uid || st->st_gid != file->gid) {
+ return 0;
+ }
+ }
+
/* if always checksum is set then we use the checksum instead
of the file time to determine whether to sync */
@@ -356,6 +366,18 @@
statret = -1;
if (statret == -1)
errno = saveerrno;
+#if HAVE_LINK
+ else if (link_dest && !dry_run) {
+ if (do_link(fnamecmpbuf, fname) != 0) {
+ if (verbose > 0)
+ rprintf(FINFO,"link %s => %s : %s\n",
+ fnamecmpbuf,
+ fname,
+ strerror(errno));
+ }
+ fnamecmp = fnamecmpbuf;
+ }
+#endif
else
fnamecmp = fnamecmpbuf;
}
Index: options.c
==================================================================RCS file:
/cvsroot/rsync/options.c,v
retrieving revision 1.97
diff -u -r1.97 options.c
--- options.c 1 Aug 2002 17:55:11 -0000 1.97
+++ options.c 3 Aug 2002 00:08:47 -0000
@@ -115,6 +115,7 @@
char *rsync_path = RSYNC_PATH;
char *backup_dir = NULL;
int rsync_port = RSYNC_PORT;
+int link_dest = 0;
int verbose = 0;
int quiet = 0;
@@ -289,7 +290,7 @@
OPT_EXCLUDE_FROM, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS,
OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
- OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST,
+ OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LINK_DEST,
OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_BLOCKING_IO,
@@ -348,6 +349,7 @@
{"timeout", 0, POPT_ARG_INT, &io_timeout , 0, 0, 0
},
{"temp-dir", 'T', POPT_ARG_STRING, &tmpdir , 0,
0, 0 },
{"compare-dest", 0, POPT_ARG_STRING, &compare_dest , 0, 0,
0 },
+ {"link-dest", 0, POPT_ARG_STRING, 0,
OPT_LINK_DEST, 0, 0 },
/* TODO: Should this take an optional int giving the compression level? */
{"compress", 'z', POPT_ARG_NONE,
&do_compression , 0, 0, 0 },
{"daemon", 0, POPT_ARG_NONE, &am_daemon , 0, 0, 0
},
@@ -591,6 +593,19 @@
/* popt stores the filename in batch_prefix for us */
read_batch = 1;
break;
+ case OPT_LINK_DEST:
+#if HAVE_LINK
+ compare_dest = poptGetOptArg(pc);
+ link_dest = 1;
+ break;
+#else
+ snprintf(err_buf,sizeof(err_buf),
+ "hard links are not supported on this
%s\n",
+ am_server ? "server" : "client");
+ rprintf(FERROR,"ERROR: hard links not supported on this
platform\n");
+ return 0;
+#endif
+
default:
/* FIXME: If --daemon is specified, then errors for
later
@@ -827,7 +842,7 @@
* and it may be an older version that doesn't know this
* option, so don't send it if client is the sender.
*/
- args[ac++] = "--compare-dest";
+ args[ac++] = link_dest ? "--link-dest" :
"--compare-dest";
args[ac++] = compare_dest;
}
Index: rsync.yo
==================================================================RCS file:
/cvsroot/rsync/rsync.yo,v
retrieving revision 1.105
diff -u -r1.105 rsync.yo
--- rsync.yo 1 Aug 2002 17:55:40 -0000 1.105
+++ rsync.yo 3 Aug 2002 00:08:49 -0000
@@ -324,6 +324,7 @@
--modify-window=NUM Timestamp window (seconds) for file match
(default=0)
-T --temp-dir=DIR create temporary files in directory DIR
--compare-dest=DIR also compare destination files relative to DIR
+ --link-dest=DIR create hardlinks to DIR for unchanged files
-P equivalent to --partial --progress
-z, --compress compress file data
--exclude=PATTERN exclude files matching PATTERN
@@ -681,6 +682,11 @@
--partial because partially transferred files will remain in the new
temporary destination until they have a chance to be completed. If DIR is
a relative path, it is relative to the destination directory.
+
+dit(bf(--link-dest=DIR)) This option behaves like \fB--compare-dest\fP but
+also will create hard links from \fIDIR\fP to the destination directory for
+unchanged files. Files with changed ownership or permissions will not be
+linked.
dit(bf(-z, --compress)) With this option, rsync compresses any data from
the files that it sends to the destination machine. This
I committed this patch too, with similar changes to rsync.yo and rsync.1. - Dave On Fri, Aug 02, 2002 at 05:56:03PM -0700, jw schultz wrote:> Updated to current cvs without the --exclude-from - patch. > This patch allows specifying a --link-dest path similar to > --compare-dest except that unchanged files are hard-linked to the > --link-dest path instead of producing a sparse tree. > > -- > ________________________________________________________________ > J.W. Schultz Pegasystems Technologies > email address: jw@pegasys.ws > > Remember Cernan and Schmitt> Index: generator.c > ==================================================================> RCS file: /cvsroot/rsync/generator.c,v > retrieving revision 1.44 > diff -u -r1.44 generator.c > --- generator.c 31 Jul 2002 21:20:07 -0000 1.44 > +++ generator.c 3 Aug 2002 00:08:47 -0000 > @@ -41,6 +41,7 @@ > extern int always_checksum; > extern int modify_window; > extern char *compare_dest; > +extern int link_dest; > > > /* choose whether to skip a particular file */ > @@ -50,6 +51,15 @@ > if (st->st_size != file->length) { > return 0; > } > + if (link_dest) { > + if((st->st_mode & ~_S_IFMT) != (file->mode & ~_S_IFMT)) { > + return 0; > + } > + if (st->st_uid != file->uid || st->st_gid != file->gid) { > + return 0; > + } > + } > + > > /* if always checksum is set then we use the checksum instead > of the file time to determine whether to sync */ > @@ -356,6 +366,18 @@ > statret = -1; > if (statret == -1) > errno = saveerrno; > +#if HAVE_LINK > + else if (link_dest && !dry_run) { > + if (do_link(fnamecmpbuf, fname) != 0) { > + if (verbose > 0) > + rprintf(FINFO,"link %s => %s : %s\n", > + fnamecmpbuf, > + fname, > + strerror(errno)); > + } > + fnamecmp = fnamecmpbuf; > + } > +#endif > else > fnamecmp = fnamecmpbuf; > } > Index: options.c > ==================================================================> RCS file: /cvsroot/rsync/options.c,v > retrieving revision 1.97 > diff -u -r1.97 options.c > --- options.c 1 Aug 2002 17:55:11 -0000 1.97 > +++ options.c 3 Aug 2002 00:08:47 -0000 > @@ -115,6 +115,7 @@ > char *rsync_path = RSYNC_PATH; > char *backup_dir = NULL; > int rsync_port = RSYNC_PORT; > +int link_dest = 0; > > int verbose = 0; > int quiet = 0; > @@ -289,7 +290,7 @@ > OPT_EXCLUDE_FROM, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS, > OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT, > OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS, > - OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, > + OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LINK_DEST, > OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS, > OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR, > OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_BLOCKING_IO, > @@ -348,6 +349,7 @@ > {"timeout", 0, POPT_ARG_INT, &io_timeout , 0, 0, 0 }, > {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir , 0, 0, 0 }, > {"compare-dest", 0, POPT_ARG_STRING, &compare_dest , 0, 0, 0 }, > + {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 }, > /* TODO: Should this take an optional int giving the compression level? */ > {"compress", 'z', POPT_ARG_NONE, &do_compression , 0, 0, 0 }, > {"daemon", 0, POPT_ARG_NONE, &am_daemon , 0, 0, 0 }, > @@ -591,6 +593,19 @@ > /* popt stores the filename in batch_prefix for us */ > read_batch = 1; > break; > + case OPT_LINK_DEST: > +#if HAVE_LINK > + compare_dest = poptGetOptArg(pc); > + link_dest = 1; > + break; > +#else > + snprintf(err_buf,sizeof(err_buf), > + "hard links are not supported on this %s\n", > + am_server ? "server" : "client"); > + rprintf(FERROR,"ERROR: hard links not supported on this platform\n"); > + return 0; > +#endif > + > > default: > /* FIXME: If --daemon is specified, then errors for later > @@ -827,7 +842,7 @@ > * and it may be an older version that doesn't know this > * option, so don't send it if client is the sender. > */ > - args[ac++] = "--compare-dest"; > + args[ac++] = link_dest ? "--link-dest" : "--compare-dest"; > args[ac++] = compare_dest; > } > > Index: rsync.yo > ==================================================================> RCS file: /cvsroot/rsync/rsync.yo,v > retrieving revision 1.105 > diff -u -r1.105 rsync.yo > --- rsync.yo 1 Aug 2002 17:55:40 -0000 1.105 > +++ rsync.yo 3 Aug 2002 00:08:49 -0000 > @@ -324,6 +324,7 @@ > --modify-window=NUM Timestamp window (seconds) for file match (default=0) > -T --temp-dir=DIR create temporary files in directory DIR > --compare-dest=DIR also compare destination files relative to DIR > + --link-dest=DIR create hardlinks to DIR for unchanged files > -P equivalent to --partial --progress > -z, --compress compress file data > --exclude=PATTERN exclude files matching PATTERN > @@ -681,6 +682,11 @@ > --partial because partially transferred files will remain in the new > temporary destination until they have a chance to be completed. If DIR is > a relative path, it is relative to the destination directory. > + > +dit(bf(--link-dest=DIR)) This option behaves like \fB--compare-dest\fP but > +also will create hard links from \fIDIR\fP to the destination directory for > +unchanged files. Files with changed ownership or permissions will not be > +linked. > > dit(bf(-z, --compress)) With this option, rsync compresses any data from > the files that it sends to the destination machine. This