Fixed a multi-file, no-dir, relative copy, such as:
authorWayne Davison <wayned@samba.org>
Sun, 18 Mar 2007 17:35:39 +0000 (17:35 +0000)
committerWayne Davison <wayned@samba.org>
Sun, 18 Mar 2007 17:35:39 +0000 (17:35 +0000)
  rsync -av lib/*.c /var/tmp/lib

flist.c
testsuite/chown.test

diff --git a/flist.c b/flist.c
index abbc6da..bd0ad00 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -1336,7 +1336,7 @@ void send_extra_file_list(int f, int at_least)
        int64 start_write;
        int future_cnt, save_io_error = io_error;
 
-       if (send_dir_ndx < 0)
+       if (flist_eof)
                return;
 
        /* Keep sending data until we have the requested number of
@@ -1491,18 +1491,6 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                                   && (len == 1 || fbuf[len-2] == '/');
                }
 
-               if (link_stat(fbuf, &st, copy_dirlinks) != 0) {
-                       io_error |= IOERR_GENERAL;
-                       rsyserr(FERROR, errno, "link_stat %s failed",
-                               full_fname(fbuf));
-                       continue;
-               }
-
-               if (S_ISDIR(st.st_mode) && !xfer_dirs) {
-                       rprintf(FINFO, "skipping directory %s\n", fbuf);
-                       continue;
-               }
-
                dir = NULL;
 
                if (!relative_paths) {
@@ -1589,6 +1577,18 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                if (fn != fbuf)
                        memmove(fbuf, fn, len + 1);
 
+               if (link_stat(fbuf, &st, copy_dirlinks) != 0) {
+                       io_error |= IOERR_GENERAL;
+                       rsyserr(FERROR, errno, "link_stat %s failed",
+                               full_fname(fbuf));
+                       continue;
+               }
+
+               if (S_ISDIR(st.st_mode) && !xfer_dirs) {
+                       rprintf(FINFO, "skipping directory %s\n", fbuf);
+                       continue;
+               }
+
                if (implied_dirs && (p=strrchr(fbuf,'/')) && p != fbuf) {
                        /* Send the implied directories at the start of the
                         * source spec, so we get their permissions right. */
@@ -1689,14 +1689,15 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
 
        if (inc_recurse) {
                add_dirs_to_tree(-1, 0, dir_flist->count - 1);
-               if (file_total == 1) {
+               if (send_dir_ndx < 0) {
+                       write_ndx(f, NDX_FLIST_EOF);
+                       flist_eof = 1;
+               }
+               else if (file_total == 1) {
                        /* If we're creating incremental file-lists and there
                         * was just 1 item in the first file-list, send 1 more
                         * file-list to check if this is a 1-file xfer. */
-                       if (send_dir_ndx < 0)
-                               write_ndx(f, NDX_DONE);
-                       else
-                               send_extra_file_list(f, 1);
+                       send_extra_file_list(f, 1);
                }
        }
 
@@ -1805,7 +1806,7 @@ void recv_additional_file_list(int f)
 {
        struct file_list *flist;
        int ndx = read_ndx(f);
-       if (ndx == NDX_DONE) {
+       if (ndx == NDX_FLIST_EOF) {
                flist_eof = 1;
                change_local_filter_dir(NULL, 0, 0);
        } else {
index 1be7d9e..db693a1 100644 (file)
@@ -36,7 +36,9 @@ chown 5001 "$name2" || test_skipped "Can't chown (probably need root)"
 chgrp 5002 "$name1" || test_skipped "Can't chgrp (probably need root)"
 chgrp 5003 "$name2" || test_skipped "Can't chgrp (probably need root)"
 
-checkit "$RSYNC -aHvv \"$fromdir/\" \"$todir/\"" "$fromdir" "$todir"
+# This makes sure that multi-file, non-dir, relative transfers work.
+cd "$fromdir/.."
+checkit "$RSYNC -aHvv from/* to/" "$fromdir" "$todir"
 
 # The script would have aborted on error, so getting here means we've won.
 exit 0