From aa97724c0cb07cf712f0ae38f6826cd55568c164 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sun, 13 Dec 2015 00:39:15 +0100 Subject: [PATCH] add --prefix to check to check only some specific archives, fixes #206 --- borg/archive.py | 12 +++++++----- borg/archiver.py | 4 +++- borg/testsuite/archiver.py | 2 ++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/borg/archive.py b/borg/archive.py index 011d7845a..390c64ffe 100644 --- a/borg/archive.py +++ b/borg/archive.py @@ -661,9 +661,9 @@ class ArchiveChecker: self.error_found = False self.possibly_superseded = set() - def check(self, repository, repair=False, archive=None, last=None, save_space=False): + def check(self, repository, repair=False, archive=None, last=None, prefix=None, save_space=False): logger.info('Starting archive consistency check...') - self.check_all = archive is None and last is None + self.check_all = archive is None and last is None and prefix is None self.repair = repair self.repository = repository self.init_chunks() @@ -674,7 +674,7 @@ class ArchiveChecker: self.manifest = self.rebuild_manifest() else: self.manifest, _ = Manifest.load(repository, key=self.key) - self.rebuild_refcounts(archive=archive, last=last) + self.rebuild_refcounts(archive=archive, last=last, prefix=prefix) self.orphan_chunks_check() self.finish(save_space=save_space) if self.error_found: @@ -730,7 +730,7 @@ class ArchiveChecker: logger.info('Manifest rebuild complete.') return manifest - def rebuild_refcounts(self, archive=None, last=None): + def rebuild_refcounts(self, archive=None, last=None, prefix=None): """Rebuild object reference counts by walking the metadata Missing and/or incorrect data is repaired when detected @@ -830,7 +830,9 @@ class ArchiveChecker: # we need last N or all archives archive_items = sorted(self.manifest.archives.items(), reverse=True, key=lambda name_info: name_info[1][b'time']) - num_archives = len(self.manifest.archives) + if prefix is not None: + archive_items = [item for item in archive_items if item[0].startswith(prefix)] + num_archives = len(archive_items) end = None if last is None else min(num_archives, last) else: # we only want one specific archive diff --git a/borg/archiver.py b/borg/archiver.py index 3583870ce..e566c5728 100644 --- a/borg/archiver.py +++ b/borg/archiver.py @@ -109,7 +109,7 @@ class Archiver: return EXIT_WARNING if not args.repo_only and not ArchiveChecker().check( repository, repair=args.repair, archive=args.repository.archive, - last=args.last, save_space=args.save_space): + last=args.last, prefix=args.prefix, save_space=args.save_space): return EXIT_WARNING return EXIT_SUCCESS @@ -769,6 +769,8 @@ class Archiver: subparser.add_argument('--last', dest='last', type=int, default=None, metavar='N', help='only check last N archives (Default: all)') + subparser.add_argument('-p', '--prefix', dest='prefix', type=str, + help='only consider archive names starting with this prefix') change_passphrase_epilog = textwrap.dedent(""" The key files used for repository encryption are optionally passphrase diff --git a/borg/testsuite/archiver.py b/borg/testsuite/archiver.py index d8ae92cce..c20a51828 100644 --- a/borg/testsuite/archiver.py +++ b/borg/testsuite/archiver.py @@ -949,6 +949,8 @@ class ArchiverCheckTestCase(ArchiverTestCaseBase): output = self.cmd('check', '-v', '--archives-only', self.repository_location, exit_code=0) self.assert_not_in('Starting repository check', output) self.assert_in('Starting archive consistency check', output) + output = self.cmd('check', '-v', '--archives-only', '--prefix=archive2', self.repository_location, exit_code=0) + self.assert_not_in('archive1', output) def test_missing_file_chunk(self): archive, repository = self.open_archive('archive1')