]> git.kaiwu.me - haproxy.git/commit
DEV: patchbot: let the page fetch the shared review state
authorWilly Tarreau <w@1wt.eu>
Mon, 6 Jul 2026 14:26:45 +0000 (16:26 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 7 Jul 2026 12:43:28 +0000 (14:43 +0200)
commit635d91aad92a341ff5f80d10908a19140cee3ac1
tree8ee4878edd2d5ba8fe3c43ba459d0486d8ffbb5f
parentfcbea9e0d02328d26f673589f0bb47d2839fd666
DEV: patchbot: let the page fetch the shared review state

This adds the read side of the review syncing to the generated page: a
"Get updates" button at the top right retrieves the shared state from
update.cgi (reached by a bare relative URL, so it must be in a cgi-bin
directory next to the page) and applies it. Nothing is fetched
automatically, not even at load time: it's up to the user to explicitly
click to resynchronize, and without it (or with the server down) the
page keeps behaving fully standalone as today.

Three states exist per line to make this work. The original state is
the verdict the bot chose, captured at load time and constant. The
reference state is the last known shared state, on top of which the
user's edits sit; it starts equal to the original. The local state is
the DOM itself (the checked radios). Applying a fetched overlay
recomputes every line's reference as "the server's entry if any,
otherwise the bot's verdict", so a removed override properly falls back
to the original; the reference always advances but the displayed state
only moves where the user had no local edit: local edits win, and
re-applying the same overlay twice changes nothing.

The received commit ids are resolved exactly first, then by symmetric
prefix (one id being a prefix of the other, for mixed-length ids), first
line wins. The shared notes land in a dedicated container below the AI
explanation, rendered via innerText (no HTML injection) and replaced
wholesale so the operation stays idempotent; entries for commits absent
from the page are simply ignored.

The whole exchange was tested with the real generated page's scripts
running against a stubbed DOM covering load capture, prefix resolution,
adopt-vs-keep on both changed and disappeared entries, idempotent
re-application, and silent degradation on fetch failure.
dev/patchbot/scripts/post-ai.sh