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/web/admin_users.go +4−4
| @@ -150,7 +150,7 @@ func (w *Web) SetAdminUser(rw http.ResponseWriter, r *http.Request) { | |||
| 150 | 150 | w.render(rw, "admin_user", w.adminUserView(r, acct, err.Error()), http.StatusBadRequest) | |
| 151 | 151 | return | |
| 152 | 152 | } | |
| 153 | http.Redirect(rw, r, "/admin/users/"+acct.Name, http.StatusSeeOther) | ||
| 153 | http.Redirect(rw, r, "/users/"+acct.Name, http.StatusSeeOther) | ||
| 154 | 154 | } | |
| 155 | 155 | ||
| 156 | 156 | func (w *Web) RetireAdminUser(rw http.ResponseWriter, r *http.Request) { | |
| @@ -166,7 +166,7 @@ func (w *Web) RetireAdminUser(rw http.ResponseWriter, r *http.Request) { | |||
| 166 | 166 | w.render(rw, "admin_user", w.adminUserView(r, acct, err.Error()), http.StatusBadRequest) | |
| 167 | 167 | return | |
| 168 | 168 | } | |
| 169 | http.Redirect(rw, r, "/admin/users", http.StatusSeeOther) | ||
| 169 | http.Redirect(rw, r, "/users", http.StatusSeeOther) | ||
| 170 | 170 | } | |
| 171 | 171 | ||
| 172 | 172 | func (w *Web) InviteAdminUser(rw http.ResponseWriter, r *http.Request) { | |
| @@ -196,7 +196,7 @@ func (w *Web) RevokeAdminUserSessions(rw http.ResponseWriter, r *http.Request) { | |||
| 196 | 196 | w.serverError(rw, r, "cannot revoke sessions: "+err.Error()) | |
| 197 | 197 | return | |
| 198 | 198 | } | |
| 199 | http.Redirect(rw, r, "/admin/users/"+acct.Name, http.StatusSeeOther) | ||
| 199 | http.Redirect(rw, r, "/users/"+acct.Name, http.StatusSeeOther) | ||
| 200 | 200 | } | |
| 201 | 201 | ||
| 202 | 202 | func (w *Web) RemoveAdminUserKey(rw http.ResponseWriter, r *http.Request) { | |
| @@ -213,5 +213,5 @@ func (w *Web) RemoveAdminUserKey(rw http.ResponseWriter, r *http.Request) { | |||
| 213 | 213 | w.render(rw, "admin_user", w.adminUserView(r, acct, err.Error()), http.StatusBadRequest) | |
| 214 | 214 | return | |
| 215 | 215 | } | |
| 216 | http.Redirect(rw, r, "/admin/users/"+acct.Name, http.StatusSeeOther) | ||
| 216 | http.Redirect(rw, r, "/users/"+acct.Name, http.StatusSeeOther) | ||
| 217 | 217 | } | |