Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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 }