Moved two paragraphs.
[rsync/rsync.git] / options.c
index ac087d9..835ed7e 100644 (file)
--- 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 itemize_changes = 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,13 +304,14 @@ 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");
   rprintf(F," -z, --compress              compress file data during the transfer\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");
-  rprintf(F," -F                          same as --filter=': /.rsync-filter'\n");
+  rprintf(F," -F                          same as --filter='dir-merge /.rsync-filter'\n");
   rprintf(F,"                             repeated: --filter='- .rsync-filter'\n");
   rprintf(F,"     --exclude=PATTERN       exclude files matching PATTERN\n");
   rprintf(F,"     --exclude-from=FILE     read exclude patterns from FILE\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," -i, --itemize-changes       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
@@ -385,7 +389,7 @@ static struct poptOption long_options[] = {
   {"keep-dirlinks",   'K', POPT_ARG_NONE,   &keep_dirlinks, 0, 0, 0 },
   {"whole-file",      'W', POPT_ARG_VAL,    &whole_file, 1, 0, 0 },
   {"no-whole-file",    0,  POPT_ARG_VAL,    &whole_file, 0, 0, 0 },
-  {"copy-unsafe-links", 0, POPT_ARG_NONE,   &copy_unsafe_links, 0, 0, 0 },
+  {"copy-unsafe-links",0,  POPT_ARG_NONE,   &copy_unsafe_links, 0, 0, 0 },
   {"perms",           'p', POPT_ARG_NONE,   &preserve_perms, 0, 0, 0 },
   {"owner",           'o', POPT_ARG_NONE,   &preserve_uid, 0, 0, 0 },
   {"group",           'g', POPT_ARG_NONE,   &preserve_gid, 0, 0, 0 },
@@ -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 },
+  {"itemize-changes", 'i', POPT_ARG_NONE,   &itemize_changes, 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 && !itemize_changes) {
                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 (itemize_changes && am_sender)
+               argstr[x++] = 'i';
        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;