detached ac700d5

fix(tui): prevent race condition where progress messages override summary screen

commit
ac700d5ce90a5f6e2f427e42a11df1fb95714e43
author
brice · · 2026-01-25 18:16 UTC
parent
253778f
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +11 -2
M internal/interfaces/tui/app.go +4 -1
@@ -214,7 +214,10 @@ func (a *App) handleFormInput(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
214214 func (a *App) handleProgressUpdate(msg handlers.ProgressUpdateMsg) (tea.Model, tea.Cmd) {
215215 updatedProgress, cmd := handlers.HandleProgressUpdate(a, msg, a.progressModel)
216216 a.progressModel = updatedProgress
217- a.currentScreen = ScreenProgress
217+ // Don't override summary or error screens with late progress messages
218+ if a.currentScreen != ScreenSummary && a.currentScreen != ScreenError {
219+ a.currentScreen = ScreenProgress
220+ }
218221 return a, cmd
219222 }
220223
@@ -214,7 +214,10 @@ func (a *App) handleFormInput(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
214 func (a *App) handleProgressUpdate(msg handlers.ProgressUpdateMsg) (tea.Model, tea.Cmd) {214 func (a *App) handleProgressUpdate(msg handlers.ProgressUpdateMsg) (tea.Model, tea.Cmd) {
215 updatedProgress, cmd := handlers.HandleProgressUpdate(a, msg, a.progressModel)215 updatedProgress, cmd := handlers.HandleProgressUpdate(a, msg, a.progressModel)
216 a.progressModel = updatedProgress216 a.progressModel = updatedProgress
217- a.currentScreen = ScreenProgress217+ // Don't override summary or error screens with late progress messages
218+ if a.currentScreen != ScreenSummary && a.currentScreen != ScreenError {
219+ a.currentScreen = ScreenProgress
220+ }
218 return a, cmd221 return a, cmd
219 }222 }
220 223
M internal/interfaces/tui/views/summary_view.go +7 -1
@@ -60,9 +60,15 @@ func RenderSummary(im *models.InstallationModelImpl) string {
6060 }
6161
6262 b.WriteString("\n")
63+ b.WriteString(lipgloss.NewStyle().
64+ Bold(true).
65+ Foreground(lipgloss.Color("14")).
66+ Render("You can now reboot into your new system!"))
67+ b.WriteString("\n\n")
68+
6369 b.WriteString(lipgloss.NewStyle().
6470 Faint(true).
65- Render("Press 'q' to exit"))
71+ Render("Press 'q' to exit, then run: reboot"))
6672
6773 return b.String()
6874 }
@@ -60,9 +60,15 @@ func RenderSummary(im *models.InstallationModelImpl) string {
60 }60 }
61 61
62 b.WriteString("\n")62 b.WriteString("\n")
63+ b.WriteString(lipgloss.NewStyle().
64+ Bold(true).
65+ Foreground(lipgloss.Color("14")).
66+ Render("You can now reboot into your new system!"))
67+ b.WriteString("\n\n")
68+
63 b.WriteString(lipgloss.NewStyle().69 b.WriteString(lipgloss.NewStyle().
64 Faint(true).70 Faint(true).
65- Render("Press 'q' to exit"))71+ Render("Press 'q' to exit, then run: reboot"))
66 72
67 return b.String()73 return b.String()
68 }74 }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 0

    ↑↓ moveenter openesc close