X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/116a4769c130bd5bc801dac3e295a6e2edf46af7..e5e85283a99a834bc495f29598cc3d138d7a9696:/generator.c diff --git a/generator.c b/generator.c index 3834275f..c4e6ba23 100644 --- a/generator.c +++ b/generator.c @@ -125,7 +125,7 @@ static int delete_item(char *fname, int mode, int flags) char *p; if (!S_ISDIR(mode)) { - if (max_delete && ++deletion_count > max_delete) + if (max_delete >= 0 && ++deletion_count > max_delete) return 0; if (make_backups && (backup_dir || !is_backup_file(fname))) ok = make_backup(fname); @@ -146,7 +146,7 @@ static int delete_item(char *fname, int mode, int flags) } zap_dir = flags & DEL_FORCE_RECURSE || force_delete; - if ((max_delete && ++deletion_count > max_delete) + if ((max_delete >= 0 && ++deletion_count > max_delete) || (dry_run && zap_dir)) { ok = 0; errno = ENOTEMPTY; @@ -197,7 +197,7 @@ static int delete_item(char *fname, int mode, int flags) pop_local_filters(save_filters); - if (max_delete && ++deletion_count > max_delete) + if (max_delete >= 0 && ++deletion_count > max_delete) return 0; if (do_rmdir(fname) == 0) { @@ -976,7 +976,6 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, * file of that name and it is *not* a directory, then * we need to delete it. If it doesn't exist, then * (perhaps recursively) create it. */ - int sr; if (statret == 0 && !S_ISDIR(st.st_mode)) { if (delete_item(fname, st.st_mode, del_opts) < 0) return; @@ -986,26 +985,27 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, missing_below = file->dir.depth; dry_run++; } - sr = statret; + real_ret = statret; + real_st = st; if (new_root_dir) { if (*fname == '.' && fname[1] == '\0') - sr = -1; + statret = -1; new_root_dir = 0; } - if (sr != 0 && basis_dir[0] != NULL) { + if (statret != 0 && basis_dir[0] != NULL) { int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st, itemizing, maybe_ATTRS_REPORT, code); if (j == -2) { itemizing = 0; code = FNONE; } else if (j >= 0) - sr = 1; + statret = 1; } if (itemizing && f_out != -1) { - itemize(file, ndx, sr, &st, - sr ? ITEM_LOCAL_CHANGE : 0, 0, NULL); + itemize(file, ndx, statret, &st, + statret ? ITEM_LOCAL_CHANGE : 0, 0, NULL); } - if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) { + if (real_ret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) { if (!relative_paths || errno != ENOENT || create_directory_path(fname) < 0 || (do_mkdir(fname, file->mode) < 0 && errno != EEXIST)) { @@ -1022,12 +1022,14 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, return; } } - if (set_file_attrs(fname, file, statret ? NULL : &st, 0) + if (set_file_attrs(fname, file, real_ret ? NULL : &real_st, 0) && verbose && code != FNONE && f_out != -1) rprintf(code, "%s/\n", fname); + if (real_ret != 0 && one_file_system) + real_st.st_dev = filesystem_dev; if (delete_during && f_out != -1 && !phase && dry_run < 2 && (file->flags & FLAG_DEL_HERE)) - delete_in_dir(the_file_list, fname, file, &st); + delete_in_dir(the_file_list, fname, file, &real_st); return; } @@ -1607,7 +1609,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) } recv_generator(NULL, NULL, 0, 0, 0, code, -1); - if (max_delete > 0 && deletion_count > max_delete) { + if (max_delete >= 0 && deletion_count > max_delete) { rprintf(FINFO, "Deletions stopped due to --max-delete limit (%d skipped)\n", deletion_count - max_delete);