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.
Fold admin work into repository settings and a Users page
9579c1f976254fdeb2ec73d4016db5b25c7921c1 · Keenan Nemetz · 14d ago · parent 381d6aac
Fold admin work into repository settings and a Users page Remove the combined /admin tabs. Per-repository access rules now live on the repository's Settings page, visible to instance admins while repository details and the danger zone stay with repository admins. User management moves to /users, linked from the top navigation only for instance admins, and repository creation moves to /repos/new. Align the invite, danger-zone, and settings forms with the shared card-and-actions layout, and make settings section headings consistent.
server/server.go +11−13
| @@ -178,19 +178,16 @@ func (s *Server) routes() *http.ServeMux { | |||
| 178 | 178 | mux.HandleFunc("POST /account/passkeys/finish", w.AddPasskeyFinish) | |
| 179 | 179 | mux.HandleFunc("GET /auth.js", w.AuthJS) | |
| 180 | 180 | mux.HandleFunc("GET /runners", w.RunnersPage) | |
| 181 | mux.HandleFunc("GET /admin", w.AdminPage) | ||
| 182 | mux.HandleFunc("GET /admin/repos/new", w.AdminNewRepoPage) | ||
| 183 | mux.HandleFunc("POST /admin/repos", w.CreateAdminRepo) | ||
| 184 | mux.HandleFunc("GET /admin/users", w.AdminUsersPage) | ||
| 185 | mux.HandleFunc("POST /admin/users", w.CreateAdminUser) | ||
| 186 | mux.HandleFunc("GET /admin/users/{name}", w.AdminUserPage) | ||
| 187 | mux.HandleFunc("POST /admin/users/{name}/admin", w.SetAdminUser) | ||
| 188 | mux.HandleFunc("POST /admin/users/{name}/retire", w.RetireAdminUser) | ||
| 189 | mux.HandleFunc("POST /admin/users/{name}/invite", w.InviteAdminUser) | ||
| 190 | mux.HandleFunc("POST /admin/users/{name}/sessions/revoke", w.RevokeAdminUserSessions) | ||
| 191 | mux.HandleFunc("POST /admin/users/{name}/keys/remove", w.RemoveAdminUserKey) | ||
| 192 | mux.HandleFunc("GET /admin/repos/{name}/access", w.AdminAccessPage) | ||
| 193 | mux.HandleFunc("POST /admin/repos/{name}/access", w.SaveAdminAccess) | ||
| 181 | mux.HandleFunc("GET /repos/new", w.AdminNewRepoPage) | ||
| 182 | mux.HandleFunc("POST /repos", w.CreateAdminRepo) | ||
| 183 | mux.HandleFunc("GET /users", w.AdminUsersPage) | ||
| 184 | mux.HandleFunc("POST /users", w.CreateAdminUser) | ||
| 185 | mux.HandleFunc("GET /users/{name}", w.AdminUserPage) | ||
| 186 | mux.HandleFunc("POST /users/{name}/admin", w.SetAdminUser) | ||
| 187 | mux.HandleFunc("POST /users/{name}/retire", w.RetireAdminUser) | ||
| 188 | mux.HandleFunc("POST /users/{name}/invite", w.InviteAdminUser) | ||
| 189 | mux.HandleFunc("POST /users/{name}/sessions/revoke", w.RevokeAdminUserSessions) | ||
| 190 | mux.HandleFunc("POST /users/{name}/keys/remove", w.RemoveAdminUserKey) | ||
| 194 | 191 | mux.HandleFunc("GET /r/{name}", w.Overview) | |
| 195 | 192 | mux.HandleFunc("GET /r/{name}/activity", w.Activity) | |
| 196 | 193 | mux.HandleFunc("GET /r/{name}/code", w.Code) | |
| @@ -234,6 +231,7 @@ func (s *Server) routes() *http.ServeMux { | |||
| 234 | 231 | mux.HandleFunc("GET /r/{name}/locks", w.LocksPage) | |
| 235 | 232 | mux.HandleFunc("GET /r/{name}/settings", w.SettingsPage) | |
| 236 | 233 | mux.HandleFunc("POST /r/{name}/settings", w.SaveSettings) | |
| 234 | mux.HandleFunc("POST /r/{name}/settings/access", w.SaveRepositoryAccess) | ||
| 237 | 235 | mux.HandleFunc("POST /r/{name}/settings/rename", w.RenameRepository) | |
| 238 | 236 | mux.HandleFunc("POST /r/{name}/settings/delete", w.DeleteRepository) | |
| 239 | 237 | mux.HandleFunc("GET /r/{name}/releases", w.Releases) | |