diff options
author | Daniel Abrahamsson <hamsson@gmail.com> | 2019-09-11 14:58:56 (GMT) |
---|---|---|
committer | T. Wouters <thomas@python.org> | 2019-09-11 14:58:56 (GMT) |
commit | 5209e586b7cac9a43b2c44349a26b1b0af06ead3 (patch) | |
tree | cafe1143250451d37a63d17261fb117308364e50 | |
parent | 3b58a70d9cf1c0f963adce9b07060116b2775687 (diff) | |
download | cpython-5209e586b7cac9a43b2c44349a26b1b0af06ead3.zip cpython-5209e586b7cac9a43b2c44349a26b1b0af06ead3.tar.gz cpython-5209e586b7cac9a43b2c44349a26b1b0af06ead3.tar.bz2 |
bpo-37885: venv: Don't produce unbound variable warning on deactivate (GH-15330)
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
```
-rw-r--r-- | Lib/test/test_venv.py | 20 | ||||
-rw-r--r-- | Lib/venv/scripts/common/activate | 2 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2019-08-19-10-31-41.bpo-37885.4Nc9sp.rst | 1 |
3 files changed, 22 insertions, 1 deletions
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index de93d95..0103de8 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -9,6 +9,7 @@ import ensurepip import os import os.path import re +import shutil import struct import subprocess import sys @@ -360,6 +361,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.""" diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate index 6a2320a..b1b4625 100644 --- a/Lib/venv/scripts/common/activate +++ b/Lib/venv/scripts/common/activate @@ -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 index 0000000..055d029 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-08-19-10-31-41.bpo-37885.4Nc9sp.rst @@ -0,0 +1 @@ +venv: Don't generate unset variable warning on deactivate.
\ No newline at end of file |