If the user specified --relative and a source dir with a trailing
[rsync/rsync.git] / generator.c
index 1cc1905..262ffe2 100644 (file)
@@ -25,6 +25,7 @@
 
 extern int verbose;
 extern int dry_run;
+extern int do_xfers;
 extern int log_format_has_i;
 extern int log_format_has_o_or_i;
 extern int daemon_log_format_has_i;
@@ -248,19 +249,24 @@ static void delete_in_dir(struct file_list *flist, char *fbuf,
        if (link_stat(fbuf, &st, keep_dirlinks) < 0)
                return;
 
-       if (one_file_system && file->flags & FLAG_TOP_DIR)
-               filesystem_dev = st.st_dev;
+       if (one_file_system) {
+               if (file->flags & FLAG_TOP_DIR)
+                       filesystem_dev = st.st_dev;
+               else if (filesystem_dev != st.st_dev)
+                       return;
+       }
 
        dirlist = get_dirlist(fbuf, dlen, 0);
 
        /* If an item in dirlist is not found in flist, delete it
         * from the filesystem. */
        for (i = dirlist->count; i--; ) {
-               if (!dirlist->files[i]->basename)
+               struct file_struct *fp = dirlist->files[i];
+               if (!fp->basename)
                        continue;
-               if (flist_find(flist, dirlist->files[i]) < 0) {
-                       int mode = dirlist->files[i]->mode;
-                       f_name_to(dirlist->files[i], delbuf);
+               if (flist_find(flist, fp) < 0) {
+                       int mode = fp->mode;
+                       f_name_to(fp, delbuf);
                        if (delete_item(delbuf, mode, DEL_FORCE_RECURSE) < 0)
                                break;
                }
@@ -667,7 +673,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
        if (only_existing && statret == -1 && stat_errno == ENOENT) {
                /* we only want to update existing files */
                if (verbose > 1) {
-                       rprintf(FINFO, "not creating new file \"%s\"\n",
+                       rprintf(FINFO, "not creating new %s \"%s\"\n",
+                               S_ISDIR(file->mode) ? "directory" : "file",
                                safe_fname(fname));
                }
                return;
@@ -721,6 +728,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
 
        if (max_size && file->length > max_size) {
                if (verbose > 1) {
+                       if (the_file_list->count == 1)
+                               fname = f_name(file);
                        rprintf(FINFO, "%s is over max-size\n",
                                safe_fname(fname));
                }
@@ -731,6 +740,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
 #ifdef SUPPORT_LINKS
                if (safe_symlinks && unsafe_symlink(file->u.link, fname)) {
                        if (verbose) {
+                               if (the_file_list->count == 1)
+                                       fname = f_name(file);
                                rprintf(FINFO,
                                        "ignoring unsafe symlink %s -> \"%s\"\n",
                                        full_fname(fname),
@@ -823,10 +834,14 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                return;
        }
 
-       if (preserve_hard_links && hard_link_check(file, ndx, HL_CHECK_MASTER))
+       if (preserve_hard_links
+           && hard_link_check(file, ndx, fname, statret, &st,
+                              itemizing, code, HL_CHECK_MASTER))
                return;
 
        if (!S_ISREG(file->mode)) {
+               if (the_file_list->count == 1)
+                       fname = f_name(file);
                rprintf(FINFO, "skipping non-regular file \"%s\"\n",
                        safe_fname(fname));
                return;
@@ -904,12 +919,14 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                                if (hard_link_one(file, ndx, fname, -1, &st,
                                                  fnamecmpbuf, 1,
                                                  itemizing && verbose > 1,
-                                                 code) == 0)
+                                                 code) == 0) {
+                                       if (preserve_hard_links
+                                           && file->link_u.links) {
+                                               hard_link_cluster(file, ndx,
+                                                                 itemizing,
+                                                                 code);
+                                       }
                                        return;
-                               if (verbose) {
-                                       rsyserr(FINFO, errno, "link %s => %s",
-                                               full_fname(fnamecmpbuf),
-                                               safe_fname(fname));
                                }
                                match_level = 2;
                        }
@@ -979,7 +996,9 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
        }
 
        if (statret != 0) {
-               if (preserve_hard_links && hard_link_check(file, ndx, HL_SKIP))
+               if (preserve_hard_links
+                   && hard_link_check(file, ndx, fname, statret, &st,
+                                      itemizing, code, HL_SKIP))
                        return;
                if (stat_errno == ENOENT)
                        goto notify_others;
@@ -1020,7 +1039,7 @@ prepare_to_open:
                statret = 0;
        }
 
-       if (dry_run || read_batch || whole_file)
+       if (!do_xfers || read_batch || whole_file)
                goto notify_others;
 
        if (fuzzy_basis) {
@@ -1037,7 +1056,9 @@ prepare_to_open:
                        full_fname(fnamecmp));
            pretend_missing:
                /* pretend the file didn't exist */
-               if (preserve_hard_links && hard_link_check(file, ndx, HL_SKIP))
+               if (preserve_hard_links
+                   && hard_link_check(file, ndx, fname, statret, &st,
+                                      itemizing, code, HL_SKIP))
                        return;
                statret = real_ret = -1;
                goto notify_others;
@@ -1092,7 +1113,7 @@ notify_others:
                        fuzzy_file ? fuzzy_file->basename : NULL);
        }
 
-       if (dry_run) {
+       if (!do_xfers) {
                if (preserve_hard_links && file->link_u.links)
                        hard_link_cluster(file, ndx, itemizing, code);
                return;
@@ -1142,9 +1163,9 @@ void generate_files(int f_out, struct file_list *flist, char *local_name)
                maybe_PERMS_REPORT = log_format_has_i ? 0 : PERMS_REPORT;
                code = daemon_log_format_has_i ? 0 : FLOG;
        } else if (am_daemon) {
-               itemizing = daemon_log_format_has_i && !dry_run;
+               itemizing = daemon_log_format_has_i && do_xfers;
                maybe_PERMS_REPORT = PERMS_REPORT;
-               code = itemizing || dry_run ? FCLIENT : FINFO;
+               code = itemizing || !do_xfers ? FCLIENT : FINFO;
        } else if (!am_server) {
                itemizing = log_format_has_i;
                maybe_PERMS_REPORT = log_format_has_i ? 0 : PERMS_REPORT;
@@ -1206,7 +1227,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name)
 
                if (allowed_lull && !(i % lull_mod))
                        maybe_send_keepalive();
-               else if (!(i % 50))
+               else if (!(i % 200))
                        maybe_flush_socket();
        }
        recv_generator(NULL, NULL, 0, 0, 0, code, -1);
@@ -1284,7 +1305,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name)
                                       maybe_PERMS_REPORT, code, -1);
                        if (allowed_lull && !(++j % lull_mod))
                                maybe_send_keepalive();
-                       else if (!(j % 50))
+                       else if (!(j % 200))
                                maybe_flush_socket();
                }
        }