From 9c5e3781c7bcd43ab4deeec9dba8983ed74c1f08 Mon Sep 17 00:00:00 2001 From: GitHub Copilot Date: Sat, 31 Jan 2026 10:14:39 +0000 Subject: [PATCH] Support {container} placeholder in WEBTERM_DOCKER_AUTO_COMMAND Allows per-container customization of the auto command. For example: WEBTERM_DOCKER_AUTO_COMMAND='tmux new-session -ADs {container}' This creates a tmux session named after the container instead of using a fixed session name for all containers. --- src/webterm/session_manager.py | 5 ++++- tests/test_session_manager.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/webterm/session_manager.py b/src/webterm/session_manager.py index e95b897..093eb51 100644 --- a/src/webterm/session_manager.py +++ b/src/webterm/session_manager.py @@ -139,9 +139,12 @@ class SessionManager: return None if app.command == AUTO_COMMAND_SENTINEL: docker_user = os.environ.get("WEBTERM_DOCKER_USERNAME") + # Support {container} placeholder in auto command for per-container customization + # e.g., WEBTERM_DOCKER_AUTO_COMMAND="tmux new-session -ADs {container}" + auto_cmd = _get_auto_command().replace("{container}", app.name) exec_spec = DockerExecSpec( container=app.name, - command=shlex.split(_get_auto_command()), + command=shlex.split(auto_cmd), user=docker_user, ) session_process = DockerExecSession(self.poller, session_id, exec_spec) diff --git a/tests/test_session_manager.py b/tests/test_session_manager.py index eedcbaa..a9ab00f 100644 --- a/tests/test_session_manager.py +++ b/tests/test_session_manager.py @@ -241,6 +241,37 @@ class TestSessionManager: assert isinstance(result, DockerExecSession) assert result.exec_spec.user == "testuser" + @pytest.mark.asyncio + @pytest.mark.skipif(platform.system() == "Windows", reason="Terminal not supported on Windows") + async def test_new_docker_exec_session_container_placeholder( + self, mock_poller, mock_path, monkeypatch + ): + """Test that {container} placeholder in auto command is replaced with container name.""" + from webterm.docker_exec_session import DockerExecSession + + monkeypatch.setenv("WEBTERM_DOCKER_AUTO_COMMAND", "tmux new-session -ADs {container}") + + app = App( + name="my-webapp", + slug="my-webapp", + path="./", + command=AUTO_COMMAND_SENTINEL, + terminal=True, + ) + manager = SessionManager(mock_poller, mock_path, [app]) + + with patch.object(DockerExecSession, "open", new_callable=AsyncMock): + result = await manager.new_session( + "my-webapp", + SessionID("test-session"), + RouteKey("test-route"), + ) + + assert result is not None + assert isinstance(result, DockerExecSession) + # Verify the container name was substituted into the command + assert result.exec_spec.command == ["tmux", "new-session", "-ADs", "my-webapp"] + class TestSessionManagerRoutes: """Tests for SessionManager route handling."""