Keep session manager open on launch failure

This commit is contained in:
2026-09-12 18:25:39 +00:00
parent e5c5c3015f
commit d6697d46f8
5 changed files with 217 additions and 42 deletions
+49
View File
@@ -316,6 +316,55 @@ class SelectorCatalogTests(unittest.TestCase):
class SelectorActionTests(unittest.TestCase):
def test_open_failure_stays_in_context_and_retry_can_succeed(self) -> None:
with tempfile.TemporaryDirectory() as directory:
attempts: list[SelectorResult] = []
def activate(result: SelectorResult) -> None:
attempts.append(result)
if len(attempts) == 1:
raise RuntimeError(
"Bad owner or permissions on /etc/ssh/ssh_config"
)
selector = SessionSelector(
[
CatalogWindow(
"@1",
"remote:pi:default",
"pi",
True,
False,
kind="remote",
target="pi",
session="default",
)
],
RemoteRegistry(Path(directory) / "remotes.json"),
"/missing/ssh",
activate_handler=activate,
)
self.addCleanup(selector.pool.close)
row = next(
item
for item in selector._rows() # type: ignore[attr-defined]
if item.key == "window:@1"
)
self.assertIsNone(selector._activate(row)) # type: ignore[attr-defined]
self.assertEqual(selector.view, "actions")
self.assertIn("打开失败", selector.message)
self.assertIn("ssh_config", selector.context_row.error)
retry = next(
item
for item in selector._rows() # type: ignore[attr-defined]
if item.kind == "action-window"
)
self.assertEqual(selector.selected_key, retry.key)
self.assertFalse(selector._activate(retry)) # type: ignore[attr-defined]
self.assertEqual(len(attempts), 2)
def test_search_is_explicit_and_escape_preserves_selection(self) -> None:
with tempfile.TemporaryDirectory() as directory:
window = CatalogWindow(
+16 -1
View File
@@ -28,7 +28,8 @@ class TmuxIntegrationTests(unittest.TestCase):
self.fake_herdr.write_text(
"#!/bin/sh\n"
"if [ \"${1:-}\" = \"--session\" ] && [ \"${2:-}\" = \"dead\" ]; then\n"
" exit 0\n"
" printf '%s\\n' 'fake startup failure' >&2\n"
" exit 7\n"
"fi\n"
"exec sleep 30\n",
encoding="utf-8",
@@ -219,6 +220,20 @@ class TmuxIntegrationTests(unittest.TestCase):
self.hub.reconnect(window.window_id)
self.assertIsNotNone(self.hub.window_for_key("local:dead"))
def test_startup_verification_reports_immediate_process_failure(self) -> None:
self.hub.ensure_server()
with self.assertRaisesRegex(HubError, "fake startup failure"):
self.hub.activate_endpoint(
Endpoint.local("dead"),
str(self.fake_herdr),
verify_startup=True,
)
failed = self.hub.window_for_key("local:dead")
self.assertIsNotNone(failed)
assert failed is not None
self.assertTrue(failed.dead)
def test_alias_is_applied_immediately_and_can_be_reset(self) -> None:
self.hub.aliases["remote:orangepi:work"] = "客厅开发"
self.hub.ensure_server()