X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/98bf61c80ee4f717a5e5adc297e58082393980f1..e76518843d2c0ca595333de6a689afcea7448d94:/options.c diff --git a/options.c b/options.c index 66145eeb..9b260d4e 100644 --- a/options.c +++ b/options.c @@ -141,6 +141,8 @@ int basis_dir_cnt = 0; int verbose = 0; int quiet = 0; +int itemize_changes = 0; +int log_before_transfer = 0; int always_checksum = 0; int list_only = 0; @@ -151,7 +153,7 @@ 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_partial, refused_progress, refused_delete_before; static char *dest_option = NULL; static char *max_size_arg; static char partialdir_for_delayupdate[] = ".~tmp~"; @@ -325,6 +327,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," -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"); @@ -387,7 +390,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, ©_unsafe_links, 0, 0, 0 }, + {"copy-unsafe-links",0, POPT_ARG_NONE, ©_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 }, @@ -428,6 +431,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 }, @@ -554,6 +558,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)) @@ -950,8 +956,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); @@ -1047,7 +1058,17 @@ int parse_arguments(int *argc, const char ***argv, int frommain) return 0; } - if (do_progress && !verbose) { + if (log_format) { + if (strstr(log_format, "%i") != NULL) + itemize_changes = 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_before_transfer = !am_server; + } + if (do_progress && !verbose && !log_before_transfer) { if (refused_verbose) { create_refuse_error(refused_verbose); return 0; @@ -1204,6 +1225,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) + argstr[x++] = 'i'; if (preserve_hard_links) argstr[x++] = 'H'; if (preserve_uid)