added --max-delete option
[rsync/rsync.git] / receiver.c
index 9621578..7cc9a81 100644 (file)
@@ -43,7 +43,6 @@ static struct delete_list {
 } *delete_list;
 static int dlist_len, dlist_alloc_len;
 
-
 /* yuck! This function wouldn't have been necessary if I had the sorting
    algorithm right. Unfortunately fixing the sorting algorithm would introduce
    a backward incompatibility as file list indexes are sent over the link.
@@ -110,6 +109,8 @@ static void delete_files(struct file_list *flist)
        int i, j;
        char *name;
        extern int module_id;
+       extern int max_delete;
+       static int deletion_count;
 
        if (cvs_exclude)
                add_cvs_excludes();
@@ -137,6 +138,7 @@ static void delete_files(struct file_list *flist)
                        rprintf(FINFO,"deleting in %s\n", name);
 
                for (i=local_file_list->count-1;i>=0;i--) {
+                       if (max_delete && deletion_count > max_delete) break;
                        if (!local_file_list->files[i]->basename) continue;
                        if (remote_version < 19 &&
                            S_ISDIR(local_file_list->files[i]->mode))
@@ -148,6 +150,7 @@ static void delete_files(struct file_list *flist)
                                            (strcmp(f+k,backup_suffix) != 0))) {
                                        (void) make_backup(f);
                                } else {
+                                       deletion_count++;
                                        delete_one(local_file_list->files[i]);
                                }
                        }
@@ -304,14 +307,17 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
        int recv_ok;
        extern struct stats stats;              
        extern int preserve_perms;
+       extern int delete_after;
        struct stats initial_stats;
 
        if (verbose > 2) {
                rprintf(FINFO,"recv_files(%d) starting\n",flist->count);
        }
 
-       if (recurse && delete_mode && !local_name && flist->count>0) {
-               delete_files(flist);
+       if (!delete_after) {
+               if (recurse && delete_mode && !local_name && flist->count>0) {
+                       delete_files(flist);
+               }
        }
 
        while (1) {      
@@ -465,7 +471,7 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                finish_transfer(fname, fnametmp, file);
 
                cleanup_disable();
-                               
+
                if (!recv_ok) {
                        if (csum_length == SUM_LENGTH) {
                                rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
@@ -478,6 +484,12 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                }
        }
 
+       if (delete_after) {
+               if (recurse && delete_mode && !local_name && flist->count>0) {
+                       delete_files(flist);
+               }
+       }
+
        if (preserve_hard_links)
                do_hard_links(flist);