Browse code

sync: ignore --delete-removed if no source files, bug #155

https://github.com/s3tools/s3cmd/issues/155

If --delete-removed is specified, yet no source files were found, all
files at destination are deleted. This is more likely a user error
than the desired outcome.

This patch adds a check to [sync] for both --delete-removed and no
source files, and refuses to delete on the destination in this case.
The user can specify --force to force deletion if that is really what
is intended.

Matt Domsch authored on 2013/04/23 21:21:24
Showing 2 changed files
... ...
@@ -416,6 +416,9 @@ test_s3cmd("Rename (NoSuchKey)", ['mv', '%s/xyz/etc/logo.png' % pbucket(1), '%s/
416 416
     must_find_re = [ 'ERROR:.*NoSuchKey' ],
417 417
     must_not_find = [ 'File %s/xyz/etc/logo.png moved to %s/xyz/etc2/Logo.PNG' % (pbucket(1), pbucket(1)) ])
418 418
 
419
+## ====== Sync more from S3 (invalid src)
420
+test_s3cmd("Sync more from S3 (invalid src)", ['sync', '--delete-removed', '%s/xyz/DOESNOTEXIST' % pbucket(1), 'testsuite-out'],
421
+    must_not_find = [ "deleted: testsuite-out/logo.png" ])
419 422
 
420 423
 ## ====== Sync more from S3
421 424
 test_s3cmd("Sync more from S3", ['sync', '--delete-removed', '%s/xyz' % pbucket(1), 'testsuite-out'],
... ...
@@ -684,6 +684,10 @@ def cmd_sync_remote2remote(args):
684 684
     if len(copy_pairs) > 0:
685 685
         cfg.delete_after = True
686 686
 
687
+    if cfg.delete_removed and src_count + len(copy_pairs) == 0 and not cfg.force:
688
+        warning(u"delete: cowardly refusing to delete because no source files were found.  Use --force to override.")
689
+        cfg.delete_removed = False
690
+
687 691
     # Delete items in destination that are not in source
688 692
     if cfg.delete_removed and not cfg.delete_after:
689 693
         _do_deletes(s3, dst_list)
... ...
@@ -793,6 +797,10 @@ def cmd_sync_remote2local(args):
793 793
     if len(copy_pairs) > 0:
794 794
         cfg.delete_after = True
795 795
 
796
+    if cfg.delete_removed and remote_count + len(copy_pairs) == 0 and not cfg.force:
797
+        warning(u"delete: cowardly refusing to delete because no source files were found.  Use --force to override.")
798
+        cfg.delete_removed = False
799
+
796 800
     if cfg.delete_removed and not cfg.delete_after:
797 801
         _do_deletes(local_list)
798 802
 
... ...
@@ -1126,6 +1134,10 @@ def cmd_sync_local2remote(args):
1126 1126
         if len(copy_pairs) > 0:
1127 1127
             cfg.delete_after = True
1128 1128
 
1129
+        if cfg.delete_removed and local_count + update_count + copy_count == 0 and not cfg.force:
1130
+            warning(u"delete: cowardly refusing to delete because no source files were found.  Use --force to override.")
1131
+            cfg.delete_removed = False
1132
+
1129 1133
         if cfg.delete_removed and not cfg.delete_after:
1130 1134
             _do_deletes(s3, remote_list)
1131 1135