]> granicus.if.org Git - python/commitdiff
bpo-37885: venv: Don't produce unbound variable warning on deactivate (GH-15973)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 11 Sep 2019 15:55:57 +0000 (08:55 -0700)
committerT. Wouters <thomas@python.org>
Wed, 11 Sep 2019 15:55:57 +0000 (08:55 -0700)
Before, running deactivate from a bash shell configured to treat undefined variables as errors (`set -u`) would produce a warning:

```
$ python3 -m venv test
$ source test/bin/activate
(test) $ deactivate
-bash: $1: unbound variable
```
(cherry picked from commit 5209e586b7cac9a43b2c44349a26b1b0af06ead3)

Co-authored-by: Daniel Abrahamsson <hamsson@gmail.com>
Lib/test/test_venv.py
Lib/venv/scripts/common/activate
Misc/NEWS.d/next/Library/2019-08-19-10-31-41.bpo-37885.4Nc9sp.rst [new file with mode: 0644]

index 7130dc6f83091068b1e5eb05e98d5379fbd4d4c6..ede65935b650bb6acc4c63ed944543c0d3c2a43f 100644 (file)
@@ -9,6 +9,7 @@ import ensurepip
 import os
 import os.path
 import re
+import shutil
 import struct
 import subprocess
 import sys
@@ -338,6 +339,25 @@ class BasicTest(BaseTest):
             'pool.terminate()'])
         self.assertEqual(out.strip(), "python".encode())
 
+    @unittest.skipIf(os.name == 'nt', 'not relevant on Windows')
+    def test_deactivate_with_strict_bash_opts(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_strict.sh")
+        with open(test_script, "w") as f:
+            f.write("set -euo pipefail\n"
+                    f"source {activate}\n"
+                    "deactivate\n")
+        out, err = check_output([bash, test_script])
+        self.assertEqual(out, "".encode())
+        self.assertEqual(err, "".encode())
+
+
 @requireVenvCreate
 class EnsurePipTest(BaseTest):
     """Test venv module installation of pip."""
index fff0765af53b82d550d55833e98a72dbdc457ddb..b9d498fb2ef04f7d4a0474d2392086ce4f754477 100644 (file)
@@ -28,7 +28,7 @@ deactivate () {
     fi
 
     unset VIRTUAL_ENV
-    if [ ! "$1" = "nondestructive" ] ; then
+    if [ ! "${1:-}" = "nondestructive" ] ; then
     # Self destruct!
         unset -f deactivate
     fi
diff --git a/Misc/NEWS.d/next/Library/2019-08-19-10-31-41.bpo-37885.4Nc9sp.rst b/Misc/NEWS.d/next/Library/2019-08-19-10-31-41.bpo-37885.4Nc9sp.rst
new file mode 100644 (file)
index 0000000..055d029
--- /dev/null
@@ -0,0 +1 @@
+venv: Don't generate unset variable warning on deactivate.
\ No newline at end of file