Show the run log's last lines under Details, live

The percentage says an update is alive. It does not say what it is alive
doing, and for the longest stretch of a run there was no way to find out:
an AUR package compiling for a quarter of an hour talks constantly, and
every word of it went into a file nobody was looking at.

So the run log's last five lines now travel with the progress entry and
sit under Details, refreshed every two seconds for as long as the update
lasts. Polled rather than followed, for the same reason the pacman
watcher polls: only the last few lines are ever displayed, so every line
in between would be work nobody sees, and re-reading the tail whole makes
truncation and rotation of the log a non-event.

The job model behind this interface carries exactly two description
fields - descriptionValue1 and 2, there is no third - so one stays with
the package being worked on and the other takes the tail. Newlines inside
a field do render, which is what lets five lines share one of them. They
travel tab separated because the protocol is one instruction per line,
and a tab inside a log line becomes a space first: either renders as
whitespace, but a line split in half renders as nonsense. Five lines
clipped to 120 columns also keeps an instruction well inside PIPE_BUF,
which is what makes the write atomic against the runner sending its own
progress down the same pipe.
This commit is contained in:
Felitendo committed 2026-08-20 19:55:43 +02:00
1 parent f9cd8a0ace
commit c8666da714
7 files changed
+118 -2

No files matched your search

+8
View File
@@ -228,6 +228,14 @@ Two things about how it is put together:
instead of leaping 30% the moment unpacking starts — and likewise for AUR
with nothing pending, or a machine with no Flatpaks. The weights only ever
have to be right about the steps that actually run.
- **Expanding *Details* shows the run log's last five lines, live.** The
percentage says the update is alive; these say what it is alive doing. It
matters most where there is nothing to count — an AUR package compiling for
a quarter of an hour talks constantly, and all of it used to go into a file
nobody was looking at. The job model behind this interface carries exactly
two description fields (`descriptionValue1` and `2` — there is no third), so
one holds the current package and the other the tail; newlines inside a value
do render, which is what makes five lines fit in one field.
- pacman's output is line-buffered through `stdbuf`. Writing to a log rather
than a terminal, libc would hand it over in 4 KB blocks instead, and 4 KB of
`upgrading foo...` is on the order of a hundred and sixty packages arriving