Commit d0cfea951a

d0cfea951af65c20682f35a5b7541311aa354c06

parent: 2c05bd72c8

Verified · cmc

cmc <hello@cleberg.net> · 2026-09-04 17:15 UTC

Parity, API, Admin: issue and MR search, draft merge requests, the event list, runner -jobs

Layout: unified · split

API.org +25 −3
@@ -128,9 +128,31 @@ gitbay webhook remove <id>
128 128
129** Events 129** Events
130 130
131=push= (data: ref, old, new, forced, deleted), =issue.created=, 131Every event this forge records, and so every name =--events= may take.
132=issue.commented=, =issue.closed=, =issue.open=, =mr.created=, 132The server holds the same list as =control.EventKinds=, and a test
133=mr.merged= (data: number, sha), =repo.imported= (data: from). 133fails if the code emits something not listed or lists something it never
134emits — so this is the whole set, not a sample. =webhook add= refuses a
135name that is not one of them, since a subscription to a typo would
136silently never fire.
137
138- repository: =push= (ref, old, new, forced, deleted), =repo.archived=,
139 =repo.unarchived=, =repo.imported= (from)
140- issues: =issue.created=, =issue.edited=, =issue.commented=,
141 =issue.closed=, =issue.open=, =issue.labeled= (labels),
142 =issue.assigned= (assignees), =issue.milestoned= (milestone)
143- merge requests: =mr.created=, =mr.edited=, =mr.commented=,
144 =mr.reviewed= (verdict), =mr.draft= (draft), =mr.retargeted= (from,
145 to), =mr.milestoned= (milestone), =mr.merged= (number, sha),
146 =mr.closed=
147- releases: =release.created= (tag), =release.deleted= (tag)
148- CI: =status=, =build.success=, =build.failure=, =build.cancelled=
149
150Every payload carries =number= where it names an issue or merge request.
151
152There is deliberately no =repo.deleted=. Both =events.repo_id= and
153=webhooks.repo_id= cascade from =repos=, so recording one would delete
154it — and every webhook that could have received it — in the same
155statement. A repository's deletion is visible in the audit log.
134 156
135** Delivery 157** Delivery
136 158
Admin.org +11 −1
@@ -328,7 +328,17 @@ rm /tmp/ci-bootstrap /tmp/ci-bootstrap.pub
328gitbay-runner -remote git@127.0.0.1 -workdir /var/lib/gitbay-runner/work 328gitbay-runner -remote git@127.0.0.1 -workdir /var/lib/gitbay-runner/work
329#+end_src 329#+end_src
330 330
331=admin runners= shows which account each runner polls as; an admin key 331=-jobs N= runs N builds at once. Claiming is one transaction that
332selects and updates, and each build works in its own =build-<id>=
333directory, so workers do not collide; idle polls are staggered across
334the interval so N of them do not wake together. The drop-in's weights
335below are per service, not per build, so raising =-jobs= divides them
336rather than multiplying the host's load.
337
338=admin runners= shows which account each runner polls as, and what each
339is scoped to. A runner with no scope claims builds for *any*
340repository, which on an instance with open registration means running a
341stranger's steps; scope one with =-repos owner/name=. An admin key
332still works for the protocol during a rotation. A merge request head 342still works for the protocol during a rotation. A merge request head
333from a fork is built in the target repository as untrusted: the claim 343from a fork is built in the target repository as untrusted: the claim
334carries no secrets. Same-repository heads were built by their branch 344carries no secrets. Same-repository heads were built by their branch
Parity.org +21 −5
@@ -40,6 +40,8 @@ browser-only and the iOS build screen unable to say more than the log.
40| merge (all strategies) | yes | yes | yes | 40| merge (all strategies) | yes | yes | yes |
41| close | yes | yes | yes | 41| close | yes | yes | yes |
42| create | yes | yes | yes | 42| create | yes | yes | yes |
43| draft, ready | yes | yes | no |
44| search title and body | yes | yes | no |
43| create from a fork | yes | no | yes | 45| create from a fork | yes | no | yes |
44| retarget | yes | yes | no | 46| retarget | yes | yes | no |
45| milestone | yes | yes | yes | 47| milestone | yes | yes | yes |
@@ -63,6 +65,16 @@ refused while anything is stacked on the merge request, since it would
63rewrite the commits the stack builds on. The iOS client renders the 65rewrite the commits the stack builds on. The iOS client renders the
64retarget but has no stack view yet. 66retarget but has no stack view yet.
65 67
68A draft merge request is open but not asking: it does not merge, and it
69does not appear in anyone's review queue. Draft is a flag rather than a
70fifth state, so every =state = 'open'= rule still means what it did.
71Batched review and range-diff (krz/gitbay#111) are not built.
72
73Nothing asks a *particular* person for a review. The review queue is
74computed from involvement — what you own, are granted, or reach through
75an org or team — so a collaborator with write access who has not touched
76a thread hears nothing until they do (krz/gitbay#145).
77
66Creating from a fork works anywhere the source can be typed as 78Creating from a fork works anywhere the source can be typed as
67=owner/name:branch=; only the web lacks it. Retargeting moves an open 79=owner/name:branch=; only the web lacks it. Retargeting moves an open
68merge request onto another branch of the same repository and stales the 80merge request onto another branch of the same repository and stales the
@@ -74,6 +86,7 @@ reviews, since an approval was of the diff against the old branch.
74|---------------------+-----+-----+-----| 86|---------------------+-----+-----+-----|
75| read, list, filter | yes | yes | yes | 87| read, list, filter | yes | yes | yes |
76| filter by label, assignee, author, milestone | yes | yes | no | 88| filter by label, assignee, author, milestone | yes | yes | no |
89| search title and body | yes | yes | no |
77| create | yes | yes | yes | 90| create | yes | yes | yes |
78| comment | yes | yes | yes | 91| comment | yes | yes | yes |
79| edit title and body | yes | yes | yes | 92| edit title and body | yes | yes | yes |
@@ -183,11 +196,14 @@ now render the way the reference does. go-org is not yet on the corpus.
183| command reference | yes | no | n/a | 196| command reference | yes | no | n/a |
184 197
185=explore= is the listing without a query; =repo search= is the one with. 198=explore= is the listing without a query; =repo search= is the one with.
186=search= is both plus issue and merge request titles, over everything 199=search= is both plus the title and body of every issue and merge
187the caller can read; the web serves it at =/search= with a field in the 200request the caller can read, over FTS5; the web serves it at =/search=
188rail, and an anonymous visitor gets the public rows from the same query. 201with a field in the rail, and an anonymous visitor gets the public rows
189Titles only — body search wants FTS5 and belongs with krz/gitbay#114. 202from the same query. =issue list --search= and =mr list --search= narrow
190=repo grep= remains the per-repository file-contents search. 203one repository. What someone types is quoted term by term, so an FTS5
204operator — =c++=, =AND=, a lone quote — is a word to match and never a
205syntax error. =repo grep= remains the per-repository file-contents
206search.
191 207
192About text renders as markdown or org-mode per the =about_format= it 208About text renders as markdown or org-mode per the =about_format= it
193was stored with. The iOS =Profile= decoder lists its keys explicitly, 209was stored with. The iOS =Profile= decoder lists its keys explicitly,