From 5209e586b7cac9a43b2c44349a26b1b0af06ead3 Mon Sep 17 00:00:00 2001 From: Daniel Abrahamsson Date: Wed, 11 Sep 2019 16:58:56 +0200 Subject: [PATCH] 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 ``` --- Lib/test/test_venv.py | 20 +++++++++++++++++++ Lib/venv/scripts/common/activate | 2 +- .../2019-08-19-10-31-41.bpo-37885.4Nc9sp.rst | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-08-19-10-31-41.bpo-37885.4Nc9sp.rst diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index de93d9539c2..0103de8828d 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 6a2320a369c..b1b4625fddd 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 00000000000..055d0297014 --- /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