Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions git/cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,8 +368,12 @@ def _terminate(self) -> None:
status = proc.wait() # Ensure the process goes away.

self.status = self._status_code_if_terminate or status
except OSError as ex:
_logger.info("Ignored error after process had died: %r", ex)
except (OSError, AttributeError) as ex:
# On interpreter shutdown (notably on Windows), parts of the stdlib used by
# subprocess can already be torn down (e.g. `subprocess._winapi` becomes None),
# which can cause AttributeError during terminate(). In that case, we prefer
# to silently ignore to avoid noisy "Exception ignored in: __del__" messages.
_logger.info("Ignored error while terminating process: %r", ex)
# END exception handling

def __del__(self) -> None:
Expand Down
35 changes: 35 additions & 0 deletions test/test_autointerrupt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import pytest

from git.cmd import Git


class _DummyProc:
"""Minimal stand-in for subprocess.Popen used to exercise AutoInterrupt.

We deliberately raise AttributeError from terminate() to simulate interpreter
shutdown on Windows where subprocess internals (e.g. subprocess._winapi) may
already be torn down.
"""

stdin = None
stdout = None
stderr = None

def poll(self):
return None

def terminate(self):
raise AttributeError("TerminateProcess")

def wait(self): # pragma: no cover - should not be reached in this test
raise AssertionError("wait() should not be called if terminate() fails")


def test_autointerrupt_terminate_ignores_attributeerror():
ai = Git.AutoInterrupt(_DummyProc(), args=["git", "rev-list"])

# Should not raise, even if terminate() triggers AttributeError.
ai._terminate()

# Ensure the reference is cleared to avoid repeated attempts.
assert ai.proc is None
Loading