|
@@ -844,6 +844,26 @@ class Archiver:
|
|
|
if not archive_names:
|
|
|
return self.exit_code
|
|
|
|
|
|
+ if args.forced == 2:
|
|
|
+ deleted = False
|
|
|
+ for i, archive_name in enumerate(archive_names, 1):
|
|
|
+ try:
|
|
|
+ del manifest.archives[archive_name]
|
|
|
+ except KeyError:
|
|
|
+ self.exit_code = EXIT_WARNING
|
|
|
+ logger.warning('Archive {} not found ({}/{}).'.format(archive_name, i, len(archive_names)))
|
|
|
+ else:
|
|
|
+ deleted = True
|
|
|
+ logger.info('Deleted {} ({}/{}).'.format(archive_name, i, len(archive_names)))
|
|
|
+ if deleted:
|
|
|
+ manifest.write()
|
|
|
+ # note: might crash in compact() after committing the repo
|
|
|
+ repository.commit()
|
|
|
+ logger.info('Done. Run "borg check --repair" to clean up the mess.')
|
|
|
+ else:
|
|
|
+ logger.warning('Aborted.')
|
|
|
+ return self.exit_code
|
|
|
+
|
|
|
stats_logger = logging.getLogger('borg.output.stats')
|
|
|
if args.stats:
|
|
|
log_multi(DASHES, STATS_HEADER, logger=stats_logger)
|
|
@@ -861,7 +881,7 @@ class Archiver:
|
|
|
if args.stats:
|
|
|
log_multi(stats.summary.format(label='Deleted data:', stats=stats),
|
|
|
DASHES, logger=stats_logger)
|
|
|
- if not args.forced and self.exit_code:
|
|
|
+ if args.forced == 0 and self.exit_code:
|
|
|
break
|
|
|
if args.stats:
|
|
|
stats_logger.info(str(cache))
|
|
@@ -2450,8 +2470,9 @@ class Archiver:
|
|
|
action='store_true', default=False,
|
|
|
help='delete only the local cache for the given repository')
|
|
|
subparser.add_argument('--force', dest='forced',
|
|
|
- action='store_true', default=False,
|
|
|
- help='force deletion of corrupted archives')
|
|
|
+ action='count', default=0,
|
|
|
+ help='force deletion of corrupted archives, '
|
|
|
+ 'use --force --force in case --force does not work.')
|
|
|
subparser.add_argument('--save-space', dest='save_space', action='store_true',
|
|
|
default=False,
|
|
|
help='work slower, but using less space')
|