Commit 294f659
authored
Fix race condition in new_session() by avoiding list-sessions query (#625)
new_session() previously used a two-step approach: create the session
with `tmux new-session -P -F#{session_id}`, then immediately query
`list-sessions` to hydrate the returned Session object. In certain
environments (PyInstaller-bundled binaries, Python 3.13+, Docker),
the session was not yet visible to list-sessions, raising
TmuxObjectDoesNotExist.
The fix eliminates the second query entirely. new_session() now passes
the full Obj format string to `new-session -P` and constructs the
Session directly from that output — one subprocess call, no race.
Changes:
- Server.new_session(): use full -F format string; parse -P output
directly into Session without a follow-up list-sessions query
- neo.py: extract get_output_format() (@functools.cache) and
parse_output() helpers; refactor fetch_objs() to use them;
switch parse_output() to zip(strict=True) after stripping the
trailing separator element for fail-fast mismatch detection
- server.py: wrap TMUX env var removal in try/finally to guarantee
restoration on exception
- tests: add test_new_session_returns_populated_session() asserting
session_id, session_name, window_id, and pane_id are all populated
Fixes #624. Thank you @neubig!4 files changed
Lines changed: 173 additions & 55 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
39 | 59 | | |
40 | 60 | | |
41 | 61 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| 6 | + | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
| |||
177 | 178 | | |
178 | 179 | | |
179 | 180 | | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
180 | 246 | | |
181 | 247 | | |
182 | 248 | | |
183 | 249 | | |
184 | 250 | | |
185 | | - | |
186 | | - | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
187 | 290 | | |
188 | 291 | | |
189 | 292 | | |
190 | 293 | | |
191 | 294 | | |
192 | 295 | | |
193 | 296 | | |
194 | | - | |
195 | 297 | | |
196 | 298 | | |
197 | 299 | | |
| |||
201 | 303 | | |
202 | 304 | | |
203 | 305 | | |
204 | | - | |
| 306 | + | |
205 | 307 | | |
206 | 308 | | |
207 | 309 | | |
208 | 310 | | |
209 | 311 | | |
210 | 312 | | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | | - | |
218 | | - | |
219 | | - | |
| 313 | + | |
220 | 314 | | |
221 | 315 | | |
222 | 316 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
| 22 | + | |
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| |||
539 | 539 | | |
540 | 540 | | |
541 | 541 | | |
542 | | - | |
543 | | - | |
544 | | - | |
545 | | - | |
| 542 | + | |
| 543 | + | |
546 | 544 | | |
547 | | - | |
548 | | - | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
549 | 549 | | |
550 | | - | |
551 | | - | |
| 550 | + | |
| 551 | + | |
552 | 552 | | |
553 | | - | |
554 | | - | |
555 | | - | |
| 553 | + | |
| 554 | + | |
556 | 555 | | |
557 | | - | |
558 | | - | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
559 | 559 | | |
560 | | - | |
561 | | - | |
| 560 | + | |
| 561 | + | |
562 | 562 | | |
563 | | - | |
564 | | - | |
| 563 | + | |
| 564 | + | |
565 | 565 | | |
566 | | - | |
567 | | - | |
568 | | - | |
| 566 | + | |
| 567 | + | |
569 | 568 | | |
570 | | - | |
571 | | - | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
572 | 572 | | |
573 | | - | |
| 573 | + | |
| 574 | + | |
574 | 575 | | |
575 | | - | |
576 | | - | |
| 576 | + | |
577 | 577 | | |
578 | | - | |
| 578 | + | |
| 579 | + | |
579 | 580 | | |
580 | | - | |
581 | | - | |
582 | | - | |
583 | | - | |
584 | | - | |
585 | | - | |
586 | | - | |
587 | | - | |
588 | | - | |
589 | | - | |
| 581 | + | |
590 | 582 | | |
591 | | - | |
592 | | - | |
593 | | - | |
594 | | - | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
595 | 590 | | |
596 | 591 | | |
597 | 592 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
107 | 116 | | |
108 | 117 | | |
109 | 118 | | |
| |||
0 commit comments