diff --git a/NEWS b/NEWS index 53e53b827..820cef564 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ * #277: Customize Healthchecks log level via borgmatic "--monitoring-verbosity" flag. * #280: Change "exclude_if_present" option to support multiple filenames that indicate a directory should be excluded from backups, rather than just a single filename. + * #287: View consistency check progress via "--progress" flag for "check" action. * For "create" and "prune" actions, no longer list files or show detailed stats at any verbosities by default. You can opt back in with "--files" or "--stats" flags. * For "list" and "info" actions, show repository names even at verbosity 0. diff --git a/borgmatic/borg/check.py b/borgmatic/borg/check.py index 45e59f28a..55332157b 100644 --- a/borgmatic/borg/check.py +++ b/borgmatic/borg/check.py @@ -91,13 +91,15 @@ def check_archives( consistency_config, local_path='borg', remote_path=None, + progress=None, repair=None, only_checks=None, ): ''' Given a local or remote repository path, a storage config dict, a consistency config dict, - local/remote commands to run, whether to attempt a repair, and an optional list of checks - to use instead of configured checks, check the contained Borg archives for consistency. + local/remote commands to run, whether to include progress information, whether to attempt a + repair, and an optional list of checks to use instead of configured checks, check the contained + Borg archives for consistency. If there are no consistency checks to run, skip running them. ''' @@ -124,17 +126,17 @@ def check_archives( + (('--remote-path', remote_path) if remote_path else ()) + (('--lock-wait', str(lock_wait)) if lock_wait else ()) + verbosity_flags + + (('--progress',) if progress else ()) + (tuple(extra_borg_options.split(' ')) if extra_borg_options else ()) + (repository,) ) # The Borg repair option trigger an interactive prompt, which won't work when output is - # captured. - if repair: + # captured. And progress messes with the terminal directly. + if repair or progress: execute_command_without_capture(full_command, error_on_warnings=True) - return - - execute_command(full_command, error_on_warnings=True) + else: + execute_command(full_command, error_on_warnings=True) if 'extract' in checks: extract.extract_last_archive_dry_run(repository, lock_wait, local_path, remote_path) diff --git a/borgmatic/commands/arguments.py b/borgmatic/commands/arguments.py index 61a754dff..cde8539e2 100644 --- a/borgmatic/commands/arguments.py +++ b/borgmatic/commands/arguments.py @@ -262,7 +262,7 @@ def parse_arguments(*unparsed_arguments): dest='progress', default=False, action='store_true', - help='Display progress for each file as it is processed', + help='Display progress for each file as it is backed up', ) create_group.add_argument( '--stats', @@ -287,6 +287,13 @@ def parse_arguments(*unparsed_arguments): add_help=False, ) check_group = check_parser.add_argument_group('check arguments') + check_group.add_argument( + '--progress', + dest='progress', + default=False, + action='store_true', + help='Display progress for each file as it is checked', + ) check_group.add_argument( '--repair', dest='repair', @@ -336,7 +343,7 @@ def parse_arguments(*unparsed_arguments): dest='progress', default=False, action='store_true', - help='Display progress for each file as it is processed', + help='Display progress for each file as it is extracted', ) extract_group.add_argument( '-h', '--help', action='help', help='Show this help message and exit' diff --git a/borgmatic/commands/borgmatic.py b/borgmatic/commands/borgmatic.py index daece3a56..9914668ab 100644 --- a/borgmatic/commands/borgmatic.py +++ b/borgmatic/commands/borgmatic.py @@ -242,6 +242,7 @@ def run_actions( consistency, local_path=local_path, remote_path=remote_path, + progress=arguments['check'].progress, repair=arguments['check'].repair, only_checks=arguments['check'].only, ) diff --git a/tests/unit/borg/test_check.py b/tests/unit/borg/test_check.py index b2506aae0..96b9979ef 100644 --- a/tests/unit/borg/test_check.py +++ b/tests/unit/borg/test_check.py @@ -158,6 +158,21 @@ def test_make_check_flags_with_default_checks_and_prefix_includes_prefix_flag(): assert flags == ('--prefix', 'foo-') +def test_check_archives_with_progress_calls_borg_with_progress_parameter(): + checks = ('repository',) + consistency_config = {'check_last': None} + flexmock(module).should_receive('_parse_checks').and_return(checks) + flexmock(module).should_receive('_make_check_flags').and_return(()) + flexmock(module).should_receive('execute_command').never() + flexmock(module).should_receive('execute_command_without_capture').with_args( + ('borg', 'check', '--progress', 'repo'), error_on_warnings=True + ).once() + + module.check_archives( + repository='repo', storage_config={}, consistency_config=consistency_config, progress=True + ) + + def test_check_archives_with_repair_calls_borg_with_repair_parameter(): checks = ('repository',) consistency_config = {'check_last': None}