]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-149701: Fully silence potential `hash -r` error (GH-149702)
authorJohn Merkel <dev.genericallyterrible@gmail.com>
Wed, 13 May 2026 07:59:57 +0000 (00:59 -0700)
committerGitHub <noreply@github.com>
Wed, 13 May 2026 07:59:57 +0000 (08:59 +0100)
Lib/test/test_venv.py
Lib/venv/scripts/common/activate
Misc/NEWS.d/next/Library/2026-05-12-06-24-54.gh-issue-149701.8v9RTm.rst [new file with mode: 0644]

index 78461abcd69f337c7dbd2cf9e590fe9c22a18984..a42787f261bfe8936b727e8d61da0d7912406426 100644 (file)
@@ -656,6 +656,26 @@ class BasicTest(BaseTest):
         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):
index 70673a265d41f803982f920b038693bc088aa0fc..241a8650bda33aa1f26e671ecf8eb2cbdecfa67e 100644 (file)
@@ -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 (file)
index 0000000..676d788
--- /dev/null
@@ -0,0 +1 @@
+Fix bad return code from Lib/venv/bin/activate if hashing is disabled