The branch, master has been updated via b55115e Fix --only-write-batch hang with --hard-links. Fixes bug 8565. via f5e2b8f Add a slash-stripping version of rsync in support dir. via 41c5ba6 flist->in_progress is only needed w/inc_recurese. via 0dfd2a6 Make stderr line-buffered w/--msgs2stderr. via 6686b93 Add new --outbuf=N|L|B option. from 9510fa9 Allow --max-size=0 and --min-size=0. Fixes bug 7965.
;a=shortlog;h=master - Log ----------------------------------------------------------------- commit b55115ec6f127f7def2dfcc907bf6e28d775e53c Author: Wayne Davison <way...@samba.org> Date: Sat Jan 28 11:51:28 2012 -0800 Fix --only-write-batch hang with --hard-links. Fixes bug 8565. commit f5e2b8f80308bb390da5656db3bf22774c2f371e Author: Wayne Davison <way...@samba.org> Date: Sat Jan 28 10:39:40 2012 -0800 Add a slash-stripping version of rsync in support dir. commit 41c5ba641fe0e71ba9ebf25c4bb1463b511677ed Author: Wayne Davison <way...@samba.org> Date: Sat Jan 28 10:39:21 2012 -0800 flist->in_progress is only needed w/inc_recurese. commit 0dfd2a64ec7c2ae1cfd9c97ec37b9d17c4c42977 Author: Wayne Davison <way...@samba.org> Date: Sat Jan 28 10:38:31 2012 -0800 Make stderr line-buffered w/--msgs2stderr. commit 6686b93a7ae3ad5732c29f173cd34e97f188975f Author: Wayne Davison <way...@samba.org> Date: Sat Jan 28 10:36:43 2012 -0800 Add new --outbuf=N|L|B option. ----------------------------------------------------------------------- Summary of changes: configure.ac | 2 +- generator.c | 3 ++- hlink.c | 2 +- io.c | 3 ++- options.c | 40 ++++++++++++++++++++++++++++++++++++++++ receiver.c | 2 ++ rsync.yo | 11 +++++++++++ support/rsync-slash-strip | 17 +++++++++++++++++ 8 files changed, 76 insertions(+), 4 deletions(-) create mode 100755 support/rsync-slash-strip Changeset truncated at 500 lines: diff --git a/configure.ac b/configure.ac index 9e6b555..a73fce6 100644 --- a/configure.ac +++ b/configure.ac @@ -601,7 +601,7 @@ AC_CHECK_FUNCS(waitpid wait4 getcwd strdup chown chmod lchmod mknod mkfifo \ setlocale setmode open64 lseek64 mkstemp64 mtrace va_copy __va_copy \ seteuid strerror putenv iconv_open locale_charset nl_langinfo getxattr \ extattr_get_link sigaction sigprocmask setattrlist getgrouplist \ - initgroups utimensat posix_fallocate attropen) + initgroups utimensat posix_fallocate attropen setvbuf) dnl cygwin iconv.h defines iconv_open as libiconv_open if test x"$ac_cv_func_iconv_open" != x"yes"; then diff --git a/generator.c b/generator.c index c44ba3b..973e03b 100644 --- a/generator.c +++ b/generator.c @@ -81,6 +81,7 @@ extern int link_dest; extern int whole_file; extern int list_only; extern int read_batch; +extern int write_batch; extern int safe_symlinks; extern long block_size; /* "long" because popt can't set an int32. */ extern int unsort_ndx; @@ -1813,7 +1814,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, notify_others: if (remove_source_files && !delay_updates && !phase && !dry_run) increment_active_files(ndx, itemizing, code); - if (inc_recurse && !dry_run) + if (inc_recurse && (!dry_run || write_batch < 0)) cur_flist->in_progress++; #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) diff --git a/hlink.c b/hlink.c index 0e61d5a..f192e3a 100644 --- a/hlink.c +++ b/hlink.c @@ -496,7 +496,7 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx, int prev_statret, ndx, prev_ndx = F_HL_PREV(file); if (stp == NULL && prev_ndx >= 0) { - if (link_stat(fname, &st, 0) < 0) { + if (link_stat(fname, &st, 0) < 0 && !dry_run) { rsyserr(FERROR_XFER, errno, "stat %s failed", full_fname(fname)); return; diff --git a/io.c b/io.c index a21d81f..8854898 100644 --- a/io.c +++ b/io.c @@ -1046,7 +1046,8 @@ static void got_flist_entry_status(enum festatus status, int ndx) if (status == FES_NO_SEND) flist_ndx_push(&hlink_list, -2); /* indicates a failure follows */ flist_ndx_push(&hlink_list, ndx); - flist->in_progress++; + if (inc_recurse) + flist->in_progress++; } } #endif diff --git a/options.c b/options.c index 9b701d3..c556617 100644 --- a/options.c +++ b/options.c @@ -303,6 +303,7 @@ static int refused_partial, refused_progress, refused_delete_before; static int refused_delete_during; static int refused_inplace, refused_no_iconv; static BOOL usermap_via_chown, groupmap_via_chown; +static char *outbuf_mode; static char *bwlimit_arg, *max_size_arg, *min_size_arg; static char tmp_partialdir[] = ".~tmp~"; @@ -789,6 +790,9 @@ void usage(enum logcode F) rprintf(F," --password-file=FILE read daemon-access password from FILE\n"); rprintf(F," --list-only list the files instead of copying them\n"); rprintf(F," --bwlimit=RATE limit socket I/O bandwidth\n"); +#ifdef HAVE_SETVBUF + rprintf(F," --outbuf=N|L|B set output buffering to None, Line, or Block\n"); +#endif rprintf(F," --write-batch=FILE write a batched update to FILE\n"); rprintf(F," --only-write-batch=FILE like --write-batch but w/o updating destination\n"); rprintf(F," --read-batch=FILE read a batched update from FILE\n"); @@ -1025,6 +1029,9 @@ static struct poptOption long_options[] = { {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 }, {"blocking-io", 0, POPT_ARG_VAL, &blocking_io, 1, 0, 0 }, {"no-blocking-io", 0, POPT_ARG_VAL, &blocking_io, 0, 0, 0 }, +#ifdef HAVE_SETVBUF + {"outbuf", 0, POPT_ARG_STRING, &outbuf_mode, 0, 0, 0 }, +#endif {"remote-option", 'M', POPT_ARG_STRING, 0, 'M', 0, 0 }, {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 }, {"checksum-seed", 0, POPT_ARG_INT, &checksum_seed, 0, 0, 0 }, @@ -1820,6 +1827,39 @@ int parse_arguments(int *argc_p, const char ***argv_p) exit_cleanup(0); } +#ifdef HAVE_SETVBUF + if (outbuf_mode && !am_server) { + int mode = *(uchar *)outbuf_mode; + if (islower(mode)) + mode = toupper(mode); + fflush(stdout); /* Just in case... */ + switch (mode) { + case 'N': /* None */ + case 'U': /* Unbuffered */ + mode = _IONBF; + break; + case 'L': /* Line */ + mode = _IOLBF; + break; + case 'B': /* Block */ + case 'F': /* Full */ + mode = _IOFBF; + break; + default: + snprintf(err_buf, sizeof err_buf, + "Invalid --outbuf setting -- specify N, L, or B.\n"); + return 0; + } + setvbuf(stdout, (char *)NULL, mode, 0); + } + + if (msgs2stderr) { + /* Make stderr line buffered for better sharing of the stream. */ + fflush(stderr); /* Just in case... */ + setvbuf(stderr, (char *)NULL, _IOLBF, 0); + } +#endif + set_output_verbosity(verbose, DEFAULT_PRIORITY); if (do_stats) { diff --git a/receiver.c b/receiver.c index 3ab893d..ddcb55f 100644 --- a/receiver.c +++ b/receiver.c @@ -681,6 +681,8 @@ int recv_files(int f_in, int f_out, char *local_name) log_item(FCLIENT, file, iflags, NULL); if (!am_server) discard_receive_data(f_in, F_LENGTH(file)); + if (inc_recurse) + send_msg_int(MSG_SUCCESS, ndx); continue; } diff --git a/rsync.yo b/rsync.yo index e18fd2c..a062089 100644 --- a/rsync.yo +++ b/rsync.yo @@ -434,6 +434,7 @@ to the detailed description below for a complete description. verb( --port=PORT specify double-colon alternate port number --sockopts=OPTIONS specify custom TCP options --blocking-io use blocking I/O for the remote shell + --outbuf=N|L|B set out buffering to None, Line, or Block --stats give some file-transfer stats -8, --8-bit-output leave high-bit chars unescaped in output -h, --human-readable output numbers in a human-readable format @@ -564,6 +565,9 @@ messages back to the client side, so if you are doing any daemon-transfer debugging using this option, you should start up a daemon using bf(--no-detach) so that you can see the stderr output on the daemon side. +This option has the side-effect of making stderr output get line-buffered so +that the merging of the output of 3 programs happens in a more readable manner. + dit(bf(-q, --quiet)) This option decreases the amount of information you are given during the transfer, notably suppressing information messages from the remote server. This option is useful when invoking rsync from @@ -2007,6 +2011,13 @@ rsync defaults to using blocking I/O, otherwise it defaults to using non-blocking I/O. (Note that ssh prefers non-blocking I/O.) +dit(bf(--outbuf=MODE)) This sets the output buffering mode. The mode can be +None (aka Unbuffered), Line, or Block (aka Full). You may specify as little +as a single letter for the mode, and use upper or lower case. + +The main use of this option is to change Full buffering to Line buffering +when rsync's output is going to a file or pipe. + dit(bf(-i, --itemize-changes)) Requests a simple itemized list of the changes that are being made to each file, including attribute changes. This is exactly the same as specifying bf(--out-format='%i %n%L'). diff --git a/support/rsync-slash-strip b/support/rsync-slash-strip new file mode 100755 index 0000000..43b82bf --- /dev/null +++ b/support/rsync-slash-strip @@ -0,0 +1,17 @@ +#!/bin/bash +# This script can be used as an rsync command-line filter that strips a single +# trailing slash from each arg. That treats "src/" the same as "src", thus +# you need to use "src/." or "src//" for just the contents of the "src" dir. +# (Note that command-line dir-excludes would need to use "excl//" too.) +# +# To use this, name it something like "rs", put it somewhere in your path, and +# then use "rs" in place of "rsync" when you are typing your copy commands. +args=() +for arg in "${@}"; do + if [[ "$arg" == / ]]; then + args=("${args[@]}" /) + else + args=("${args[@]}" "${arg%/}") + fi +done +exec /usr/bin/rsync "${args[@]}" -- The rsync repository. _______________________________________________ rsync-cvs mailing list rsync-cvs@lists.samba.org https://lists.samba.org/mailman/listinfo/rsync-cvs