Fix "borgmatic borg key ..." to pass parameters to Borg in correct order (#515).

This commit is contained in:
Dan Helfman 2022-04-23 14:03:15 -07:00
parent bdc26f2117
commit 0e6b425ac5
3 changed files with 18 additions and 4 deletions

1
NEWS
View file

@ -6,6 +6,7 @@
once for each configured repository instead of once per configuration file. Additionally, the
"repositories" interpolated variable has been changed to "repository", containing the path to the
current repository for the hook.
* #515: Fix "borgmatic borg key ..." to pass parameters to Borg in correct order.
* #516: Fix handling of TERM signal to exit borgmatic, not just forward the signal to Borg.
* #517: Fix borgmatic exit code (so it's zero) when initial Borg calls fail but later retries
succeed.

View file

@ -21,17 +21,20 @@ def run_arbitrary_borg(
try:
options = options[1:] if options[0] == '--' else options
borg_command = options[0]
command_options = tuple(options[1:])
# Borg's "key" command has a sub-command ("export", etc.) that must follow it.
command_options_start_index = 2 if options[0] == 'key' else 1
borg_command = tuple(options[:command_options_start_index])
command_options = tuple(options[command_options_start_index:])
except IndexError:
borg_command = None
borg_command = ()
command_options = ()
repository_archive = '::'.join((repository, archive)) if repository and archive else repository
full_command = (
(local_path,)
+ ((borg_command,) if borg_command else ())
+ borg_command
+ ((repository_archive,) if borg_command and repository_archive else ())
+ command_options
+ (('--info',) if logger.getEffectiveLevel() == logging.INFO else ())

View file

@ -121,3 +121,13 @@ def test_run_arbitrary_borg_without_borg_specific_parameters_does_not_raise():
module.run_arbitrary_borg(
repository='repo', storage_config={}, options=[],
)
def test_run_arbitrary_borg_passes_key_sub_command_to_borg_before_repository():
flexmock(module).should_receive('execute_command').with_args(
('borg', 'key', 'export', 'repo'), output_log_level=logging.WARNING, borg_local_path='borg',
)
module.run_arbitrary_borg(
repository='repo', storage_config={}, options=['key', 'export'],
)