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.
Let the CLI do what the browser does for the same account
7e0b5950c190caf11089e1aaac10f18678074fed · Keenan Nemetz · 6d ago · parent 6e1fca51
Let the CLI do what the browser does for the same account A contributor could file an issue, comment, manage the item it wrote, and open a change from its own branch — but only in the browser, because a push to `refs/heads/vole` required `maintain`. The role was not the reason: the hook had no per-path authorization for that branch, so the role gate stood in for one. The per-path checker is now applied to every session, not only to run credentials. It asks the ACL the questions the browser's forms ask — CanDiscuss, CanOpenRequest, CanTriage, CanApprove — so a contributor's key can write what a contributor may write, and a maintainer's key is unchanged. A non-maintainer's new file must name that account as its author, which is what the browser does for it; a maintainer keeps writing an imported issue under its original author, because that is a trust decision rather than a capability. Creating the issues branch still needs a maintainer, as it does from the browser, and an approval still cannot approve its author's own change — the tree validator already refused that, and now every transport gets the same answer. The one rule that moved is self-approval for a maintainer's push, which is now refused earlier rather than only at the landing gate. With the branch no longer bundled into `maintain`, CONTRIBUTING and the guides stop telling contributors to use the web. Both transports are one authorization model. Part of #168, stacked on #167, which built the checker this generalises.
docs/change-requests.md +7−6
| @@ -15,12 +15,13 @@ requests/<ulid>/approvals/<account-name>.md # one approval per account | |||
| 15 | 15 | ||
| 16 | 16 | ## Opening and landing a request | |
| 17 | 17 | ||
| 18 | A contributor opens a request from the web after pushing a branch under | ||
| 19 | `refs/heads/contrib/<name>/`. The **Open change request** form on the | ||
| 20 | repository's change-request page lists their namespaced branches; the browser | ||
| 21 | builds the request from the branch's current commit. A contributor cannot name an | ||
| 22 | arbitrary commit or another account's branch. The namespace is the account name, | ||
| 23 | which is fixed at creation. CI | ||
| 18 | A contributor opens a request after pushing a branch under | ||
| 19 | `refs/heads/contrib/<name>/`, from the web or with `vole change new`. The | ||
| 20 | **Open change request** form on the repository's change-request page lists their | ||
| 21 | namespaced branches; the CLI is checked the same way by pre-receive, which reads | ||
| 22 | the branch the request names. A contributor cannot name an arbitrary commit or | ||
| 23 | another account's branch. The namespace is the account name, which is fixed at | ||
| 24 | creation. CI | ||
| 24 | 25 | for that commit is held until a maintainer allows the exact tip from the | |
| 25 | 26 | repository page. | |
| 26 | 27 | ||