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.
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/static/app.js +10−2
| @@ -27,9 +27,17 @@ const copyText = (value, done) => { | |||
| 27 | 27 | if (!value) return; | |
| 28 | 28 | event.preventDefault(); | |
| 29 | 29 | copyText(value, () => { | |
| 30 | const original = button.textContent; | ||
| 30 | // innerHTML, not textContent: a copy button may carry an icon, and | ||
| 31 | // restoring textContent would drop it. The original markup is kept on the | ||
| 32 | // element so a second copy before the label resets cannot capture | ||
| 33 | // "Copied" as the label to restore. | ||
| 34 | let original = button.dataset.copyLabel; | ||
| 35 | if (original === undefined) { | ||
| 36 | original = button.innerHTML; | ||
| 37 | button.dataset.copyLabel = original; | ||
| 38 | } | ||
| 31 | 39 | button.textContent = 'Copied'; | |
| 32 | setTimeout(() => { button.textContent = original; }, 1200); | ||
| 40 | setTimeout(() => { button.innerHTML = original; }, 1200); | ||
| 33 | 41 | }); | |
| 34 | 42 | }); | |
| 35 | 43 | ||