Browse Source

Merge pull request #3861 from ThomasWaldmann/delete-dry-run-master

borg delete improvements (fwd port to master)
TW 7 years ago
parent
commit
ac7fd2cbe9
1 changed files with 34 additions and 22 deletions
  1. 34 22
      src/borg/archiver.py

+ 34 - 22
src/borg/archiver.py

@@ -1031,6 +1031,8 @@ class Archiver:
 
 
     def _delete_archives(self, args, repository):
     def _delete_archives(self, args, repository):
         """Delete archives"""
         """Delete archives"""
+        dry_run = args.dry_run
+
         manifest, key = Manifest.load(repository, (Manifest.Operation.DELETE,))
         manifest, key = Manifest.load(repository, (Manifest.Operation.DELETE,))
 
 
         if args.location.archive or args.archives:
         if args.location.archive or args.archives:
@@ -1053,8 +1055,11 @@ class Archiver:
                     logger.warning('Archive {} not found ({}/{}).'.format(archive_name, i, len(archive_names)))
                     logger.warning('Archive {} not found ({}/{}).'.format(archive_name, i, len(archive_names)))
                 else:
                 else:
                     deleted = True
                     deleted = True
-                    logger.info('Deleted {} ({}/{}).'.format(archive_name, i, len(archive_names)))
-            if deleted:
+                    msg = 'Would delete: {} ({}/{})' if dry_run else 'Deleted archive: {} ({}/{})'
+                    logger.info(msg.format(archive_name, i, len(archive_names)))
+            if dry_run:
+                logger.info('Finished dry-run.')
+            elif deleted:
                 manifest.write()
                 manifest.write()
                 # note: might crash in compact() after committing the repo
                 # note: might crash in compact() after committing the repo
                 repository.commit()
                 repository.commit()
@@ -1063,32 +1068,31 @@ class Archiver:
                 logger.warning('Aborted.')
                 logger.warning('Aborted.')
             return self.exit_code
             return self.exit_code
 
 
-        stats_logger = logging.getLogger('borg.output.stats')
-        if args.stats:
-            log_multi(DASHES, STATS_HEADER, logger=stats_logger)
-
+        stats = Statistics()
         with Cache(repository, key, manifest, progress=args.progress, lock_wait=self.lock_wait) as cache:
         with Cache(repository, key, manifest, progress=args.progress, lock_wait=self.lock_wait) as cache:
             for i, archive_name in enumerate(archive_names, 1):
             for i, archive_name in enumerate(archive_names, 1):
-                logger.info('Deleting {} ({}/{}):'.format(archive_name, i, len(archive_names)))
-                archive = Archive(repository, key, manifest, archive_name, cache=cache)
-                stats = Statistics()
-                archive.delete(stats, progress=args.progress, forced=args.forced)
+                msg = 'Would delete archive: {} ({}/{})' if dry_run else 'Deleting archive: {} ({}/{})'
+                logger.info(msg.format(archive_name, i, len(archive_names)))
+                if not dry_run:
+                    Archive(repository, key, manifest, archive_name, cache=cache).delete(
+                        stats, progress=args.progress, forced=args.forced)
+            if not dry_run:
                 manifest.write()
                 manifest.write()
                 repository.commit(save_space=args.save_space)
                 repository.commit(save_space=args.save_space)
                 cache.commit()
                 cache.commit()
-                logger.info("Archive deleted.")
-                if args.stats:
-                    log_multi(stats.summary.format(label='Deleted data:', stats=stats),
-                              DASHES, logger=stats_logger)
-                if args.forced == 0 and self.exit_code:
-                    break
             if args.stats:
             if args.stats:
-                stats_logger.info(str(cache))
+                log_multi(DASHES,
+                          STATS_HEADER,
+                          stats.summary.format(label='Deleted data:', stats=stats),
+                          str(cache),
+                          DASHES, logger=logging.getLogger('borg.output.stats'))
 
 
         return self.exit_code
         return self.exit_code
 
 
     def _delete_repository(self, args, repository):
     def _delete_repository(self, args, repository):
         """Delete a repository"""
         """Delete a repository"""
+        dry_run = args.dry_run
+
         if not args.cache_only:
         if not args.cache_only:
             msg = []
             msg = []
             try:
             try:
@@ -1109,11 +1113,17 @@ class Archiver:
                        retry=False, env_var_override='BORG_DELETE_I_KNOW_WHAT_I_AM_DOING'):
                        retry=False, env_var_override='BORG_DELETE_I_KNOW_WHAT_I_AM_DOING'):
                 self.exit_code = EXIT_ERROR
                 self.exit_code = EXIT_ERROR
                 return self.exit_code
                 return self.exit_code
-            repository.destroy()
-            logger.info("Repository deleted.")
-            SecurityManager.destroy(repository)
-        Cache.destroy(repository)
-        logger.info("Cache deleted.")
+            if not dry_run:
+                repository.destroy()
+                logger.info("Repository deleted.")
+                SecurityManager.destroy(repository)
+            else:
+                logger.info("Would delete repository.")
+        if not dry_run:
+            Cache.destroy(repository)
+            logger.info("Cache deleted.")
+        else:
+            logger.info("Would delete cache.")
         return self.exit_code
         return self.exit_code
 
 
     def do_mount(self, args):
     def do_mount(self, args):
@@ -3195,6 +3205,8 @@ class Archiver:
                                           formatter_class=argparse.RawDescriptionHelpFormatter,
                                           formatter_class=argparse.RawDescriptionHelpFormatter,
                                           help='delete archive')
                                           help='delete archive')
         subparser.set_defaults(func=self.do_delete)
         subparser.set_defaults(func=self.do_delete)
+        subparser.add_argument('-n', '--dry-run', dest='dry_run', action='store_true',
+                               help='do not change repository')
         subparser.add_argument('-s', '--stats', dest='stats', action='store_true',
         subparser.add_argument('-s', '--stats', dest='stats', action='store_true',
                                help='print statistics for the deleted archive')
                                help='print statistics for the deleted archive')
         subparser.add_argument('--cache-only', dest='cache_only', action='store_true',
         subparser.add_argument('--cache-only', dest='cache_only', action='store_true',