diff --git a/docs/changelog/1969.bugfix.rst b/docs/changelog/1969.bugfix.rst new file mode 100644 index 000000000..6e6e70677 --- /dev/null +++ b/docs/changelog/1969.bugfix.rst @@ -0,0 +1 @@ +Handle Cygwin path conversion in the activation script - by :user:`davidcoghlan`. diff --git a/src/virtualenv/activation/bash/activate.sh b/src/virtualenv/activation/bash/activate.sh index 19bf552bd..222d98204 100644 --- a/src/virtualenv/activation/bash/activate.sh +++ b/src/virtualenv/activation/bash/activate.sh @@ -47,6 +47,9 @@ deactivate () { deactivate nondestructive VIRTUAL_ENV='__VIRTUAL_ENV__' +if ([ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ]) && $(command -v cygpath &> /dev/null) ; then + VIRTUAL_ENV=$(cygpath -u "$VIRTUAL_ENV") +fi export VIRTUAL_ENV _OLD_VIRTUAL_PATH="$PATH" diff --git a/src/virtualenv/activation/via_template.py b/src/virtualenv/activation/via_template.py index 6839f0590..14f097973 100644 --- a/src/virtualenv/activation/via_template.py +++ b/src/virtualenv/activation/via_template.py @@ -1,9 +1,7 @@ from __future__ import absolute_import, unicode_literals import os -import re import sys -import sysconfig from abc import ABCMeta, abstractmethod from six import add_metaclass @@ -33,20 +31,9 @@ def generate(self, creator): return generated def replacements(self, creator, dest_folder): - current_platform = sysconfig.get_platform() - platforms = ["mingw", "cygwin", "msys"] - if any(platform in current_platform for platform in platforms): - pattern = re.compile("^([A-Za-z]):(.*)") - match = pattern.match(str(creator.dest)) - if match: - virtual_env = "/" + match.group(1).lower() + match.group(2) - else: - virtual_env = str(creator.dest) - else: - virtual_env = str(creator.dest) return { "__VIRTUAL_PROMPT__": "" if self.flag_prompt is None else self.flag_prompt, - "__VIRTUAL_ENV__": ensure_text(virtual_env), + "__VIRTUAL_ENV__": ensure_text(str(creator.dest)), "__VIRTUAL_NAME__": creator.env_name, "__BIN_NAME__": ensure_text(str(creator.bin_dir.relative_to(creator.dest))), "__PATH_SEP__": ensure_text(os.pathsep), diff --git a/tests/unit/activation/test_activation_support.py b/tests/unit/activation/test_activation_support.py index 5a234f9cc..d493c23ae 100644 --- a/tests/unit/activation/test_activation_support.py +++ b/tests/unit/activation/test_activation_support.py @@ -13,8 +13,6 @@ PythonActivator, ) from virtualenv.discovery.py_info import PythonInfo -from virtualenv.info import IS_WIN -from virtualenv.util.path import Path @pytest.mark.parametrize( @@ -55,45 +53,3 @@ def test_activator_no_support_posix(mocker, activator_class): interpreter = mocker.Mock(spec=PythonInfo) interpreter.os = "posix" assert not activator.supports(interpreter) - - -class Creator: - def __init__(self): - self.dest = "C:/tools/msys64/home" - self.env_name = "venv" - self.bin_dir = Path("C:/tools/msys64/home/bin") - - -@pytest.mark.skipif(IS_WIN, reason="Github Actions ships with WSL bash") -@pytest.mark.parametrize("activator_class", [BashActivator]) -def test_cygwin_msys2_path_conversion(mocker, activator_class): - mocker.patch("sysconfig.get_platform", return_value="mingw") - activator = activator_class(Namespace(prompt=None)) - creator = Creator() - mocker.stub(creator.bin_dir.relative_to) - resource = activator.replacements(creator, "") - assert resource["__VIRTUAL_ENV__"] == "/c/tools/msys64/home" - - -@pytest.mark.skipif(IS_WIN, reason="Github Actions ships with WSL bash") -@pytest.mark.parametrize("activator_class", [BashActivator]) -def test_win_path_no_conversion(mocker, activator_class): - mocker.patch("sysconfig.get_platform", return_value="win-amd64") - activator = activator_class(Namespace(prompt=None)) - creator = Creator() - mocker.stub(creator.bin_dir.relative_to) - resource = activator.replacements(creator, "") - assert resource["__VIRTUAL_ENV__"] == "C:/tools/msys64/home" - - -@pytest.mark.skipif(IS_WIN, reason="Github Actions ships with WSL bash") -@pytest.mark.parametrize("activator_class", [BashActivator]) -def test_cygwin_path_no_conversion(mocker, activator_class): - mocker.patch("sysconfig.get_platform", return_value="cygwin") - activator = activator_class(Namespace(prompt=None)) - creator = Creator() - creator.dest = "/c/tools/msys64/home" - creator.bin_dir = Path("/c/tools/msys64/home/bin") - mocker.stub(creator.bin_dir.relative_to) - resource = activator.replacements(creator, "") - assert resource["__VIRTUAL_ENV__"] == "/c/tools/msys64/home"