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.
Merge change request 01M70WES5ZZDJ6RP226WB11BBZ: Let people rename and remove their own passkeys
keenan · 2h ago
4b8c9e1d
| 1 | {{define "releases"}} |
| 2 | {{template "header" .}} |
| 3 | {{template "repohead" (nav .Page "releases")}} |
| 4 | |
| 5 | <div class="page-head"> |
| 6 | <div class="page-head-main"> |
| 7 | <h1>Releases</h1> |
| 8 | <p class="page-sub">{{if .Tags}}{{len .Tags}} tag(s){{if .Lightweight}} · {{.Lightweight}} lightweight{{end}}{{else}}Tags with notes, artifacts, and archives.{{end}}</p> |
| 9 | </div> |
| 10 | {{if .CanManage}}<div class="page-head-actions"><a class="button" href="/{{.Name}}/releases/new">{{icon "plus"}}New release</a></div>{{end}} |
| 11 | </div> |
| 12 | |
| 13 | {{if .Tags}} |
| 14 | <div class="panel"> |
| 15 | <table> |
| 16 | <tr><th>Tag</th><th>Notes</th><th>Tagger</th><th>Age</th><th>Source</th>{{if .CanManage}}<th></th>{{end}}</tr> |
| 17 | {{range .Tags}} |
| 18 | <tr> |
| 19 | <td><a href="/{{$.Name}}/releases/{{esc .Name}}">{{.Name}}</a>{{if not .Annotated}} <span class="label">lightweight</span>{{end}}</td> |
| 20 | <td class="muted">{{.Subject}}</td> |
| 21 | <td class="muted">{{if .Tagger}}{{.Tagger}}{{else}}—{{end}}</td> |
| 22 | <td class="muted">{{since .When}}</td> |
| 23 | <td><a href="/{{$.Name}}/releases/{{esc .Name}}/archive.tar">tar</a> · <a href="/{{$.Name}}/releases/{{esc .Name}}/archive.tar.gz">tar.gz</a></td> |
| 24 | {{if $.CanManage}}<td>{{if .Annotated}}<a href="/{{$.Name}}/releases/edit?tag={{urlquery .Name}}">edit notes</a>{{end}}</td>{{end}} |
| 25 | </tr> |
| 26 | {{end}} |
| 27 | </table> |
| 28 | </div> |
| 29 | {{else}} |
| 30 | <div class="empty-state"> |
| 31 | <p>No releases yet. A release is an annotated tag, so this is the whole flow:</p> |
| 32 | <pre>git tag -a v1.0.0 -F notes.md |
| 33 | git push --follow-tags</pre> |
| 34 | </div> |
| 35 | {{end}} |
| 36 | {{if .Lightweight}} |
| 37 | <p class="muted">{{.Lightweight}} lightweight tag(s) are listed but carry no notes: <code>git tag -a</code> |
| 38 | records a tagger and a message, which is what makes a tag a release.</p> |
| 39 | {{end}} |
| 40 | {{template "footer" .}} |
| 41 | {{end}} |
| 42 | |
| 43 | {{define "release"}} |
| 44 | {{template "header" .}} |
| 45 | {{template "repohead" (nav .Page "releases")}} |
| 46 | <div class="page-head"> |
| 47 | <div class="page-head-main"> |
| 48 | <h1>{{.Tag.Name}}</h1> |
| 49 | <p class="page-sub"> |
| 50 | {{if .Tag.Annotated}}annotated tag{{else}}lightweight tag{{end}} |
| 51 | {{if .Tag.Tagger}}by {{.Tag.Tagger}}{{end}} |
| 52 | · {{since .Tag.When}} |
| 53 | · commit <a class="sha" href="/{{.Name}}/commit/{{.Tag.Commit}}">{{short .Tag.Commit}}</a> |
| 54 | </p> |
| 55 | </div> |
| 56 | {{if .CanEdit}}<div class="page-head-actions"><a class="button secondary" href="/{{.Name}}/releases/edit?tag={{urlquery .Tag.Name}}">{{icon "sliders-horizontal"}}Edit notes</a></div>{{end}} |
| 57 | </div> |
| 58 | |
| 59 | {{if .Notes}} |
| 60 | <div class="md">{{.Notes}}</div> |
| 61 | {{else if not .Tag.Annotated}} |
| 62 | <div class="empty-state"> |
| 63 | <p>A lightweight tag has no notes. Annotate it (<code>git tag -a</code>) to give this release a description; the tarball below works either way.</p> |
| 64 | </div> |
| 65 | {{end}} |
| 66 | |
| 67 | <div class="card"> |
| 68 | <h2>Artifacts</h2> |
| 69 | {{if .Artifacts}} |
| 70 | <table> |
| 71 | <tr><th>File</th><th>Size</th><th>SHA-256</th><th></th></tr> |
| 72 | {{range .Artifacts}} |
| 73 | <tr> |
| 74 | <td><a href="/{{$.Name}}/releases/{{esc $.Tag.Name}}/artifacts/{{.Name}}">{{.Name}}</a></td> |
| 75 | <td class="muted">{{.Size}}</td> |
| 76 | <td class="muted"><code>{{short .OID}}</code></td> |
| 77 | <td><a href="/{{$.Name}}/releases/{{esc $.Tag.Name}}/artifacts/{{.Name}}">download</a></td> |
| 78 | </tr> |
| 79 | {{end}} |
| 80 | </table> |
| 81 | <p class="muted">Bytes live once in the instance's content-addressed store, so the same |
| 82 | file on two releases costs one copy.</p> |
| 83 | {{else}} |
| 84 | <p class="muted">No artifacts attached. Push the tag first, then:</p> |
| 85 | <pre>vole release attach {{.Tag.Name}} dist/*</pre> |
| 86 | {{end}} |
| 87 | </div> |
| 88 | |
| 89 | <div class="card"> |
| 90 | <h2>Source</h2> |
| 91 | <p><a href="/{{.Name}}/releases/{{esc .Tag.Name}}/archive.tar">Download .tar</a> |
| 92 | · <a href="/{{.Name}}/releases/{{esc .Tag.Name}}/archive.tar.gz">Download .tar.gz</a></p> |
| 93 | <p class="muted">Generated from the tag when you ask for it, not stored — the same bytes on |
| 94 | every request, so a cached copy cannot go stale.</p> |
| 95 | {{if .LFSPointers}}<p class="muted">This repository tracks files with Git LFS: those files appear |
| 96 | in the tarball as pointer files, not their contents. Clone with <code>git lfs</code> for the |
| 97 | real bytes.</p>{{end}} |
| 98 | </div> |
| 99 | |
| 100 | <h2>{{if .Prev}}{{.Count}} commit(s) since {{.Prev}}{{else}}{{.Count}} commit(s){{end}}</h2> |
| 101 | <div class="panel">{{template "commitlist" .}}</div> |
| 102 | {{if .Capped}}<p class="muted">Showing the first {{.CappedAt}}; the rest are in the history.</p>{{end}} |
| 103 | {{template "footer" .}} |
| 104 | {{end}} |
| 105 |