X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/9c71f56a251e0b4edfcb6b3aa1e3bda5f0bdd37b..06a1dbad61f2560b206a9e0c0e4e46b01a063f13:/options.c diff --git a/options.c b/options.c index db1317ac..efba0928 100644 --- a/options.c +++ b/options.c @@ -89,6 +89,7 @@ int copy_unsafe_links = 0; int size_only = 0; int daemon_bwlimit = 0; int bwlimit = 0; +int fuzzy_basis = 0; size_t bwlimit_writemax = 0; int only_existing = 0; int opt_ignore_existing = 0; @@ -104,7 +105,7 @@ long block_size = 0; /* "long" because popt can't set an int32. */ /** Network address family. **/ -#if INET6 +#ifdef INET6 int default_af_hint = 0; /* Any protocol */ #else int default_af_hint = AF_INET; /* Must use IPv4 */ @@ -140,6 +141,7 @@ int basis_dir_cnt = 0; int verbose = 0; int quiet = 0; +int what_has_changed = 0; int always_checksum = 0; int list_only = 0; @@ -170,23 +172,23 @@ static void print_rsync_version(enum logcode f) char const *ipv6 = "no "; STRUCT_STAT *dumstat; -#if HAVE_SOCKETPAIR +#ifdef HAVE_SOCKETPAIR got_socketpair = ""; #endif -#if HAVE_FTRUNCATE +#ifdef HAVE_FTRUNCATE have_inplace = ""; #endif -#if SUPPORT_HARD_LINKS +#ifdef SUPPORT_HARD_LINKS hardlinks = ""; #endif -#if SUPPORT_LINKS +#ifdef SUPPORT_LINKS links = ""; #endif -#if INET6 +#ifdef INET6 ipv6 = ""; #endif @@ -275,7 +277,7 @@ void usage(enum logcode F) rprintf(F," -O, --omit-dir-times omit directories when preserving times\n"); rprintf(F," -S, --sparse handle sparse files efficiently\n"); rprintf(F," -n, --dry-run show what would have been transferred\n"); - rprintf(F," -W, --whole-file copy files whole\n"); + rprintf(F," -W, --whole-file copy files whole (without rsync algorithm)\n"); rprintf(F," --no-whole-file always use incremental rsync algorithm\n"); rprintf(F," -x, --one-file-system don't cross filesystem boundaries\n"); rprintf(F," -B, --block-size=SIZE force a fixed checksum block-size\n"); @@ -302,6 +304,7 @@ void usage(enum logcode F) rprintf(F," --size-only skip files that match in size\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," -y, --fuzzy find similar file for basis if no dest file\n"); 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"); @@ -323,13 +326,14 @@ void usage(enum logcode F) rprintf(F," --stats give some file-transfer stats\n"); rprintf(F," --progress show progress during transfer\n"); rprintf(F," -P same as --partial --progress\n"); + rprintf(F," -w, --what-has-changed output a change summary for all updates\n"); rprintf(F," --log-format=FORMAT log file-transfers using specified format\n"); 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," --write-batch=FILE write a batched update to FILE\n"); rprintf(F," --read-batch=FILE read a batched update from FILE\n"); -#if INET6 +#ifdef INET6 rprintf(F," -4, --ipv4 prefer IPv4\n"); rprintf(F," -6, --ipv6 prefer IPv6\n"); #endif @@ -411,6 +415,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 }, + {"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 }, /* 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 }, @@ -425,6 +430,7 @@ static struct poptOption long_options[] = { {0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 }, {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 }, {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 }, + {"what-has-changed",'w', POPT_ARG_NONE, &what_has_changed, 0, 0, 0 }, {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 }, {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 }, {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 }, @@ -435,7 +441,7 @@ static struct poptOption long_options[] = { {"no-implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 0, 0, 0 }, {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 }, {"checksum-seed", 0, POPT_ARG_INT, &checksum_seed, 0, 0, 0 }, -#if INET6 +#ifdef INET6 {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 }, {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 }, #endif @@ -458,7 +464,7 @@ static void daemon_usage(enum logcode F) rprintf(F," --no-detach do not detach from the parent\n"); rprintf(F," --port=PORT listen on alternate port number\n"); rprintf(F," -v, --verbose increase verbosity\n"); -#if INET6 +#ifdef INET6 rprintf(F," -4, --ipv4 prefer IPv4\n"); rprintf(F," -6, --ipv6 prefer IPv6\n"); #endif @@ -474,7 +480,7 @@ static struct poptOption long_daemon_options[] = { {"bwlimit", 0, POPT_ARG_INT, &daemon_bwlimit, 0, 0, 0 }, {"config", 0, POPT_ARG_STRING, &config_file, 0, 0, 0 }, {"daemon", 0, POPT_ARG_NONE, &daemon_opt, 0, 0, 0 }, -#if INET6 +#ifdef INET6 {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 }, {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 }, #endif @@ -799,7 +805,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain) break; case OPT_LINK_DEST: -#if HAVE_LINK +#ifdef HAVE_LINK link_dest = 1; dest_option = "--link-dest"; goto set_dest_dir; @@ -849,7 +855,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain) if (am_sender < 0) am_sender = 0; -#if !SUPPORT_LINKS +#ifndef SUPPORT_LINKS if (preserve_links && !am_sender) { snprintf(err_buf, sizeof err_buf, "symlinks are not supported on this %s\n", @@ -858,7 +864,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain) } #endif -#if !SUPPORT_HARD_LINKS +#ifndef SUPPORT_HARD_LINKS if (preserve_hard_links) { snprintf(err_buf, sizeof err_buf, "hard links are not supported on this %s\n", @@ -921,7 +927,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain) } if (!files_from) recurse = -1; /* infinite recursion */ -#if SUPPORT_LINKS +#ifdef SUPPORT_LINKS preserve_links = 1; #endif preserve_perms = 1; @@ -1044,7 +1050,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain) return 0; } - if (do_progress && !verbose) { + if (do_progress && !verbose && !what_has_changed) { if (refused_verbose) { create_refuse_error(refused_verbose); return 0; @@ -1064,7 +1070,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain) partial_dir = partialdir_for_delayupdate; if (inplace) { -#if HAVE_FTRUNCATE +#ifdef HAVE_FTRUNCATE if (partial_dir) { snprintf(err_buf, sizeof err_buf, "--inplace cannot be used with --%s\n", @@ -1201,6 +1207,8 @@ void server_options(char **args,int *argc) * default for remote transfers, and in any case old versions * of rsync will not understand it. */ + if (what_has_changed && am_sender) + argstr[x++] = 'w'; if (preserve_hard_links) argstr[x++] = 'H'; if (preserve_uid) @@ -1382,6 +1390,9 @@ void server_options(char **args,int *argc) if (!implied_dirs && !am_sender) args[ac++] = "--no-implied-dirs"; + if (fuzzy_basis && am_sender) + args[ac++] = "--fuzzy"; + *argc = ac; return;