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.
... | ... |
@@ -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 |
|