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

borg delete improvements (fwd port to master)
This commit is contained in:
TW 2018-05-27 16:23:46 +02:00 committed by GitHub
commit ac7fd2cbe9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 34 additions and 22 deletions

View File

@ -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))) msg = 'Would delete: {} ({}/{})' if dry_run else 'Deleted archive: {} ({}/{})'
if deleted: 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') stats = Statistics()
if args.stats:
log_multi(DASHES, STATS_HEADER, logger=stats_logger)
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))) msg = 'Would delete archive: {} ({}/{})' if dry_run else 'Deleting archive: {} ({}/{})'
archive = Archive(repository, key, manifest, archive_name, cache=cache) logger.info(msg.format(archive_name, i, len(archive_names)))
stats = Statistics() if not dry_run:
archive.delete(stats, progress=args.progress, forced=args.forced) 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() if not dry_run:
logger.info("Repository deleted.") repository.destroy()
SecurityManager.destroy(repository) logger.info("Repository deleted.")
Cache.destroy(repository) SecurityManager.destroy(repository)
logger.info("Cache deleted.") 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',