-
-
Notifications
You must be signed in to change notification settings - Fork 961
Description
When calling Git.execute, including indirectly through the dynamic methods of a Git object, passing a non-None value of output_stream suppresses the effect of kill_after_timeout. The threading.Timer object is created with the local kill_process function as its callback, but start is never called on it.
Lines 1050 to 1079 in a58a6be
| if output_stream is None: | |
| if kill_after_timeout is not None: | |
| watchdog.start() | |
| stdout_value, stderr_value = proc.communicate() | |
| if kill_after_timeout is not None: | |
| watchdog.cancel() | |
| if kill_check.is_set(): | |
| stderr_value = 'Timeout: the command "%s" did not complete in %d ' "secs." % ( | |
| " ".join(redacted_command), | |
| kill_after_timeout, | |
| ) | |
| if not universal_newlines: | |
| stderr_value = stderr_value.encode(defenc) | |
| # Strip trailing "\n". | |
| if stdout_value.endswith(newline) and strip_newline_in_stdout: # type: ignore | |
| stdout_value = stdout_value[:-1] | |
| if stderr_value.endswith(newline): # type: ignore | |
| stderr_value = stderr_value[:-1] | |
| status = proc.returncode | |
| else: | |
| max_chunk_size = max_chunk_size if max_chunk_size and max_chunk_size > 0 else io.DEFAULT_BUFFER_SIZE | |
| stream_copy(proc.stdout, output_stream, max_chunk_size) | |
| stdout_value = proc.stdout.read() | |
| stderr_value = proc.stderr.read() | |
| # Strip trailing "\n". | |
| if stderr_value.endswith(newline): # type: ignore | |
| stderr_value = stderr_value[:-1] | |
| status = proc.wait() | |
| # END stdout handling |
This situation appears not entirely intentional, because:
- The "watchdog"
Timeris created, even though it is never used. - The docstring, even as it documents that
as_processsuppresseskill_after_timeout(and thatas_processsuppressesoutput_stream), does not mention any effect ofoutput_streamonkill_after_timeout.
So either kill_after_timeout should be honored even when output_stream is used, or the docstring should be updated to mention that it does not (and the code possibly modified to not create the Timer object in the case that it is unused).
I am not sure which change should be made, so I'm opening this rather than a PR to propose one of them.
This is effectively separate from #1756. (One quality this shares with #1756 is that it is relevant only to the behavior of Git.execute and functions that use it. Functions that use handle_process_output are unaffected; its kill_after_timeout is implemented differently with nonequivalent behavior and separate code. handle_process_output also does not take an output_stream argument.)