Changed a couple log_recv() calls back to log_send().
[rsync/rsync.git] / options.c
index efba092..280df0e 100644 (file)
--- a/options.c
+++ b/options.c
@@ -141,7 +141,10 @@ int basis_dir_cnt = 0;
 
 int verbose = 0;
 int quiet = 0;
-int what_has_changed = 0;
+int itemize_changes = 0;
+int log_before_transfer = 0;
+int log_format_has_i = 0;
+int log_format_has_o_or_i = 0;
 int always_checksum = 0;
 int list_only = 0;
 
@@ -151,8 +154,8 @@ char *batch_name = NULL;
 static int daemon_opt;   /* sets am_daemon after option error-reporting */
 static int F_option_cnt = 0;
 static int modify_window_set;
-static int refused_verbose, refused_delete, refused_archive_part;
-static int refused_partial, refused_progress;
+static int refused_delete, refused_archive_part;
+static int refused_partial, refused_progress, refused_delete_before;
 static char *dest_option = NULL;
 static char *max_size_arg;
 static char partialdir_for_delayupdate[] = ".~tmp~";
@@ -326,7 +329,7 @@ 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," -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");
@@ -389,7 +392,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 },
@@ -430,7 +433,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 },
+  {"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 },
@@ -538,8 +541,7 @@ static void set_refuse_options(char *bp)
                        if (!op->longName && !*shortname)
                                break;
                        if ((op->longName && wildmatch(bp, op->longName))
-                           || (*shortname && wildmatch(bp, shortname))
-                           || op->val == OPT_DAEMON) {
+                           || (*shortname && wildmatch(bp, shortname))) {
                                if (op->argInfo == POPT_ARG_VAL)
                                        op->argInfo = POPT_ARG_NONE;
                                op->val = (op - long_options) + OPT_REFUSED_BASE;
@@ -547,9 +549,6 @@ static void set_refuse_options(char *bp)
                                /* These flags are set to let us easily check
                                 * an implied option later in the code. */
                                switch (*shortname) {
-                               case 'v':
-                                       refused_verbose = op->val;
-                                       break;
                                case 'r': case 'd': case 'l': case 'p':
                                case 't': case 'g': case 'o': case 'D':
                                        refused_archive_part = op->val;
@@ -557,6 +556,8 @@ static void set_refuse_options(char *bp)
                                case '\0':
                                        if (wildmatch("delete", op->longName))
                                                refused_delete = op->val;
+                                       else if (wildmatch("delete-before", op->longName))
+                                               refused_delete_before = op->val;
                                        else if (wildmatch("partial", op->longName))
                                                refused_partial = op->val;
                                        else if (wildmatch("progress", op->longName))
@@ -576,6 +577,17 @@ static void set_refuse_options(char *bp)
                *cp = ' ';
                bp = cp + 1;
        }
+
+       for (op = long_options; ; op++) {
+               *shortname = op->shortName;
+               if (!op->longName && !*shortname)
+                       break;
+               if (op->val == OPT_DAEMON) {
+                       if (op->argInfo == POPT_ARG_VAL)
+                               op->argInfo = POPT_ARG_NONE;
+                       op->val = (op - long_options) + OPT_REFUSED_BASE;
+               }
+       }
 }
 
 
@@ -953,8 +965,13 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                delete_mode = delete_excluded = 0;
        } else if (delete_before || delete_during || delete_after)
                delete_mode = 1;
-       else if (delete_mode || delete_excluded)
+       else if (delete_mode || delete_excluded) {
+               if (refused_delete_before) {
+                       create_refuse_error(refused_delete_before);
+                       return 0;
+               }
                delete_mode = delete_before = 1;
+       }
 
        if (delete_mode && refused_delete) {
                create_refuse_error(refused_delete);
@@ -1050,13 +1067,29 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                return 0;
        }
 
-       if (do_progress && !verbose && !what_has_changed) {
-               if (refused_verbose) {
-                       create_refuse_error(refused_verbose);
-                       return 0;
-               }
+       if (log_format) {
+               if (strstr(log_format, "%i") != NULL)
+                       log_format_has_i = 1;
+               if (strstr(log_format, "%b") == NULL
+                && strstr(log_format, "%c") == NULL)
+                       log_before_transfer = !am_server;
+       } else if (itemize_changes) {
+               log_format = "%i %n%L";
+               log_format_has_i = 1;
+               log_before_transfer = !am_server;
+       }
+
+       if ((do_progress || dry_run) && !verbose && !log_before_transfer
+           && !am_server)
                verbose = 1;
+
+       if (verbose && !log_format) {
+               log_format = "%n%L";
+               log_before_transfer = !am_server;
        }
+       if (log_format_has_i
+           || (log_format && strstr(log_format, "%o") != NULL))
+               log_format_has_o_or_i = 1;
 
        if (daemon_bwlimit && (!bwlimit || bwlimit > daemon_bwlimit))
                bwlimit = daemon_bwlimit;
@@ -1207,8 +1240,6 @@ 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)
@@ -1254,6 +1285,17 @@ void server_options(char **args,int *argc)
        if (list_only > 1)
                args[ac++] = "--list-only";
 
+       /* The server side doesn't use our log-format, but in certain
+        * circumstances they need to know a little about the option. */
+       if (log_format && am_sender) {
+               if (log_format_has_i)
+                       args[ac++] = "--log-format=%i";
+               else if (log_format_has_o_or_i)
+                       args[ac++] = "--log-format=%o";
+               else if (!verbose)
+                       args[ac++] = "--log-format=X";
+       }
+
        if (block_size) {
                if (asprintf(&arg, "-B%lu", block_size) < 0)
                        goto oom;