*/
#include "rsync.h"
+#include "inums.h"
extern int dry_run;
extern int do_xfers;
extern int remove_source_files;
extern int delay_updates;
extern int update_only;
+extern int human_readable;
extern int ignore_existing;
extern int ignore_non_existing;
extern int inplace;
extern int always_checksum;
extern int checksum_len;
extern char *partial_dir;
-extern char *basis_dir[];
extern int compare_dest;
extern int copy_dest;
extern int link_dest;
extern char *backup_dir;
extern char *backup_suffix;
extern int backup_suffix_len;
+extern char *basis_dir[MAX_BASIS_DIRS+1];
extern struct file_list *cur_flist, *first_flist, *dir_flist;
extern struct filter_list_struct daemon_filter_list;
int maybe_ATTRS_REPORT = 0;
static dev_t dev_zero;
-static int deletion_count = 0; /* used to implement --max-delete */
+static int skipped_deletes = 0;
static int deldelay_size = 0, deldelay_cnt = 0;
static char *deldelay_buf = NULL;
static int deldelay_fd = -1;
/* OK: try to delete the directory. */
}
- if (!(flags & DEL_MAKE_ROOM) && max_delete >= 0 && ++deletion_count > max_delete)
+ if (!(flags & DEL_MAKE_ROOM) && max_delete >= 0 && stats.deleted_files >= max_delete) {
+ skipped_deletes++;
return DR_AT_LIMIT;
+ }
if (S_ISDIR(mode)) {
what = "rmdir";
}
if (ok) {
- if (!(flags & DEL_MAKE_ROOM))
+ if (!(flags & DEL_MAKE_ROOM)) {
log_delete(fbuf, mode);
+ stats.deleted_files++;
+ if (S_ISREG(mode)) {
+ /* Nothing more to count */
+ } else if (S_ISDIR(mode))
+ stats.deleted_dirs++;
+#ifdef SUPPORT_LINKS
+ else if (S_ISLNK(mode))
+ stats.deleted_symlinks++;
+#endif
+ else if (IS_DEVICE(mode))
+ stats.deleted_symlinks++;
+ else
+ stats.deleted_specials++;
+ }
ret = DR_SUCCESS;
} else {
if (S_ISDIR(mode) && errno == ENOTEMPTY) {
rsyserr(FERROR, errno, "delete_file: %s(%s) failed",
what, fbuf);
ret = DR_FAILURE;
- } else {
- deletion_count--;
+ } else
ret = DR_SUCCESS;
- }
}
check_ret:
if ((int64)sum->count != l)
sum->count = -1;
- if (sum->count && DEBUG_GTE(CHKSUM, 2)) {
+ if (sum->count && DEBUG_GTE(DELTASUM, 2)) {
rprintf(FINFO,
- "count=%.0f rem=%ld blength=%ld s2length=%d flength=%.0f\n",
- (double)sum->count, (long)sum->remainder, (long)sum->blength,
- sum->s2length, (double)sum->flength);
+ "count=%s rem=%ld blength=%ld s2length=%d flength=%s\n",
+ big_num(sum->count), (long)sum->remainder, (long)sum->blength,
+ sum->s2length, big_num(sum->flength));
}
}
sum1 = get_checksum1(map, n1);
get_checksum2(map, n1, sum2);
- if (DEBUG_GTE(CHKSUM, 3)) {
+ if (DEBUG_GTE(DELTASUM, 3)) {
rprintf(FINFO,
- "chunk[%.0f] offset=%.0f len=%ld sum1=%08lx\n",
- (double)i, (double)offset - n1, (long)n1,
+ "chunk[%s] offset=%s len=%ld sum1=%08lx\n",
+ big_num(i), big_num(offset - n1), (long)n1,
(unsigned long)sum1);
}
write_int(f_out, sum1);
static void list_file_entry(struct file_struct *f)
{
char permbuf[PERMSTRING_SIZE];
- double len;
+ int64 len;
+ int colwidth = human_readable ? 14 : 11;
if (!F_IS_ACTIVE(f)) {
/* this can happen if duplicate names were removed */
#ifdef SUPPORT_LINKS
if (preserve_links && S_ISLNK(f->mode)) {
- rprintf(FINFO, "%s %11.0f %s %s -> %s\n",
- permbuf, len, timestring(f->modtime),
- f_name(f, NULL), F_SYMLINK(f));
+ rprintf(FINFO, "%s %*s %s %s -> %s\n",
+ permbuf, colwidth, comma_num(len),
+ timestring(f->modtime), f_name(f, NULL),
+ F_SYMLINK(f));
} else
#endif
{
- rprintf(FINFO, "%s %11.0f %s %s\n",
- permbuf, len, timestring(f->modtime),
- f_name(f, NULL));
+ rprintf(FINFO, "%s %*s %s %s\n",
+ permbuf, colwidth, comma_num(len),
+ timestring(f->modtime), f_name(f, NULL));
}
}
fnamecmp_type = FNAMECMP_BACKUP;
}
- if (DEBUG_GTE(CHKSUM, 3)) {
- rprintf(FINFO, "gen mapped %s of size %.0f\n",
- fnamecmp, (double)sx.st.st_size);
+ if (DEBUG_GTE(DELTASUM, 3)) {
+ rprintf(FINFO, "gen mapped %s of size %s\n",
+ fnamecmp, big_num(sx.st.st_size));
}
- if (DEBUG_GTE(CHKSUM, 2))
+ if (DEBUG_GTE(DELTASUM, 2))
rprintf(FINFO, "generating and sending sums for %d\n", ndx);
notify_others:
while (1) {
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && (ndx = get_hlink_num()) != -1) {
- flist = flist_for_ndx(ndx);
- assert(flist != NULL);
+ flist = flist_for_ndx(ndx, "check_for_finished_files.1");
file = flist->files[ndx - flist->ndx_start];
assert(file->flags & FLAG_HLINKED);
finish_hard_link(file, f_name(file, fbuf), ndx, NULL, itemizing, code, -1);
ignore_times++;
flist = cur_flist;
- cur_flist = flist_for_ndx(ndx);
+ cur_flist = flist_for_ndx(ndx, "check_for_finished_files.2");
file = cur_flist->files[ndx - cur_flist->ndx_start];
if (solo_file)
}
} while ((cur_flist = cur_flist->next) != NULL);
+ if (read_batch && inc_recurse)
+ write_ndx(f_out, NDX_DONE);
+
if (delete_during)
delete_in_dir(NULL, NULL, &dev_zero);
phase++;
rprintf(FINFO, "generate_files phase=%d\n", phase);
write_ndx(f_out, NDX_DONE);
+ write_del_stats(f_out);
+
/* Reduce round-trip lag-time for a useless delay-updates phase. */
if (protocol_version >= 29 && !delay_updates)
write_ndx(f_out, NDX_DONE);
&& dir_tweaking && (!inc_recurse || delete_during == 2))
touch_up_dirs(dir_flist, -1);
- if (max_delete >= 0 && deletion_count > max_delete) {
- rprintf(FINFO,
+ if (max_delete >= 0 && skipped_deletes) {
+ rprintf(FWARNING,
"Deletions stopped due to --max-delete limit (%d skipped)\n",
- deletion_count - max_delete);
+ skipped_deletes);
io_error |= IOERR_DEL_LIMIT;
}