fix(terminal): avoid merging heredoc EOF with fence wrapper (#3598)
One-shot local execution built `printf FENCE; <cmd>; __hermes_rc=...`, so a command ending in a heredoc produced a closing line like `EOF; __hermes_rc=...`, which is not a valid delimiter. Bash then treated the rest of the wrapper as heredoc body, leaking it into tool output (e.g. gh issue/PR flows). Use newline-separated wrapper lines so the delimiter stays alone and the trailer runs after the heredoc completes. Co-authored-by: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com>
This commit is contained in:
@@ -63,6 +63,18 @@ class TestLocalOneShotRegression:
|
|||||||
assert r["output"].strip() == ""
|
assert r["output"].strip() == ""
|
||||||
env.cleanup()
|
env.cleanup()
|
||||||
|
|
||||||
|
def test_oneshot_heredoc_does_not_leak_fence_wrapper(self):
|
||||||
|
"""Heredoc closing line must not be merged with the fence wrapper tail."""
|
||||||
|
env = LocalEnvironment(persistent=False)
|
||||||
|
cmd = "cat <<'H_EOF'\nheredoc body line\nH_EOF"
|
||||||
|
r = env.execute(cmd)
|
||||||
|
env.cleanup()
|
||||||
|
assert r["returncode"] == 0
|
||||||
|
assert "heredoc body line" in r["output"]
|
||||||
|
assert "__hermes_rc" not in r["output"]
|
||||||
|
assert "printf '" not in r["output"]
|
||||||
|
assert "exit $" not in r["output"]
|
||||||
|
|
||||||
|
|
||||||
class TestLocalPersistent:
|
class TestLocalPersistent:
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|||||||
@@ -391,12 +391,17 @@ class LocalEnvironment(PersistentShellMixin, BaseEnvironment):
|
|||||||
effective_stdin = stdin_data
|
effective_stdin = stdin_data
|
||||||
|
|
||||||
user_shell = _find_bash()
|
user_shell = _find_bash()
|
||||||
|
# Newline-separated wrapper (not `cmd; __hermes_rc=...` on one line).
|
||||||
|
# A trailing `; __hermes_rc` glued to `<<EOF` / a closing `EOF` line breaks
|
||||||
|
# heredoc parsing: the delimiter must be alone on its line, otherwise the
|
||||||
|
# rest of this script becomes heredoc body and leaks into stdout (e.g. gh
|
||||||
|
# issue/PR flows that use here-documents for bodies).
|
||||||
fenced_cmd = (
|
fenced_cmd = (
|
||||||
f"printf '{_OUTPUT_FENCE}';"
|
f"printf '{_OUTPUT_FENCE}'\n"
|
||||||
f" {exec_command};"
|
f"{exec_command}\n"
|
||||||
f" __hermes_rc=$?;"
|
f"__hermes_rc=$?\n"
|
||||||
f" printf '{_OUTPUT_FENCE}';"
|
f"printf '{_OUTPUT_FENCE}'\n"
|
||||||
f" exit $__hermes_rc"
|
f"exit $__hermes_rc\n"
|
||||||
)
|
)
|
||||||
run_env = _make_run_env(self.env)
|
run_env = _make_run_env(self.env)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user