Skip to content

Conversation

@tony
Copy link
Member

@tony tony commented Feb 9, 2026

Summary

  • new_session() deletes os.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 in try/finally.
  • proc.stdout[0] raises an unhelpful IndexError if tmux produces no output. This adds an explicit guard with a descriptive LibTmuxException.

Split out from #576 — hardening that's independent of the race condition fix itself.

Changes

src/libtmux/server.py:

  • Wrap all code after del os.environ["TMUX"] in try/finally to ensure restoration on any exception (including setup-phase errors like pathlib.Path.expanduser())
  • Guard against empty proc.stdout with descriptive LibTmuxException

tests/test_server.py:

  • test_new_session_empty_stdout — verifies error on empty stdout
  • test_new_session_restores_tmux_env_on_error — verifies TMUX restored after cmd error
  • test_new_session_restores_tmux_env_on_setup_error — verifies TMUX restored after setup-phase error

Test plan

  • uv run pytest — 875 passed, 1 skipped
  • uv run ruff check . — all checks passed
  • uv run mypy src tests — no issues

why: new_session() deletes os.environ["TMUX"] before calling tmux but
only restores it on the success path — any exception permanently leaks
the deletion. Additionally, proc.stdout[0] raises an unhelpful
IndexError if tmux produces no output.
what:
- Wrap all code after del os.environ["TMUX"] in try/finally to ensure
  restoration on any exception (including setup-phase errors)
- Guard against empty proc.stdout with descriptive LibTmuxException
- Add tests for empty stdout, TMUX env restoration on cmd errors,
  and TMUX env restoration on setup-phase errors
- Document monkeypatch usage in test docstrings per CLAUDE.md
@codecov
Copy link

codecov bot commented Feb 9, 2026

Codecov Report

❌ Patch coverage is 82.75862% with 5 lines in your changes missing coverage. Please review.
✅ Project coverage is 45.76%. Comparing base (9da19ba) to head (a74c602).

Files with missing lines Patch % Lines
src/libtmux/server.py 82.75% 2 Missing and 3 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #628      +/-   ##
==========================================
+ Coverage   45.39%   45.76%   +0.36%     
==========================================
  Files          22       22              
  Lines        2249     2253       +4     
  Branches      360      361       +1     
==========================================
+ Hits         1021     1031      +10     
+ Misses       1082     1077       -5     
+ Partials      146      145       -1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant