diff --git a/borgmatic/execute.py b/borgmatic/execute.py index 86caa49fc..103636601 100644 --- a/borgmatic/execute.py +++ b/borgmatic/execute.py @@ -22,7 +22,7 @@ def exit_code_indicates_error(exit_code, error_on_warnings=True): return bool(exit_code >= BORG_ERROR_EXIT_CODE) -def process_command(process): +def command_for_process(process): ''' Given a process as an instance of subprocess.Popen, return the command string that was used to invoke it. @@ -32,9 +32,9 @@ def process_command(process): def output_buffer_for_process(process, exclude_stdouts): ''' - Given an instance of subprocess.Popen and a sequence of stdouts to exclude, return either the - process's stdout or stderr. The idea is that if stdout is excluded for a process, we still have - stderr to log. + Given a process as an instance of subprocess.Popen and a sequence of stdouts to exclude, return + either the process's stdout or stderr. The idea is that if stdout is excluded for a process, we + still have stderr to log. ''' return process.stderr if process.stdout in exclude_stdouts else process.stdout @@ -100,7 +100,7 @@ def log_outputs(processes, exclude_stdouts, output_log_level, error_on_warnings) last_lines.insert(0, '...') raise subprocess.CalledProcessError( - exit_code, process_command(process), '\n'.join(last_lines) + exit_code, command_for_process(process), '\n'.join(last_lines) ) @@ -170,7 +170,7 @@ def execute_command( exit_code = process.wait() if exit_code_indicates_error(exit_code, error_on_warnings): - raise subprocess.CalledProcessError(exit_code, process_command(process)) + raise subprocess.CalledProcessError(exit_code, command_for_process(process)) return None diff --git a/tests/integration/test_execute.py b/tests/integration/test_execute.py index fb3b3a995..f61f11d00 100644 --- a/tests/integration/test_execute.py +++ b/tests/integration/test_execute.py @@ -13,11 +13,19 @@ def test_log_outputs_logs_each_line_separately(): flexmock(module).should_receive('exit_code_indicates_error').and_return(False) hi_process = subprocess.Popen(['echo', 'hi'], stdout=subprocess.PIPE) + flexmock(module).should_receive('output_buffer_for_process').with_args( + hi_process, () + ).and_return(hi_process.stdout) + module.log_outputs( (hi_process,), exclude_stdouts=(), output_log_level=logging.INFO, error_on_warnings=False ) there_process = subprocess.Popen(['echo', 'there'], stdout=subprocess.PIPE) + flexmock(module).should_receive('output_buffer_for_process').with_args( + there_process, () + ).and_return(there_process.stdout) + module.log_outputs( (there_process,), exclude_stdouts=(), output_log_level=logging.INFO, error_on_warnings=False ) @@ -26,8 +34,10 @@ def test_log_outputs_logs_each_line_separately(): def test_log_outputs_includes_error_output_in_exception(): flexmock(module.logger).should_receive('log') flexmock(module).should_receive('exit_code_indicates_error').and_return(True) + flexmock(module).should_receive('command_for_process').and_return('grep') process = subprocess.Popen(['grep'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + flexmock(module).should_receive('output_buffer_for_process').and_return(process.stdout) with pytest.raises(subprocess.CalledProcessError) as error: module.log_outputs( @@ -42,8 +52,10 @@ def test_log_outputs_truncates_long_error_output(): flexmock(module).ERROR_OUTPUT_MAX_LINE_COUNT = 0 flexmock(module.logger).should_receive('log') flexmock(module).should_receive('exit_code_indicates_error').and_return(True) + flexmock(module).should_receive('command_for_process').and_return('grep') process = subprocess.Popen(['grep'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + flexmock(module).should_receive('output_buffer_for_process').and_return(process.stdout) with pytest.raises(subprocess.CalledProcessError) as error: module.log_outputs( @@ -59,6 +71,8 @@ def test_log_outputs_with_no_output_logs_nothing(): flexmock(module).should_receive('exit_code_indicates_error').and_return(False) process = subprocess.Popen(['true'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + flexmock(module).should_receive('output_buffer_for_process').and_return(process.stdout) + module.log_outputs( (process,), exclude_stdouts=(), output_log_level=logging.INFO, error_on_warnings=False )