diff --git a/git/util.py b/git/util.py index 46891ec30..90a498241 100644 --- a/git/util.py +++ b/git/util.py @@ -175,7 +175,7 @@ def patch_env(name: str, value: str) -> Generator[None, None, None]: yield finally: if old_value is None: - del os.environ[name] + os.environ.pop(name, None) else: os.environ[name] = old_value diff --git a/test/test_patch_env.py b/test/test_patch_env.py new file mode 100644 index 000000000..c5c8fec15 --- /dev/null +++ b/test/test_patch_env.py @@ -0,0 +1,39 @@ +"""Regression tests for temporary environment variable changes.""" + +import os + +import pytest + +from git.util import patch_env + + +@pytest.mark.parametrize("original", [None, "", "original"]) +@pytest.mark.parametrize("change", ["keep", "replace", "delete"]) +@pytest.mark.parametrize("raise_error", [False, True]) +def test_patch_env_restores_original_state(monkeypatch, original, change, raise_error): + name = "GITPYTHON_TEST_PATCH_ENV" + if original is None: + monkeypatch.delenv(name, raising=False) + else: + monkeypatch.setenv(name, original) + + def change_environment(): + with patch_env(name, "temporary"): + assert os.environ[name] == "temporary" + if change == "replace": + os.environ[name] = "changed" + elif change == "delete": + del os.environ[name] + if raise_error: + raise RuntimeError("context body failed") + + if raise_error: + with pytest.raises(RuntimeError, match="context body failed"): + change_environment() + else: + change_environment() + + if original is None: + assert name not in os.environ + else: + assert os.environ[name] == original