From d60c2f06aa95381cf28d51d12293a6a4e93798e3 Mon Sep 17 00:00:00 2001 From: shuki Date: Fri, 6 Mar 2026 21:34:42 +0200 Subject: [PATCH] Add Status column to Logs screen Detects status from log content: Success (backup completed, no errors), Failed (ERROR/FATAL markers), OK (lock released), Interrupted (no clean exit). Co-Authored-By: Claude Opus 4.6 --- tui/screens/logs.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/tui/screens/logs.py b/tui/screens/logs.py index 506cd18..4a40fc0 100644 --- a/tui/screens/logs.py +++ b/tui/screens/logs.py @@ -21,6 +21,26 @@ def _format_log_name(name: str) -> tuple[str, str]: return name, "" +def _detect_log_status(filepath: Path) -> str: + """Determine backup status from log file content.""" + try: + text = filepath.read_text() + except OSError: + return "?" + if not text.strip(): + return "Empty" + has_error = "[ERROR]" in text or "[FATAL]" in text + has_completed = "Backup completed" in text or "Restore completed" in text + has_lock_released = "Lock released" in text + if has_completed and not has_error: + return "Success" + if has_error: + return "Failed" + if has_lock_released: + return "OK" + return "Interrupted" + + class LogsScreen(Screen): BINDINGS = [("escape", "go_back", "Back")] @@ -43,7 +63,7 @@ class LogsScreen(Screen): def _refresh_table(self) -> None: table = self.query_one("#logs-table", DataTable) table.clear(columns=True) - table.add_columns("Date", "Time", "Size") + table.add_columns("Status", "Date", "Time", "Size") log_dir = Path(LOG_DIR) if not log_dir.is_dir(): return @@ -57,7 +77,8 @@ class LogsScreen(Screen): else: size_str = f"{size} B" date_str, time_str = _format_log_name(f.name) - table.add_row(date_str, time_str, size_str, key=f.name) + status = _detect_log_status(f) + table.add_row(status, date_str, time_str, size_str, key=f.name) def _selected_log(self) -> str | None: table = self.query_one("#logs-table", DataTable)