vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
Add browser auth, contributor access, and gated CI
6c84d387e5f608360e30484a1a5b1cff41076850 · Keenan Nemetz · 16d ago · parent c36d5073
Add browser auth, contributor access, and gated CI Browser sign-in now uses passkeys. Enrollment links are one-time, sessions are hashed in users.db, and issue/comment/approval writes use the session account. HTTPS public_url is required for WebAuthn. Add the contributor role between read and maintain. Contributors can discuss and open change requests, and may push only refs/heads/contrib/<account-id>/. Contributor CI is held per commit until a maintainer allows the exact tip from the repository page. Rename the write role to maintain. write remains accepted as the historical spelling, and access.Write remains as a Go alias so existing callers and ACL rows keep working. Update the web, CLI, queue schema, and guides for the new flows, and cover the role, namespace, auth, and CI-gating paths in tests.
server/hook/lfs_test.go +2−2
| @@ -27,7 +27,7 @@ func filesFixture(t *testing.T, files map[string][]byte) *fixture { | |||
| 27 | 27 | if err != nil { | |
| 28 | 28 | t.Fatal(err) | |
| 29 | 29 | } | |
| 30 | if err := a.SetEntry("writer", "write"); err != nil { | ||
| 30 | if err := a.SetEntry("writer", "maintain"); err != nil { | ||
| 31 | 31 | t.Fatal(err) | |
| 32 | 32 | } | |
| 33 | 33 | if err := m.SetACL(a, "test"); err != nil { | |
| @@ -153,7 +153,7 @@ func TestDeletedPointerDoesNotBlockItsOwnRemoval(t *testing.T) { | |||
| 153 | 153 | if err != nil { | |
| 154 | 154 | t.Fatal(err) | |
| 155 | 155 | } | |
| 156 | if err := a.SetEntry("writer", "write"); err != nil { | ||
| 156 | if err := a.SetEntry("writer", "maintain"); err != nil { | ||
| 157 | 157 | t.Fatal(err) | |
| 158 | 158 | } | |
| 159 | 159 | if err := m.SetACL(a, "test"); err != nil { | |