Fix operation log not showing by awaiting screen mount before CLI

Add wait_ready() to OperationLog and await it in all callers before
starting CLI commands. Ensures the modal with spinner is fully rendered
before streaming begins.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
shuki
2026-03-06 03:25:25 +02:00
parent f9981831fa
commit f70ce53dc5
6 changed files with 12 additions and 0 deletions

View File

@@ -69,6 +69,7 @@ class BackupScreen(Screen):
async def _do_backup(self, target: str, remote: str) -> None:
log_screen = OperationLog(f"Backup: {target}")
self.app.push_screen(log_screen)
await log_screen.wait_ready()
args = ["backup", f"--target={target}"]
if remote:
args.append(f"--remote={remote}")
@@ -83,6 +84,7 @@ class BackupScreen(Screen):
async def _do_backup_all(self) -> None:
log_screen = OperationLog("Backup All Targets")
self.app.push_screen(log_screen)
await log_screen.wait_ready()
rc = await stream_cli(log_screen.write, "backup", "--all")
if rc == 0:
log_screen.write("\n[green]All backups completed.[/green]")

View File

@@ -85,6 +85,7 @@ class RemotesScreen(Screen):
async def _test_remote(self, name: str) -> None:
log_screen = OperationLog(f"Testing Remote: {name}")
self.app.push_screen(log_screen)
await log_screen.wait_ready()
rc, stdout, stderr = await run_cli("remotes", "test", f"--name={name}")
if stdout:
log_screen.write(stdout)

View File

@@ -114,6 +114,7 @@ class RestoreScreen(Screen):
async def _do_restore(self, target: str, remote: str, snapshot: str, dest: str) -> None:
log_screen = OperationLog(f"Restore: {target}")
self.app.push_screen(log_screen)
await log_screen.wait_ready()
args = ["restore", f"--target={target}", f"--remote={remote}", f"--snapshot={snapshot}"]
if dest:
args.append(f"--dest={dest}")

View File

@@ -70,6 +70,7 @@ class RetentionScreen(Screen):
async def _do_cleanup(self, target: str) -> None:
log_screen = OperationLog(f"Retention: {target}")
self.app.push_screen(log_screen)
await log_screen.wait_ready()
rc = await stream_cli(log_screen.write, "retention", f"--target={target}")
if rc == 0:
log_screen.write("\n[green]Cleanup completed.[/green]")
@@ -81,6 +82,7 @@ class RetentionScreen(Screen):
async def _do_cleanup_all(self) -> None:
log_screen = OperationLog("Retention: All Targets")
self.app.push_screen(log_screen)
await log_screen.wait_ready()
rc = await stream_cli(log_screen.write, "retention", "--all")
if rc == 0:
log_screen.write("\n[green]All cleanups completed.[/green]")

View File

@@ -220,6 +220,7 @@ class ScheduleScreen(Screen):
async def _install_schedules(self) -> None:
log_screen = OperationLog("Install Schedules")
self.app.push_screen(log_screen)
await log_screen.wait_ready()
rc, stdout, stderr = await run_cli("schedule", "install")
if stdout:
log_screen.write(stdout)
@@ -231,6 +232,7 @@ class ScheduleScreen(Screen):
async def _remove_schedules(self) -> None:
log_screen = OperationLog("Remove Schedules")
self.app.push_screen(log_screen)
await log_screen.wait_ready()
rc, stdout, stderr = await run_cli("schedule", "remove")
if stdout:
log_screen.write(stdout)
@@ -242,6 +244,7 @@ class ScheduleScreen(Screen):
async def _show_crontab(self) -> None:
log_screen = OperationLog("Current Crontab")
self.app.push_screen(log_screen)
await log_screen.wait_ready()
rc, stdout, stderr = await run_cli("schedule", "show")
if stdout:
log_screen.write(stdout)

View File

@@ -46,6 +46,9 @@ class OperationLog(ModalScreen[None]):
else:
log.write(text)
async def wait_ready(self) -> None:
await self._mounted_event.wait()
def finish(self) -> None:
self._running = False
try: