From c067e8a30a8f4cdd44eb20facbdb315dc64ab31a Mon Sep 17 00:00:00 2001 From: Konstantinos Mousoulis Date: Sun, 25 Jan 2026 13:12:11 +0200 Subject: [PATCH 1/4] Added stats to prune command --- src/borg/archiver.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 797fa41a19..8f81c39df3 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1705,12 +1705,23 @@ def checkpoint_func(): elif uncommitted_deletes > 0: checkpoint_func() if args.stats: + stats_logger = logging.getLogger('borg.output.stats') + stats_logger.info('Archive counts:') + stats_logger.info('Number of archives: %d', len(manifest.archives)) + + if args.glob_archives: + stats_logger.info('Number of archives matching pattern: %d', len(archives_checkpoints)) + + stats_logger.info('Number of archives kept: %d', len(archives_checkpoints) - len(to_delete)) + stats_logger.info('Number of archives pruned: %d', len(to_delete)) + stats_logger.info(' ') + log_multi(DASHES, STATS_HEADER, stats.summary.format(label='Deleted data:', stats=stats), str(cache), DASHES, logger=logging.getLogger('borg.output.stats')) - + @with_repository(fake=('tam', 'check_tam', 'disable_tam', 'archives_tam', 'check_archives_tam'), invert_fake=True, manifest=False, exclusive=True) def do_upgrade(self, args, repository, manifest=None, key=None): """upgrade a repository from a previous version""" From b75609c668968f7a46c2d151922d00218b701497 Mon Sep 17 00:00:00 2001 From: Konmous04 <146933686+Konmous04@users.noreply.github.com> Date: Sat, 31 Jan 2026 14:05:40 +0000 Subject: [PATCH 2/4] Update prune stats output based on review feedback --- src/borg/archiver.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 8f81c39df3..b73da037ec 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1658,6 +1658,14 @@ def do_prune(self, args, repository, manifest, key): keep += prune_split(archives, rule, num, kept_because) to_delete = (set(archives) | checkpoints) - (set(keep) | set(keep_checkpoints)) + stats_logger = logging.getLogger('borg.output.prune') + pruned_checkpoints_len = len([a for a in to_delete if a in checkpoints]) + pruned_archives_len = len(to_delete) - pruned_checkpoints_len + + stats_logger.info('Found %d normal archives and %d checkpoint archives.', + len(archives), len(checkpoints)) + stats_logger.info('Keeping %d archives and %d checkpoints, pruning %d archives and %d checkpoints.', + len(keep), len(keep_checkpoints), pruned_archives_len, pruned_checkpoints_len) stats = Statistics(iec=args.iec) with Cache(repository, key, manifest, lock_wait=self.lock_wait, iec=args.iec) as cache: def checkpoint_func(): @@ -1704,17 +1712,6 @@ def checkpoint_func(): raise Error("Got Ctrl-C / SIGINT.") elif uncommitted_deletes > 0: checkpoint_func() - if args.stats: - stats_logger = logging.getLogger('borg.output.stats') - stats_logger.info('Archive counts:') - stats_logger.info('Number of archives: %d', len(manifest.archives)) - - if args.glob_archives: - stats_logger.info('Number of archives matching pattern: %d', len(archives_checkpoints)) - - stats_logger.info('Number of archives kept: %d', len(archives_checkpoints) - len(to_delete)) - stats_logger.info('Number of archives pruned: %d', len(to_delete)) - stats_logger.info(' ') log_multi(DASHES, STATS_HEADER, From 0f3d537375cfde5278906853e76626b9f36b96df Mon Sep 17 00:00:00 2001 From: Konmous04 <146933686+Konmous04@users.noreply.github.com> Date: Sat, 31 Jan 2026 18:38:26 +0000 Subject: [PATCH 3/4] Refactor: use sets for counts and restore original stats block --- src/borg/archiver.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/borg/archiver.py b/src/borg/archiver.py index b73da037ec..33c804d52f 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1658,14 +1658,13 @@ def do_prune(self, args, repository, manifest, key): keep += prune_split(archives, rule, num, kept_because) to_delete = (set(archives) | checkpoints) - (set(keep) | set(keep_checkpoints)) - stats_logger = logging.getLogger('borg.output.prune') - pruned_checkpoints_len = len([a for a in to_delete if a in checkpoints]) + logger = logging.getLogger('borg.output.prune') + pruned_checkpoints_len = len(set(checkpoints) - set(keep_checkpoints)) pruned_archives_len = len(to_delete) - pruned_checkpoints_len - - stats_logger.info('Found %d normal archives and %d checkpoint archives.', - len(archives), len(checkpoints)) - stats_logger.info('Keeping %d archives and %d checkpoints, pruning %d archives and %d checkpoints.', - len(keep), len(keep_checkpoints), pruned_archives_len, pruned_checkpoints_len) + logger.info('Found %d normal archives and %d checkpoint archives.', + len(archives), len(checkpoints)) + logger.info('Keeping %d archives and %d checkpoints, pruning %d archives and %d checkpoints.', + len(keep), len(keep_checkpoints), pruned_archives_len, pruned_checkpoints_len) stats = Statistics(iec=args.iec) with Cache(repository, key, manifest, lock_wait=self.lock_wait, iec=args.iec) as cache: def checkpoint_func(): @@ -1712,13 +1711,13 @@ def checkpoint_func(): raise Error("Got Ctrl-C / SIGINT.") elif uncommitted_deletes > 0: checkpoint_func() - + if args.stats: log_multi(DASHES, STATS_HEADER, stats.summary.format(label='Deleted data:', stats=stats), str(cache), DASHES, logger=logging.getLogger('borg.output.stats')) - + @with_repository(fake=('tam', 'check_tam', 'disable_tam', 'archives_tam', 'check_archives_tam'), invert_fake=True, manifest=False, exclusive=True) def do_upgrade(self, args, repository, manifest=None, key=None): """upgrade a repository from a previous version""" From 1414631687b89d0c0d8884fdddb0ec57b46f9aa9 Mon Sep 17 00:00:00 2001 From: Konmous04 <146933686+Konmous04@users.noreply.github.com> Date: Sat, 31 Jan 2026 18:59:31 +0000 Subject: [PATCH 4/4] Remove redundant logger definition --- src/borg/archiver.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 33c804d52f..35ea637efb 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1658,7 +1658,6 @@ def do_prune(self, args, repository, manifest, key): keep += prune_split(archives, rule, num, kept_because) to_delete = (set(archives) | checkpoints) - (set(keep) | set(keep_checkpoints)) - logger = logging.getLogger('borg.output.prune') pruned_checkpoints_len = len(set(checkpoints) - set(keep_checkpoints)) pruned_archives_len = len(to_delete) - pruned_checkpoints_len logger.info('Found %d normal archives and %d checkpoint archives.',