|
@@ -8,7 +8,7 @@ from ..cache import Cache
|
|
from ..constants import * # NOQA
|
|
from ..constants import * # NOQA
|
|
from ..helpers import format_archive
|
|
from ..helpers import format_archive
|
|
from ..helpers import interval, prune_within, prune_split, PRUNING_PATTERNS
|
|
from ..helpers import interval, prune_within, prune_split, PRUNING_PATTERNS
|
|
-from ..helpers import Manifest
|
|
|
|
|
|
+from ..helpers import Manifest, sig_int
|
|
from ..helpers import log_multi
|
|
from ..helpers import log_multi
|
|
from ..helpers import ProgressIndicatorPercent
|
|
from ..helpers import ProgressIndicatorPercent
|
|
|
|
|
|
@@ -68,12 +68,21 @@ class PruneMixIn:
|
|
to_delete = (set(archives) | checkpoints) - (set(keep) | set(keep_checkpoints))
|
|
to_delete = (set(archives) | checkpoints) - (set(keep) | set(keep_checkpoints))
|
|
stats = Statistics(iec=args.iec)
|
|
stats = Statistics(iec=args.iec)
|
|
with Cache(repository, key, manifest, lock_wait=self.lock_wait, iec=args.iec) as cache:
|
|
with Cache(repository, key, manifest, lock_wait=self.lock_wait, iec=args.iec) as cache:
|
|
|
|
+
|
|
|
|
+ def checkpoint_func():
|
|
|
|
+ manifest.write()
|
|
|
|
+ repository.commit(compact=False, save_space=args.save_space)
|
|
|
|
+ cache.commit()
|
|
|
|
+
|
|
list_logger = logging.getLogger("borg.output.list")
|
|
list_logger = logging.getLogger("borg.output.list")
|
|
# set up counters for the progress display
|
|
# set up counters for the progress display
|
|
to_delete_len = len(to_delete)
|
|
to_delete_len = len(to_delete)
|
|
archives_deleted = 0
|
|
archives_deleted = 0
|
|
|
|
+ uncommitted_deletes = 0
|
|
pi = ProgressIndicatorPercent(total=len(to_delete), msg="Pruning archives %3.0f%%", msgid="prune")
|
|
pi = ProgressIndicatorPercent(total=len(to_delete), msg="Pruning archives %3.0f%%", msgid="prune")
|
|
for archive in archives_checkpoints:
|
|
for archive in archives_checkpoints:
|
|
|
|
+ if sig_int and sig_int.action_done():
|
|
|
|
+ break
|
|
if archive in to_delete:
|
|
if archive in to_delete:
|
|
pi.show()
|
|
pi.show()
|
|
if args.dry_run:
|
|
if args.dry_run:
|
|
@@ -85,6 +94,10 @@ class PruneMixIn:
|
|
repository, key, manifest, archive.name, cache, consider_part_files=args.consider_part_files
|
|
repository, key, manifest, archive.name, cache, consider_part_files=args.consider_part_files
|
|
)
|
|
)
|
|
archive.delete(stats, forced=args.forced)
|
|
archive.delete(stats, forced=args.forced)
|
|
|
|
+ checkpointed = self.maybe_checkpoint(
|
|
|
|
+ checkpoint_func=checkpoint_func, checkpoint_interval=args.checkpoint_interval
|
|
|
|
+ )
|
|
|
|
+ uncommitted_deletes = 0 if checkpointed else (uncommitted_deletes + 1)
|
|
else:
|
|
else:
|
|
if is_checkpoint(archive.name):
|
|
if is_checkpoint(archive.name):
|
|
log_message = "Keeping checkpoint archive:"
|
|
log_message = "Keeping checkpoint archive:"
|
|
@@ -97,10 +110,11 @@ class PruneMixIn:
|
|
"{message:<40} {archive}".format(message=log_message, archive=format_archive(archive))
|
|
"{message:<40} {archive}".format(message=log_message, archive=format_archive(archive))
|
|
)
|
|
)
|
|
pi.finish()
|
|
pi.finish()
|
|
- if to_delete and not args.dry_run:
|
|
|
|
- manifest.write()
|
|
|
|
- repository.commit(compact=False, save_space=args.save_space)
|
|
|
|
- cache.commit()
|
|
|
|
|
|
+ if sig_int:
|
|
|
|
+ # Ctrl-C / SIGINT: do not checkpoint (commit) again, we already have a checkpoint in this case.
|
|
|
|
+ self.print_error("Got Ctrl-C / SIGINT.")
|
|
|
|
+ elif uncommitted_deletes > 0:
|
|
|
|
+ checkpoint_func()
|
|
if args.stats:
|
|
if args.stats:
|
|
log_multi(str(stats), logger=logging.getLogger("borg.output.stats"))
|
|
log_multi(str(stats), logger=logging.getLogger("borg.output.stats"))
|
|
return self.exit_code
|
|
return self.exit_code
|
|
@@ -227,3 +241,12 @@ class PruneMixIn:
|
|
subparser.add_argument(
|
|
subparser.add_argument(
|
|
"--save-space", dest="save_space", action="store_true", help="work slower, but using less space"
|
|
"--save-space", dest="save_space", action="store_true", help="work slower, but using less space"
|
|
)
|
|
)
|
|
|
|
+ subparser.add_argument(
|
|
|
|
+ "-c",
|
|
|
|
+ "--checkpoint-interval",
|
|
|
|
+ metavar="SECONDS",
|
|
|
|
+ dest="checkpoint_interval",
|
|
|
|
+ type=int,
|
|
|
|
+ default=1800,
|
|
|
|
+ help="write checkpoint every SECONDS seconds (Default: 1800)",
|
|
|
|
+ )
|