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.
Identify accounts by their registered name
62576fa8157d431dcf2d360f3ebe481de77bda03 · Keenan Nemetz · 14d ago · parent 642e5994
Identify accounts by their registered name Drop the internal account id and display name. Users, keys, passkeys, invites, sessions, ACL entries, approvals, locks and CI records now all use the registered name as the single identity. The roster migrates in place: old id-keyed tables are rebuilt around the name, and access-rule/lock references are rewritten through the same mapping. Display-name editing and whoami --id are removed.
core/lfs/transfer.go +6−8
| @@ -41,19 +41,17 @@ type Transfer struct { | |||
| 41 | 41 | Repo string | |
| 42 | 42 | // RepoID is the repository's stable id, which is what a lock is keyed by: a | |
| 43 | 43 | // rename must not release a lock. | |
| 44 | RepoID string | ||
| 45 | AccountID string | ||
| 46 | CanRead bool | ||
| 47 | CanWrite bool | ||
| 44 | RepoID string | ||
| 45 | // User is the account name the SSH key resolved to. | ||
| 46 | User string | ||
| 47 | CanRead bool | ||
| 48 | CanWrite bool | ||
| 48 | 49 | // IsAdmin lets an account release somebody else's lock. The lock store does not | |
| 49 | 50 | // read ACLs; the session tells it, so the decision stays in one place. | |
| 50 | 51 | IsAdmin bool | |
| 51 | 52 | // Locks is the lock table. Nil means this server offers none, and the `locking` | |
| 52 | 53 | // capability is not advertised. | |
| 53 | 54 | Locks *LockStore | |
| 54 | // Names renders an account id as a name for messages. Nil means ids are shown, | ||
| 55 | // which is honest but ugly; the SSH server always supplies one. | ||
| 56 | Names func(accountID string) string | ||
| 57 | 55 | Log *slog.Logger | |
| 58 | 56 | } | |
| 59 | 57 | ||
| @@ -230,7 +228,7 @@ func (t *Transfer) put(op, oid string, pr *pktReader, pw *pktWriter) error { | |||
| 230 | 228 | return pw.statusLines(code, nil, []string{msg}) | |
| 231 | 229 | } | |
| 232 | 230 | if t.Log != nil { | |
| 233 | t.Log.Info("lfs upload", "repo", t.Repo, "oid", oid, "bytes", n, "created", created, "user", t.AccountID) | ||
| 231 | t.Log.Info("lfs upload", "repo", t.Repo, "oid", oid, "bytes", n, "created", created, "user", t.User) | ||
| 234 | 232 | } | |
| 235 | 233 | return pw.statusLines(200, nil, nil) | |
| 236 | 234 | } | |