Commit 8839e2cc95
Verified · cmc ci/build: success ci/test: success ci/vuln: success
Layout: unified · split
CHANGELOG.org +56
| @@ -4,6 +4,62 @@ Versioning follows semver from v0.1.0. Database migrations run | ||
| 4 | 4 | automatically on daemon start; upgrade notes appear per release when |
| 5 | 5 | anything beyond "replace the binary and restart" is needed. |
| 6 | 6 | |
| 7 | * v1.12.0 — 2026-09-04 | |
| 8 | ||
| 9 | The store and the push path. Dashboard queries walk an index instead of | |
| 10 | sorting the table, concurrent writers wait instead of failing, expired | |
| 11 | rows are swept, and a large first push no longer forks a process per | |
| 12 | commit. | |
| 13 | ||
| 14 | - Every dashboard list scanned its table and sorted the result to take | |
| 15 | fifty rows. Reachability is correlated subqueries and cannot be | |
| 16 | indexed; the index supplies the =ORDER BY= instead, so the walk stops | |
| 17 | at =LIMIT=. On 20k issues and 20k merge requests: open issues 11.8ms | |
| 18 | to 0.8ms, open merge requests 12.1ms to 0.8ms, the review queue 15.5ms | |
| 19 | to 0.3ms, assigned issues 10.6ms to 0.04ms. The last of those also | |
| 20 | drives from =issue_assignees= rather than testing =EXISTS= against | |
| 21 | every issue. #137 | |
| 22 | - Concurrent writers serialise rather than failing. Every transaction in | |
| 23 | the store writes, and a deferred one takes the write lock at its first | |
| 24 | write, by which point another may hold it; SQLite answers | |
| 25 | =SQLITE_BUSY= and does not run the busy handler for that case, so | |
| 26 | =busy_timeout= could not help. Measured with eight concurrent | |
| 27 | read-then-write transactions, 44% of them failed. Beginning immediate | |
| 28 | takes the lock up front, where the timeout applies. #121 | |
| 29 | - =repo settings= updates no longer overwrite each other. | |
| 30 | =settings_json= is one blob, and every caller read it off a repository | |
| 31 | loaded earlier, changed a field and wrote it all back; two admins at | |
| 32 | once and the later write put back what it had read for the other's | |
| 33 | field. The read and the write happen together now, under one | |
| 34 | immediate transaction. #123 | |
| 35 | - Expired sessions and tokens are swept, and =[retention]= caps how long | |
| 36 | the audit log, the activity feed, webhook deliveries and the mail | |
| 37 | queue keep a row. Unset means forever, which is what every existing | |
| 38 | instance gets. #122 | |
| 39 | - The audit entry records flag names without their values. Secrets never | |
| 40 | reached argv — they travel on stdin — but prose did: =--body <the | |
| 41 | whole issue>= was stored verbatim, in a table nothing pruned, for a | |
| 42 | repository that may be private. Identifiers are positional and | |
| 43 | survive. #122 | |
| 44 | - pre-receive on a require-signed repository forked a =cat-file= per | |
| 45 | incoming commit and built one JSON message holding the whole push. A | |
| 46 | 50k-commit first push forked 50k processes and held the history in | |
| 47 | memory twice. One =cat-file --batch= serves the push now, and the | |
| 48 | daemon verifies each commit as it arrives. #100 | |
| 49 | - The payloads other surfaces decode are named types in =control=. httpd | |
| 50 | had its own copies of what the build, profile and dashboard commands | |
| 51 | emit, so a field added to a command was silently absent on the page. | |
| 52 | #126 | |
| 53 | ||
| 54 | Migration 0035 adds three indexes; it runs on daemon start. | |
| 55 | ||
| 56 | Two changes in behaviour rather than configuration. A heavily contended | |
| 57 | write now blocks for up to =busy_timeout= (five seconds) instead of | |
| 58 | returning an error immediately — waiting is the point, but a caller that | |
| 59 | treated the error as normal will see a pause instead. And anything | |
| 60 | parsing =audit --json= for command arguments will find flag values gone; | |
| 61 | the flag names and the positional arguments are still there. | |
| 62 | ||
| 7 | 63 | * v1.11.0 — 2026-09-04 |
| 8 | 64 | |
| 9 | 65 | The web catches up with the rest of the forge: search across the |