From edf9c75621e6b50c912b77b86b13543008f47f80 Mon Sep 17 00:00:00 2001 From: Yoimex Date: Sat, 25 Apr 2026 07:56:29 +0300 Subject: [PATCH] fix(env): pass -- to cd for hyphen-prefixed workdirs --- tests/tools/test_base_environment.py | 21 ++++++++++++++------- tools/environments/base.py | 3 ++- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/tests/tools/test_base_environment.py b/tests/tools/test_base_environment.py index 28ce08e840..eb3661cafd 100644 --- a/tests/tools/test_base_environment.py +++ b/tests/tools/test_base_environment.py @@ -30,7 +30,7 @@ class TestWrapCommand: wrapped = env._wrap_command("echo hello", "/tmp") assert "source" in wrapped - assert "cd /tmp" in wrapped or "cd '/tmp'" in wrapped + assert "cd -- /tmp" in wrapped or "cd -- '/tmp'" in wrapped assert "eval 'echo hello'" in wrapped assert "__hermes_ec=$?" in wrapped assert "export -p >" in wrapped @@ -57,24 +57,31 @@ class TestWrapCommand: env._snapshot_ready = True wrapped = env._wrap_command("ls", "~") - assert "cd ~" in wrapped - assert "cd '~'" not in wrapped + assert "cd -- ~" in wrapped + assert "cd -- '~'" not in wrapped def test_tilde_subpath_with_spaces_uses_home_and_quotes_suffix(self): env = _TestableEnv() env._snapshot_ready = True wrapped = env._wrap_command("ls", "~/my repo") - assert "cd $HOME/'my repo'" in wrapped - assert "cd ~/my repo" not in wrapped + assert "cd -- $HOME/'my repo'" in wrapped + assert "cd -- ~/my repo" not in wrapped def test_tilde_slash_maps_to_home(self): env = _TestableEnv() env._snapshot_ready = True wrapped = env._wrap_command("ls", "~/") - assert "cd $HOME" in wrapped - assert "cd ~/" not in wrapped + assert "cd -- $HOME" in wrapped + assert "cd -- ~/" not in wrapped + + def test_hyphen_prefixed_workdir_is_passed_after_double_dash(self): + env = _TestableEnv() + env._snapshot_ready = True + wrapped = env._wrap_command("pwd", "-demo") + + assert "builtin cd -- -demo || exit 126" in wrapped def test_cd_failure_exit_126(self): env = _TestableEnv() diff --git a/tools/environments/base.py b/tools/environments/base.py index 2f565fe5f8..3f21f1294b 100644 --- a/tools/environments/base.py +++ b/tools/environments/base.py @@ -405,7 +405,8 @@ class BaseEnvironment(ABC): # Preserve bare ``~`` expansion, but rewrite ``~/...`` through # ``$HOME`` so suffixes with spaces remain a single shell word. quoted_cwd = self._quote_cwd_for_cd(cwd) - parts.append(f"builtin cd {quoted_cwd} || exit 126") + # ``--`` keeps hyphen-prefixed directory names from being parsed as options. + parts.append(f"builtin cd -- {quoted_cwd} || exit 126") # Run the actual command parts.append(f"eval '{escaped}'")