diff --git a/NEWS b/NEWS index 967c30f3..3f5de9b9 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ 2.1.5.dev0 * #1292: Fix a "source directories do not exist" regression when configuration paths are relative symlinks and the bootstrap data source hook is enabled. + * #1294: Fix a regression in which SSH warnings from remote repositories broke the "spot" check. 2.1.4 * #1266: Add a stand-alone borgmatic Linux binary to the release downloads to serve as another way diff --git a/borgmatic/execute.py b/borgmatic/execute.py index e1c5844a..e01b7008 100644 --- a/borgmatic/execute.py +++ b/borgmatic/execute.py @@ -315,8 +315,8 @@ def log_buffer_lines( Given a dict from buffer object to Buffer_reader, a dict from subprocess.Popen() instance to Process_metadata instance, a requested output log level for stdout, Borg's local path, and whether to capture stderr, read and log any ready output lines from the buffers. Additionally, - for any log records with a log level that meets or exceeds the output log level, yield those log - messages for capture. + for any log records with a log level the same as the output log level, yield those log messages + for capture. This function just does one "turn of the crank" of logging buffer output. It is intended to be called repeatedly to continue to process buffers. @@ -367,9 +367,7 @@ def log_buffer_lines( ) if ( - log_record.levelno is None - or output_log_level is None - or log_record.levelno >= output_log_level + log_record.levelno is None or log_record.levelno == output_log_level ) and process_metadatas[reader.process].capture: yield log_record.getMessage() @@ -429,8 +427,8 @@ def log_remaining_buffer_lines( Given a dict from buffer object to Buffer_reader, a dict from subprocess.Popen() instance to Process_metadata instance, a requested output log level for stdout, Borg's local path, and whether to capture stderr, drain and log any remaining output lines from the buffers until - they're empty. Additionally, for any log records with a log level that meets or exceeds the - output log level, yield those log messages for capture. + they're empty. Additionally, for any log records with a log level the same as the output log + level, yield those log messages for capture. ''' for output_buffer, reader in buffer_readers.items(): if not reader.process: @@ -451,9 +449,7 @@ def log_remaining_buffer_lines( ) if ( - log_record.levelno is None - or output_log_level is None - or log_record.levelno >= output_log_level + log_record.levelno is None or log_record.levelno == output_log_level ) and process_metadatas[reader.process].capture: yield log_record.getMessage() diff --git a/tests/integration/test_execute.py b/tests/integration/test_execute.py index e14165e9..b13a5e8e 100644 --- a/tests/integration/test_execute.py +++ b/tests/integration/test_execute.py @@ -137,15 +137,18 @@ def test_log_outputs_logs_stderr_as_error(): (), ).and_return((echo_process.stdout, echo_process.stderr)) - assert tuple( - module.log_outputs( - (echo_process,), - exclude_stdouts=(), - output_log_level=logging.INFO, - borg_local_path='borg', - borg_exit_codes=None, + assert ( + tuple( + module.log_outputs( + (echo_process,), + exclude_stdouts=(), + output_log_level=logging.INFO, + borg_local_path='borg', + borg_exit_codes=None, + ) ) - ) == ('error',) + == () + ) def test_log_outputs_skips_logs_for_process_with_none_stdout(): diff --git a/tests/unit/test_execute.py b/tests/unit/test_execute.py index 00436e8e..59d9317d 100644 --- a/tests/unit/test_execute.py +++ b/tests/unit/test_execute.py @@ -486,7 +486,7 @@ def test_log_buffer_lines_with_ready_buffer_and_higher_log_level_and_capture_pro ) -def test_log_buffer_lines_with_ready_buffer_and_lower_log_level_and_capture_process_yields_each_line(): +def test_log_buffer_lines_with_ready_buffer_and_log_level_equal_to_output_log_level_and_capture_process_yields_each_line(): process = flexmock(poll=lambda: None, stderr=flexmock(), args=flexmock()) buffer_readers = { flexmock(): module.Buffer_reader(lines=iter((('hi', 'there'),)), process=process) @@ -497,7 +497,7 @@ def test_log_buffer_lines_with_ready_buffer_and_lower_log_level_and_capture_proc ).and_return(list(buffer_readers.keys()), [], []) flexmock(module).should_receive('parse_log_line').and_return(flexmock()) flexmock(module).should_receive('handle_log_record').and_return( - flexmock(levelno=module.logging.ERROR, getMessage=lambda: 'message') + flexmock(levelno=module.logging.INFO, getMessage=lambda: 'message') ).twice() assert tuple( @@ -1256,7 +1256,7 @@ def test_log_remaining_buffer_lines_with_higher_log_level_and_capture_process_do ) -def test_log_remaining_buffer_lines_with_lower_log_level_and_capture_process_does_yields_each_line(): +def test_log_remaining_buffer_lines_with_log_level_equal_to_output_log_level_and_capture_process_yields_each_line(): process = flexmock(stderr=flexmock(), args=flexmock()) buffer_readers = { flexmock(): module.Buffer_reader( @@ -1269,7 +1269,7 @@ def test_log_remaining_buffer_lines_with_lower_log_level_and_capture_process_doe line=str, log_level=object, elevate_stderr=False, borg_local_path=object, command=object ).and_return(flexmock()).twice() flexmock(module).should_receive('handle_log_record').and_return( - flexmock(levelno=module.logging.ERROR, getMessage=lambda: 'message') + flexmock(levelno=module.logging.INFO, getMessage=lambda: 'message') ).twice() assert tuple(