diff options
author | João Eiras <joao.carlos.eiras@tine.no> | 2019-07-23 10:12:12 +0200 |
---|---|---|
committer | Bernát Gábor <bgabor8@bloomberg.net> | 2019-07-23 09:12:12 +0100 |
commit | e81ffe07a1c0660a28e1b420cc0799138ea33d11 (patch) | |
tree | f41bd55fa4c52d73b9845a0bcdd4d68e4c1306e8 | |
parent | 311a909c10459711d47377e34b9dcd77e282cc2a (diff) | |
download | virtualenv-e81ffe07a1c0660a28e1b420cc0799138ea33d11.tar.gz |
Report error when not sourcing activate scripts (#1372) (#1388)
* Report error when not sourcing activate scripts (#1372)
The activate scripts are to be used in the context of the current shell session.
The feature so far only works in powershell and bash, because in other shells it
is hard to get the name of the currently executing script.
Also added tests.
* fix
-rw-r--r-- | docs/changelog/1388.feature.rst | 1 | ||||
-rw-r--r-- | tests/activation/test_activation.py | 10 | ||||
-rwxr-xr-x | virtualenv.py | 56 | ||||
-rw-r--r-- | virtualenv_embedded/activate.ps1 | 5 | ||||
-rw-r--r-- | virtualenv_embedded/activate.sh | 8 |
5 files changed, 52 insertions, 28 deletions
diff --git a/docs/changelog/1388.feature.rst b/docs/changelog/1388.feature.rst new file mode 100644 index 0000000..1a6083d --- /dev/null +++ b/docs/changelog/1388.feature.rst @@ -0,0 +1 @@ +Report error when running activate scripts directly, instead of sourcing. By reporting an error instead of running silently, the user get immediate feedback that the script was not used correctly. Only Bash and PowerShell are supported for now. diff --git a/tests/activation/test_activation.py b/tests/activation/test_activation.py index d260239..397bc34 100644 --- a/tests/activation/test_activation.py +++ b/tests/activation/test_activation.py @@ -64,6 +64,7 @@ class Activation(object): check_has_exe = [] check = [] env = {} + also_test_error_if_not_sourced = False def __init__(self, activation_env, tmp_path): self.home_dir = activation_env[0] @@ -139,6 +140,13 @@ class Activation(object): assert out[-2] == out[0], raw assert out[-1] == "None", raw + if self.also_test_error_if_not_sourced: + invoke_shell = self.invoke_script + [absolute_activate_script] + + with pytest.raises(subprocess.CalledProcessError) as c: + subprocess.check_output(invoke_shell, stderr=subprocess.STDOUT, env=env) + assert c.value.returncode, c + def activate_call(self, script): return "{} {}".format(pipes.quote(self.activate_cmd), pipes.quote(script)).strip() @@ -155,6 +163,7 @@ class BashActivation(Activation): extension = "sh" activate_script = "activate" check = [cmd, "--version"] + also_test_error_if_not_sourced = True @pytest.mark.skipif(sys.platform == "win32", reason="no sane way to provision bash on Windows yet") @@ -198,6 +207,7 @@ class PowershellActivation(Activation): activate_script = "activate.ps1" activate_cmd = "." check = [cmd, "-c", "$PSVersionTable"] + also_test_error_if_not_sourced = True def quote(self, s): """powershell double double quote needed for quotes within single quotes""" diff --git a/virtualenv.py b/virtualenv.py index ac1dbd5..bd79860 100755 --- a/virtualenv.py +++ b/virtualenv.py @@ -2281,20 +2281,21 @@ IWNQ+EMONwZIp5gxI994rJ0KayiC/wegEfUH # file activate.sh ACTIVATE_SH = convert( """ -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 """ ) @@ -2379,19 +2380,20 @@ pk+k4fAba/wd0Pr4P2CqyLeOlJ4iKfkJo6v/iaH9YzfPMEoeMG2RUA== # file activate.ps1 ACTIVATE_PS = convert( """ -eJytVV1vmzAUfedX3FK0Jeqg2mumPtAlUiOlaRSyvmyT5cBNYwlsZBvaaMp/nyEQCCRVNc1v9v3w -Ofeea1/DassUbFiMkGRKwxohEhqUyGSIEWykSGAhgu032IkMQsq5scqMA9MQMYmhjncejAVok2cE -Hni3NNQspxq9VH21LEeFkqV6tHqYBmThrx7gDpxkx3guQqqZ4F6yC0WSUB55KdXbY8C9H0zIeLo0 -/kEaM+0ujBUGS1QizvGws51j2lvPs4dgjiVybVmbjIdFdniJxZrGowhrWIOf6pXpcPsbnLngY1Ra -ZoUJh/DHArPYBgYrc3y4IqeS0XWMI/I0G5Pn6XL1w5+VN9b+xXKQ56Oa3eWQo/8SE2FIPFeeYPdc -bXCDUKRYESgj99YZgDXTERFxRHImdUZjkprGpfoE4tHxYCuQvhfbxTrVmDSX/boU0cJYFqXmNJk/ -t9G0k3bcwJ1IKaR/6F9gpMmNyL4LrhnPsHvJ1YUuFusaAow3EFXWq/cpNRJ53y/dRSKsYOz7SivN -FYh0p7fG4iZwOHWofFFF0DVkXKEGJiXGmFOuj0JTVgMEXC541JAz49QulOlgPSVWt9iFsbW1rDm+ -Nno70Ra4c5og9CQIxj/OsBG3ZbV1bnevvCXkfjonc/9xQswq3EgwWRBiw00ryaFrnVjDIfDvZxOy -WD49LlZ1F7vFPaO6Vr9tu2rLqd7PBd315qGRlE2aMpRoCgYuN1Nqt9XVa3wXzkGCfhSZxxEhNM+r -eUxTiRv2BlqUh/jGlJH1C3RmriRgXHMmMlVhJnnZjTv49MHBLdZ5MjcXkg+PsftWJTFW+G+8aYdu -mMniea7YfoF1Zn4RwT8Xf4kKqYzMt+L9/yI4HF+78fbAGbQ/lt78uDOkGxgOwT4taD/Zx6u5t/4C -0ptRdg== +eJytVW1v2jAQ/p5fcUujFdQm1dRvTJ1GV6YitRQR1mnaJsskB1hK7Mhx0qKJ/75LCCSEUlXT/Aly +b89z95x9AtOlSGEuIoQ4Sw3MEEJlIFWZDjCEuVYxjJW//AgrlUHApSSrziQIA6HQGJho5cGNAkN5 +euCBd8EDI3Ju0EvSD5Yl5tD53HFkFkXn9lAa1JJHdhdcShQoabiQKTjxSshcBdwIJb1AxTGXodJi +IWQX/lhA57sWBt1bRRjdr0rjQqtMhqAJpP2DoJXoTze4T0s0kAZaJKYHY/8TAXM6+1Xqn5LH2LXL +KvhMvC4vrbVlOVX49Hbos3F/egtXLZzxqkLqJdwsdwHXfX/AboYT8veTSBh3TFboTDBVUY6bf7az +S3vheUU7xlyjNJY1z2RQZIdFpGY86oW47WfnZ/okTLD8Dc5IyRtMjc4KE25bVLR6Sp83JXKuBZ9F +2GMPdzfscTiZfuvflRW3/sVxUOa9LbvjITv/CcaKSDxWnmAfuNrg+oFKsCJQRlI7DwFumfaYikKW +C20yHrGEFJeYPYg7x42tQPpabBvr0GBcF/t1LKKBsWzKltNg9NhE00zacgN3oLXS/c38fNopSdvx +hUQuZIbtIu+OTLE4J+BjNIewsr57nVItkdf9klWoggrG+lBppbkCkazMkixuDJuvDteLtAg6gUym +aEBojRHmXJqd0FKrBlKstwxrcrROzUbRBLdbYrWbXRgbfy1rhE+13va0Be6IVhcOJAjkH2VYi9uy +mjq32yUvGLsejtiofz9gdAo35g/GjNlw1kiymVorljj4/eu7ARtPHu7H0+0U2819QXWNedt2NZZ9 +vb8UdHWwD7WkbFa3oURTMHAlbandVNfB4NtwNhLshyHdowgB3az0CiQa5+IZjCo/0kWZkqwX0Nq5 +kgC55kJlaYWZ5eU0ruD9Gxe3OC+TOTuSvLuLXTc6iVGK/8abt+gGmS6u54rtOcwyev6UPC0ewTTg +OqT30Pv/TXAkPrXj7Y7TaT4sB/vj3iGfQ7cL9n5DD5O9vZtr6y9V3o9t """ ) diff --git a/virtualenv_embedded/activate.ps1 b/virtualenv_embedded/activate.ps1 index e8daf34..2a94af3 100644 --- a/virtualenv_embedded/activate.ps1 +++ b/virtualenv_embedded/activate.ps1 @@ -1,5 +1,10 @@ # This file must be dot sourced from PoSh; you cannot run it directly. Do this: . ./activate.ps1
+if (@($null,"Internal") -notcontains $myinvocation.commandorigin) {
+ Write-Host -Foreground red "You must 'source' this script: PS> . $($myinvocation.invocationname)"
+ exit 33
+}
+
$script:THIS_PATH = $myinvocation.mycommand.path
$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent
diff --git a/virtualenv_embedded/activate.sh b/virtualenv_embedded/activate.sh index 47332e8..2f86735 100644 --- a/virtualenv_embedded/activate.sh +++ b/virtualenv_embedded/activate.sh @@ -1,12 +1,18 @@ # This file must be used with "source bin/activate" *from bash* # you cannot run it directly + +if [[ "${BASH_SOURCE-}" = "$0" ]]; then + echo "You must source this script: \$ source $0" >&2 + exit 33 +fi + deactivate () { unset -f pydoc >/dev/null 2>&1 # reset old environment variables # ! [ -z ${VAR+_} ] returns true if VAR is declared at all - if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then + if ! [ -z "${_OLD_VIRTUAL_PATH:+_}" ] ; then PATH="$_OLD_VIRTUAL_PATH" export PATH unset _OLD_VIRTUAL_PATH |