Commit 3f4afd2210

3f4afd2210627e46fd0cea1f5831857af71638f6

parent: 08fa65c1b5

Verified · cmc ci/build: success ci/test: success

cmc <hello@cleberg.net> · 2026-09-11 18:43 UTC

CHANGELOG: v1.19.0
CHANGELOG.org +53
@@ -4,6 +4,59 @@ Versioning follows semver from v0.1.0. Database migrations run
44automatically on daemon start; upgrade notes appear per release when
55anything beyond "replace the binary and restart" is needed.
66
7* v1.19.0 — 2026-09-11
8
9Labels and milestones an org defines once for every repository under
10it, and =Closes owner/name#N= acting across repositories (#203).
11
12** Org labels and milestones
13
14- Migration 0052: =labels= and =milestones= rows belong to a
15 repository or to an org, exactly one, with a partial unique index
16 per scope. Existing rows and their memberships keep their ids.
17- A repository owned by an org sees the org's labels and milestones
18 beside its own; =issue label --add=, =issue milestone= and =mr
19 milestone= resolve the org's row first. A repository cannot create,
20 recolour, remove, close or reopen a name its org holds; the refusal
21 names the org command.
22- =org label set|list|remove= and =org milestone
23 create|list|close|reopen=, for org admins. Creating a name that
24 repositories under the org already use folds them in: their issues
25 and merge requests move to the org's row and the repository rows
26 go. =repo transfer= into an org folds the same way. Counts on org
27 rows span the repositories the caller can read.
28- Web: read-only =/<org>/-/labels= and =/<org>/-/milestones=, linked
29 from the org page; an "org" mark on repository label and milestone
30 pages, whose forms act on repository rows only.
31- =label list= and =milestone list= JSON carry =org: true= on an org
32 row.
33
34** Cross-repository closes
35
36- =Closes owner/name#N= in a commit on the default branch, or in a
37 merged merge request's title or body, closes that issue when the
38 actor holds write on the target and the pushing key's scope allows
39 it: a deploy key never acts outside its binding. An unknown or
40 refused target does nothing and logs nothing; the text stays a
41 plain autolink. An archived target is refused. Bare =owner/name#N=
42 without a keyword stays display-only.
43
44** Store
45
46- A migration whose first line is =-- foreign_keys: off= runs on one
47 pinned connection with foreign keys off, re-enabled afterwards and
48 =foreign_key_check= required empty. Rebuilding a table other tables
49 reference loses the children's rows otherwise, even under
50 =legacy_alter_table=.
51
52** Behaviour changes
53
54- =milestone create= exits 1 on a duplicate title, as =org milestone
55 create= does; it exited 2 before.
56
57Upgrade: replace the binary and restart; migration 0052 runs on
58start and copies every label and milestone row once.
59
760* v1.18.1 — 2026-09-11
861
962A runner that cannot hang on a dead connection, SSH keys with names,