#include "rsync.h"
extern int verbose;
-extern int recurse;
extern int delete_after;
extern int csum_length;
extern struct stats stats;
extern int keep_partial;
extern int checksum_seed;
extern int inplace;
+extern int delay_updates;
extern struct filter_list_struct server_filter_list;
* sending side. This is used by --delete-before and --delete-after. */
void delete_files(struct file_list *flist)
{
- char fbuf[MAXPATHLEN];
+ struct file_list *dir_list;
+ char *argv[1], fbuf[MAXPATHLEN];
int j;
+ if (io_error && !(lp_ignore_errors(module_id) || ignore_errors)) {
+ rprintf(FINFO,
+ "IO error encountered - skipping file deletion\n");
+ return;
+ }
+
for (j = 0; j < flist->count; j++) {
if (!(flist->files[j]->flags & FLAG_DEL_START)
|| !S_ISDIR(flist->files[j]->mode))
continue;
- delete_in_dir(flist, f_name_to(flist->files[j], fbuf));
+ argv[0] = f_name_to(flist->files[j], fbuf);
+
+ if (!(dir_list = send_file_list(-1, 1, argv)))
+ continue;
+
+ delete_missing(flist, dir_list, fbuf);
+
+ flist_free(dir_list);
}
}
if (flush_write_file(fd) < 0)
goto report_write_error;
-#ifdef HAVE_FTRUNCATE
+#if HAVE_FTRUNCATE
if (inplace && fd != -1)
ftruncate(fd, offset);
#endif
char fnametmp[MAXPATHLEN];
char *fnamecmp, *partialptr;
char fnamecmpbuf[MAXPATHLEN];
+ uchar *delayed_bits = NULL;
struct file_struct *file;
struct stats initial_stats;
int save_make_backups = make_backups;
flist->hlink_pool = NULL;
}
+ if (delay_updates) {
+ int sz = (flist->count + 7) / 8;
+ if (!(delayed_bits = new_array(uchar, sz)))
+ out_of_memory("recv_files");
+ memset(delayed_bits, 0, sz);
+ }
+
while (1) {
cleanup_disable();
exit_cleanup(RERR_FILEIO);
}
- if (recv_ok || inplace) {
+ if ((recv_ok && !delay_updates) || inplace) {
finish_transfer(fname, fnametmp, file, recv_ok, 1);
if (partialptr != fname && fnamecmp == partialptr) {
do_unlink(partialptr);
&& handle_partial_dir(partialptr, PDIR_CREATE)) {
finish_transfer(partialptr, fnametmp, file, recv_ok,
!partial_dir);
+ if (delay_updates && recv_ok)
+ delayed_bits[i/8] |= 1 << (i % 8);
} else {
partialptr = NULL;
do_unlink(fnametmp);
}
make_backups = save_make_backups;
- if (delete_after && recurse && !local_name && flist->count > 0)
+ if (delay_updates) {
+ for (i = 0; i < flist->count; i++) {
+ struct file_struct *file = flist->files[i];
+ if (!file->basename
+ || !(delayed_bits[i/8] & (1 << (i % 8))))
+ continue;
+ fname = local_name ? local_name : f_name(file);
+ partialptr = partial_dir_fname(fname);
+ if (partialptr) {
+ if (make_backups && !make_backup(fname))
+ continue;
+ if (verbose > 2) {
+ rprintf(FINFO, "renaming %s to %s\n",
+ partialptr, fname);
+ }
+ if (do_rename(partialptr, fname) < 0) {
+ rsyserr(FERROR, errno,
+ "rename failed for %s (from %s)",
+ fname, partialptr);
+ } else {
+ handle_partial_dir(partialptr,
+ PDIR_DELETE);
+ }
+ }
+ }
+ }
+
+ if (delete_after && !local_name && flist->count > 0)
delete_files(flist);
if (verbose > 2)