vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Name branches after the account, and labels after the display
474a812d199a109ba894124cd6f26be12c73285d · Keenan Nemetz · 15d ago · parent ade6107e
Name branches after the account, and labels after the display
A contributor's folder was `refs/heads/contrib/<account-id>/`, which told a
reader nothing without decoding a ULID. It is now the account name,
refs/heads/contrib/<name>/<branch>
and the name is therefore fixed at creation: renaming an account would strand
every ref under its old folder, so `vole admin user rename` is gone and the
users row itself — kept after retirement — is what stops a name being reissued.
What people see is now a separate, mutable display name, validated by the same
rules wherever it is set (CLI, remote admin, registration, `/account`) and shown
on pages, approvals, listings and refusals. Nothing is authorized by it and
nothing on disk is keyed by it: metadata authors stay account names because the
push boundary resolves them for ownership, and approvals stay account ids.
`user_names`, `Snapshot.Reserved` and `Account.Former` are dropped: with a fixed
name there are no former names to remember, and the UNIQUE column already does
the reserving. Opening an older roster adds the `display` column and drops the
alias table in place; contributor refs written under the old id namespace are
left where they are, readable, and landable by a maintainer.
docs/operations.md +14
| @@ -36,6 +36,17 @@ with them because they are stored in Git. | |||
| 36 | 36 | cannot outlive their cookies. | |
| 37 | 37 | 5. Start `vole serve`. | |
| 38 | 38 | ||
| 39 | Release notes for an upgrade: an older `users.db` is upgraded in place when it is | ||
| 40 | opened. The `display` column is added, and the retired `user_names` alias table is | ||
| 41 | dropped — an account name is fixed at creation now, so there are no former names | ||
| 42 | to remember. Take a backup first if you might roll the binary back. | ||
| 43 | |||
| 44 | Contributor branches moved from `refs/heads/contrib/<account-id>/` to | ||
| 45 | `refs/heads/contrib/<name>/`. Old refs stay in the repository and can still be | ||
| 46 | fetched, but only a maintainer can push them; existing change requests still name | ||
| 47 | the same head commit. A contributor who wants to keep working pushes the same | ||
| 48 | commit under their new folder and opens a request from it. | ||
| 49 | |||
| 39 | 50 | Large files, CI logs, and build artifacts live in `data/lfs/`. Back that directory | |
| 40 | 51 | up too if you need those files. `vole admin gc` treats files reachable from a | |
| 41 | 52 | repository, an archived CI log, or a published artifact as things to keep. | |
| @@ -83,6 +94,9 @@ repository's `vole` branch. | |||
| 83 | 94 | issue, comment, and approval writes; HTTP Git clone remains read-only. There is | |
| 84 | 95 | no password store. Restoring an old `users.db` should be followed by | |
| 85 | 96 | `vole admin user revoke-sessions --all`. | |
| 97 | - Account names are permanent. They name contributor branches, so an upgrade from | ||
| 98 | a build where names could change keeps each account's current name and forgets | ||
| 99 | the former ones. | ||
| 86 | 100 | - Open registration creates accounts without email verification. Leave | |
| 87 | 101 | `open_registration` off unless the instance is meant to accept public | |
| 88 | 102 | contributions. | |