From 88066b86c204c0124c269a94249bc5bed1feb788 Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Tue, 24 Jul 2018 20:07:39 +0800 Subject: [PATCH 1/3] Format --- pipenv/shells.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/pipenv/shells.py b/pipenv/shells.py index 02c9d951..17a4d871 100644 --- a/pipenv/shells.py +++ b/pipenv/shells.py @@ -193,12 +193,18 @@ class CmderPowershell(Shell): SHELL_LOOKUP = collections.defaultdict( lambda: collections.defaultdict(lambda: Shell), { - "bash": collections.defaultdict(lambda: Bash), - "cmd": collections.defaultdict(lambda: Shell, {"cmder": CmderCommandPrompt}), - "powershell": collections.defaultdict( - lambda: Shell, {"cmder": CmderPowershell} + "bash": collections.defaultdict( + lambda: Bash, + ), + "cmd": collections.defaultdict( + lambda: Shell, {"cmder": CmderCommandPrompt}, + ), + "powershell": collections.defaultdict( + lambda: Shell, {"cmder": CmderPowershell}, + ), + "pwsh": collections.defaultdict( + lambda: Shell, {"cmder": CmderPowershell}, ), - "pwsh": collections.defaultdict(lambda: Shell, {"cmder": CmderPowershell}), }, ) From bcce22ffca9a10bbe70515f1484e60f567987922 Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Tue, 24 Jul 2018 20:08:15 +0800 Subject: [PATCH 2/3] Implement MSYS Bash --- pipenv/shells.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/pipenv/shells.py b/pipenv/shells.py index 17a4d871..ed2690ac 100644 --- a/pipenv/shells.py +++ b/pipenv/shells.py @@ -134,6 +134,9 @@ def _iter_python(venv): class Bash(Shell): + def _format_path(self, python): + return python.parent.as_posix() + # The usual PATH injection technique does not work with Bash. # https://github.com/berdario/pew/issues/58#issuecomment-102182346 @contextlib.contextmanager @@ -146,15 +149,25 @@ class Bash(Shell): base_rc_src = 'source "{0}"\n'.format(bashrc_path.as_posix()) rcfile.write(base_rc_src) - export_path = 'export PATH="{0}:$PATH"\n'.format( - ":".join(python.parent.as_posix() for python in _iter_python(venv)) - ) + export_path = 'export PATH="{0}:$PATH"\n'.format(":".join( + self._format_path(python) + for python in _iter_python(venv) + )) rcfile.write(export_path) rcfile.flush() self.args.extend(["--rcfile", rcfile.name]) yield +class MsysBash(Bash): + def _format_path(self, python): + s = super(MsysBash, self)._format_path(python) + if not python.drive: + return s + # Convert "C:/something" to "/c/something". + return '/{drive}{path}'.format(drive=s[0].lower(), path=s[2:]) + + class CmderEmulatedShell(Shell): def fork(self, venv, cwd, args): if cwd: @@ -194,7 +207,7 @@ SHELL_LOOKUP = collections.defaultdict( lambda: collections.defaultdict(lambda: Shell), { "bash": collections.defaultdict( - lambda: Bash, + lambda: Bash, {"msys": MsysBash}, ), "cmd": collections.defaultdict( lambda: Shell, {"cmder": CmderCommandPrompt}, From 4a6f071cfec0690a374f0240e5bfdb21aa1c1137 Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Tue, 24 Jul 2018 20:20:20 +0800 Subject: [PATCH 3/3] Improve emulator detection for multiple values Running MSYS inside Cmder now returns "cmder,msys", and can look up the shell correctly. --- pipenv/shells.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pipenv/shells.py b/pipenv/shells.py index ed2690ac..10826f22 100644 --- a/pipenv/shells.py +++ b/pipenv/shells.py @@ -223,12 +223,20 @@ SHELL_LOOKUP = collections.defaultdict( def _detect_emulator(): + keys = [] if os.environ.get("CMDER_ROOT"): - return "cmder" - return "" + keys.append("cmder") + if os.environ.get("MSYSTEM"): + keys.append("msys") + return ",".join(keys) def choose_shell(): emulator = PIPENV_EMULATOR.lower() or _detect_emulator() type_, command = detect_info() - return SHELL_LOOKUP[type_][emulator](command) + shell_types = SHELL_LOOKUP[type_] + for key in emulator.split(","): + key = key.strip().lower() + if key in shell_types: + return shell_types[key](command) + return shell_types[""](command)