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.
Move Clone and Site into the repository header
816cc543d34ab52df01c62cfd8878ae70327a21f · Keenan Nemetz · 11d ago · parent a196e404
Move Clone and Site into the repository header The repository header now carries the controls that act on the repository as a whole. Clone appears once beside the name on every tab, with a copy button for the HTTPS URL and one for the SSH command. Site joins it only when a site would answer: pages are enabled, the repository is public, and its pages branch exists. The per-tab Clone popovers and the Overview/Code Site buttons are gone, so a tab's page header holds only that tab's own actions. Copy feedback now restores innerHTML, keeping the icon on an icon-only button and surviving a repeated click.
server/web/auth.go +16−5
| @@ -429,13 +429,24 @@ func (w *Web) page(r *http.Request, title string) Page { | |||
| 429 | 429 | if p.LoggedIn && w.Ident != nil { | |
| 430 | 430 | p.InstanceAdmin = w.Ident.IsAdmin(p.AccountName) | |
| 431 | 431 | } | |
| 432 | if p.LoggedIn && w.Repos != nil { | ||
| 432 | if w.Repos != nil { | ||
| 433 | 433 | if name := r.PathValue("name"); name != "" { | |
| 434 | 434 | if m, err := w.Repos.Open(name); err == nil { | |
| 435 | if acl, err := m.ACL(); err == nil { | ||
| 436 | // Instance admins get the Settings tab for its access section, | ||
| 437 | // even when the repository has no role for them. | ||
| 438 | p.CanAdmin = p.InstanceAdmin || acl.Can(p.AccountName, access.Admin) | ||
| 435 | p.CloneURL = w.cloneURL(r, name) | ||
| 436 | if w.Cfg != nil { | ||
| 437 | p.SSHURL = sshURL(w.Cfg.SSHAddr, name) | ||
| 438 | } | ||
| 439 | if p.LoggedIn || (w.Cfg != nil && strings.TrimSpace(w.Cfg.PagesDomain) != "") { | ||
| 440 | if acl, err := m.ACL(); err == nil { | ||
| 441 | if p.LoggedIn { | ||
| 442 | // Instance admins get the Settings tab for its access section, | ||
| 443 | // even when the repository has no role for them. | ||
| 444 | p.CanAdmin = p.InstanceAdmin || acl.Can(p.AccountName, access.Admin) | ||
| 445 | } | ||
| 446 | if w.siteDeployed(m, acl) { | ||
| 447 | p.Site = w.siteURL(r, name) | ||
| 448 | } | ||
| 449 | } | ||
| 439 | 450 | } | |
| 440 | 451 | } | |
| 441 | 452 | } | |