Skip to content

Commit

Permalink
env/run: ensure all args are quoted as required
Browse files Browse the repository at this point in the history
  • Loading branch information
abn committed Oct 1, 2020
1 parent 51d4b5a commit 598503e
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 16 deletions.
25 changes: 9 additions & 16 deletions poetry/utils/_compat.py
Expand Up @@ -46,15 +46,11 @@

WINDOWS = sys.platform == "win32"

if PY2:
import pipes

shell_quote = pipes.quote
else:
import shlex

shell_quote = shlex.quote

try:
from shlex import quote
except ImportError:
# PY2
from pipes import quote # noqa

if PY34:
from importlib.machinery import EXTENSION_SUFFIXES
Expand Down Expand Up @@ -288,10 +284,7 @@ def to_str(string):


def list_to_shell_command(cmd):
executable = cmd[0]

if " " in executable:
executable = '"{}"'.format(executable)
cmd[0] = executable

return " ".join(cmd)
return " ".join(
'"{}"'.format(token) if " " in token and token[0] not in {"'", '"'} else token
for token in cmd
)
21 changes: 21 additions & 0 deletions tests/utils/test_env.py
Expand Up @@ -15,6 +15,7 @@
from poetry.factory import Factory
from poetry.utils._compat import PY2
from poetry.utils._compat import Path
from poetry.utils.env import GET_BASE_PREFIX
from poetry.utils.env import EnvCommandError
from poetry.utils.env import EnvManager
from poetry.utils.env import NoCompatiblePythonVersionFound
Expand Down Expand Up @@ -74,6 +75,26 @@ def test_virtualenvs_with_spaces_in_their_path_work_as_expected(tmp_dir, manager
assert venv.run("python", "-V", shell=True).startswith("Python")


def test_env_commands_with_spaces_in_their_arg_work_as_expected(tmp_dir, manager):
venv_path = Path(tmp_dir) / "Virtual Env"
manager.build_venv(str(venv_path))
venv = VirtualEnv(venv_path)
assert venv.run("python", venv.pip, "--version", shell=True).startswith(
"pip {} from ".format(venv.pip_version)
)


def test_env_shell_commands_with_stdinput_in_their_arg_work_as_expected(
tmp_dir, manager
):
venv_path = Path(tmp_dir) / "Virtual Env"
manager.build_venv(str(venv_path))
venv = VirtualEnv(venv_path)
assert venv.run("python", "-", input_=GET_BASE_PREFIX, shell=True).strip() == str(
venv.get_base_prefix()
)


@pytest.fixture
def in_project_venv_dir(poetry):
os.environ.pop("VIRTUAL_ENV", None)
Expand Down

0 comments on commit 598503e

Please sign in to comment.