Server(fix[new_session]): Harden error handling and TMUX env restoration #628
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
new_session()deletesos.environ["TMUX"]before calling tmux but only restores it on the success path — any exception permanently leaks the deletion. This wraps all post-deletion code intry/finally.proc.stdout[0]raises an unhelpfulIndexErrorif tmux produces no output. This adds an explicit guard with a descriptiveLibTmuxException.Split out from #576 — hardening that's independent of the race condition fix itself.
Changes
src/libtmux/server.py:del os.environ["TMUX"]intry/finallyto ensure restoration on any exception (including setup-phase errors likepathlib.Path.expanduser())proc.stdoutwith descriptiveLibTmuxExceptiontests/test_server.py:test_new_session_empty_stdout— verifies error on empty stdouttest_new_session_restores_tmux_env_on_error— verifies TMUX restored after cmd errortest_new_session_restores_tmux_env_on_setup_error— verifies TMUX restored after setup-phase errorTest plan
uv run pytest— 875 passed, 1 skippeduv run ruff check .— all checks passeduv run mypy src tests— no issues