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.
Add file history and blame views
67a308badf4a88298639271a1201ff45cc3737a6 · Keenan Nemetz · 15d ago · parent f204e7ee
Add file history and blame views A blob's toolbar now links to the commits that touched its path and to per-line attribution. File history uses git log for the path, following renames for blobs; blame groups consecutive lines by commit and shows the author and age in a left column. Both are read-only and reuse the existing commit-link and escaping rules.
server/web/templates/blame.html +42
| @@ -0,0 +1,42 @@ | |||
| 1 | {{define "blame"}} | ||
| 2 | {{template "header" .}} | ||
| 3 | {{template "repohead" (nav .Name "code" .CanAdmin)}} | ||
| 4 | |||
| 5 | <div class="page-head"> | ||
| 6 | <div class="page-head-main"> | ||
| 7 | <h1>Blame · {{.Path}}</h1> | ||
| 8 | <p class="page-sub">Line attribution on <code>{{.Ref}}</code> · {{.Lines}} line(s){{if .Truncated}} · showing the first 1 MiB{{end}}</p> | ||
| 9 | </div> | ||
| 10 | <div class="page-head-actions"> | ||
| 11 | <a class="button secondary" href="/r/{{.Name}}/blob/{{esc .Ref}}/{{pathurl .Path}}">{{icon "file"}}View file</a> | ||
| 12 | <a class="button secondary" href="/r/{{.Name}}/commits/{{esc .Ref}}/{{pathurl .Path}}">{{icon "history"}}History</a> | ||
| 13 | </div> | ||
| 14 | </div> | ||
| 15 | |||
| 16 | {{if .Blocks}} | ||
| 17 | <div class="panel blame-panel"> | ||
| 18 | <table class="blame"> | ||
| 19 | <tbody> | ||
| 20 | {{range .Blocks}}{{$block := .}} | ||
| 21 | {{range $i, $line := .Lines}} | ||
| 22 | <tr> | ||
| 23 | {{if eq $i 0}} | ||
| 24 | <td class="blame-meta" rowspan="{{len $block.Lines}}"> | ||
| 25 | <a class="sha" href="/r/{{$.Name}}/commit/{{$block.SHA}}">{{short $block.SHA}}</a> | ||
| 26 | <div>{{who $block.Author}}</div> | ||
| 27 | <div class="muted">{{since $block.When}}</div> | ||
| 28 | </td> | ||
| 29 | {{end}} | ||
| 30 | <td class="ln">{{$line.Line}}</td> | ||
| 31 | <td class="code">{{$line.Text}}</td> | ||
| 32 | </tr> | ||
| 33 | {{end}} | ||
| 34 | {{end}} | ||
| 35 | </tbody> | ||
| 36 | </table> | ||
| 37 | </div> | ||
| 38 | {{else}} | ||
| 39 | <div class="empty-state"><p>That file is empty.</p></div> | ||
| 40 | {{end}} | ||
| 41 | {{template "footer" .}} | ||
| 42 | {{end}} | ||