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