https://github.com/python/cpython/commit/cd6096887e22cdb6d6365ad0eb5b0ffac50d4791
commit: cd6096887e22cdb6d6365ad0eb5b0ffac50d4791
branch: main
author: John Merkel <[email protected]>
committer: vsajip <[email protected]>
date: 2026-05-13T08:59:57+01:00
summary:
gh-149701: Fully silence potential `hash -r` error (GH-149702)
files:
A Misc/NEWS.d/next/Library/2026-05-12-06-24-54.gh-issue-149701.8v9RTm.rst
M Lib/test/test_venv.py
M Lib/venv/scripts/common/activate
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
index 78461abcd69f33..a42787f261bfe8 100644
--- a/Lib/test/test_venv.py
+++ b/Lib/test/test_venv.py
@@ -656,6 +656,26 @@ def test_deactivate_with_strict_bash_opts(self):
self.assertEqual(out, "".encode())
self.assertEqual(err, "".encode())
+ # gh-149701: Test exit code is zero even when hashing is disabled
+ @unittest.skipIf(os.name == 'nt', 'not relevant on Windows')
+ def test_deactivate_with_strict_bash_opts_and_hashing_disabled(self):
+ bash = shutil.which("bash")
+ if bash is None:
+ self.skipTest("bash required for this test")
+ rmtree(self.env_dir)
+ builder = venv.EnvBuilder(clear=True)
+ builder.create(self.env_dir)
+ activate = os.path.join(self.env_dir, self.bindir, "activate")
+ test_script = os.path.join(self.env_dir, "test_hash_disabled.sh")
+ with open(test_script, "w") as f:
+ f.write("set -euo pipefail\n"
+ "set +h\n" # disable hashing
+ f"source {activate}\n"
+ "deactivate")
+ out, err = check_output([bash, test_script])
+ self.assertEqual(out, "".encode())
+ self.assertEqual(err, "".encode())
+
@unittest.skipUnless(sys.platform == 'darwin', 'only relevant on macOS')
def test_macos_env(self):
diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate
index 70673a265d41f8..241a8650bda33a 100644
--- a/Lib/venv/scripts/common/activate
+++ b/Lib/venv/scripts/common/activate
@@ -17,7 +17,7 @@ deactivate () {
# Call hash to forget past locations. Without forgetting
# past locations the $PATH changes we made may not be respected.
# See "man bash" for more details. hash is usually a builtin of your shell
- hash -r 2> /dev/null
+ hash -r 2> /dev/null || true
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
PS1="${_OLD_VIRTUAL_PS1:-}"
@@ -73,4 +73,4 @@ fi
# Call hash to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
-hash -r 2> /dev/null
+hash -r 2> /dev/null || true
diff --git
a/Misc/NEWS.d/next/Library/2026-05-12-06-24-54.gh-issue-149701.8v9RTm.rst
b/Misc/NEWS.d/next/Library/2026-05-12-06-24-54.gh-issue-149701.8v9RTm.rst
new file mode 100644
index 00000000000000..676d788cbce62a
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-05-12-06-24-54.gh-issue-149701.8v9RTm.rst
@@ -0,0 +1 @@
+Fix bad return code from Lib/venv/bin/activate if hashing is disabled
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]