summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernát Gábor <bgabor8@bloomberg.net>2020-01-31 11:43:31 +0000
committerGitHub <noreply@github.com>2020-01-31 11:43:31 +0000
commit46c64b202ef943a2ef5fd7578dfb9cea3d8f98f5 (patch)
tree4b3eb09709c87b88de260ad59fa53d8c39b171ed
parent5f802b0d8feb0525419a476e4f2525c8726efbfe (diff)
downloadvirtualenv-46c64b202ef943a2ef5fd7578dfb9cea3d8f98f5.tar.gz
generate fish and bash activators on Windows (#1528)
Signed-off-by: Bernat Gabor <bgabor8@bloomberg.net>
-rw-r--r--docs/changelog/1527.bugfix.rst2
-rw-r--r--src/virtualenv/activation/bash/__init__.py4
-rw-r--r--src/virtualenv/activation/fish/__init__.py4
-rw-r--r--src/virtualenv/util/subprocess/_win_subprocess.py4
-rw-r--r--tests/unit/activation/test_activation_support.py6
-rw-r--r--tests/unit/activation/test_fish.py4
-rw-r--r--tests/unit/discovery/test_discovery.py2
7 files changed, 15 insertions, 11 deletions
diff --git a/docs/changelog/1527.bugfix.rst b/docs/changelog/1527.bugfix.rst
new file mode 100644
index 0000000..ac3d680
--- /dev/null
+++ b/docs/changelog/1527.bugfix.rst
@@ -0,0 +1,2 @@
+Generate ``bash`` and ``fish`` activators on Windows too (as these can be available with git bash, cygwin or mysys2)
+- by ``gaborbernat``.
diff --git a/src/virtualenv/activation/bash/__init__.py b/src/virtualenv/activation/bash/__init__.py
index df3f772..22c90c3 100644
--- a/src/virtualenv/activation/bash/__init__.py
+++ b/src/virtualenv/activation/bash/__init__.py
@@ -6,10 +6,6 @@ from ..via_template import ViaTemplateActivator
class BashActivator(ViaTemplateActivator):
- @classmethod
- def supports(cls, interpreter):
- return interpreter.os != "nt"
-
def templates(self):
yield Path("activate.sh")
diff --git a/src/virtualenv/activation/fish/__init__.py b/src/virtualenv/activation/fish/__init__.py
index 3671093..8d0e19c 100644
--- a/src/virtualenv/activation/fish/__init__.py
+++ b/src/virtualenv/activation/fish/__init__.py
@@ -8,7 +8,3 @@ from ..via_template import ViaTemplateActivator
class FishActivator(ViaTemplateActivator):
def templates(self):
yield Path("activate.fish")
-
- @classmethod
- def supports(cls, interpreter):
- return interpreter.os != "nt"
diff --git a/src/virtualenv/util/subprocess/_win_subprocess.py b/src/virtualenv/util/subprocess/_win_subprocess.py
index f30344d..6750303 100644
--- a/src/virtualenv/util/subprocess/_win_subprocess.py
+++ b/src/virtualenv/util/subprocess/_win_subprocess.py
@@ -4,6 +4,7 @@
import ctypes
import os
+import platform
import subprocess
from ctypes import Structure, WinError, byref, c_char_p, c_void_p, c_wchar, c_wchar_p, sizeof, windll
from ctypes.wintypes import BOOL, BYTE, DWORD, HANDLE, LPVOID, LPWSTR, WORD
@@ -133,7 +134,10 @@ class Popen(subprocess.Popen):
if startupinfo is None:
startupinfo = subprocess.STARTUPINFO()
if not isinstance(args, subprocess.types.StringTypes):
+ args = [i if isinstance(i, bytes) else i.encode('utf-8') for i in args]
args = subprocess.list2cmdline(args)
+ if platform.python_implementation() == "CPython":
+ args = args.decode('utf-8')
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = _subprocess.SW_HIDE
comspec = os.environ.get("COMSPEC", unicode("cmd.exe"))
diff --git a/tests/unit/activation/test_activation_support.py b/tests/unit/activation/test_activation_support.py
index fd054c6..6168856 100644
--- a/tests/unit/activation/test_activation_support.py
+++ b/tests/unit/activation/test_activation_support.py
@@ -15,7 +15,9 @@ from virtualenv.activation import (
from virtualenv.discovery.py_info import PythonInfo
-@pytest.mark.parametrize("activator_class", [BatchActivator, PowerShellActivator, PythonActivator])
+@pytest.mark.parametrize(
+ "activator_class", [BatchActivator, PowerShellActivator, PythonActivator, BashActivator, FishActivator]
+)
def test_activator_support_windows(mocker, activator_class):
activator = activator_class(Namespace(prompt=None))
@@ -24,7 +26,7 @@ def test_activator_support_windows(mocker, activator_class):
assert activator.supports(interpreter)
-@pytest.mark.parametrize("activator_class", [BashActivator, CShellActivator, FishActivator])
+@pytest.mark.parametrize("activator_class", [CShellActivator])
def test_activator_no_support_windows(mocker, activator_class):
activator = activator_class(Namespace(prompt=None))
diff --git a/tests/unit/activation/test_fish.py b/tests/unit/activation/test_fish.py
index 4b85338..4e55415 100644
--- a/tests/unit/activation/test_fish.py
+++ b/tests/unit/activation/test_fish.py
@@ -1,8 +1,12 @@
from __future__ import absolute_import, unicode_literals
+import pytest
+
from virtualenv.activation import FishActivator
+from virtualenv.info import IS_WIN
+@pytest.mark.skipif(IS_WIN, reason="we have not setup fish in CI yet")
def test_fish(activation_tester_class, activation_tester):
class Fish(activation_tester_class):
def __init__(self, session):
diff --git a/tests/unit/discovery/test_discovery.py b/tests/unit/discovery/test_discovery.py
index 770c1cc..e4fe556 100644
--- a/tests/unit/discovery/test_discovery.py
+++ b/tests/unit/discovery/test_discovery.py
@@ -36,6 +36,6 @@ def test_discovery_via_path(monkeypatch, case, special_name_dir, caplog):
def test_discovery_via_path_not_found(tmp_path, monkeypatch):
- monkeypatch.setenv("PATH", str(tmp_path))
+ monkeypatch.setenv(str("PATH"), str(tmp_path))
interpreter = get_interpreter(uuid4().hex)
assert interpreter is None