forked from tangled.org/core
Monorepo for Tangled

add per-file diff stats

allow linking in diffs

Changed files
+51 -17
appview
pages
templates
fragments
repo
pulls
types
+36 -16
appview/pages/templates/fragments/diff.html
··· 33 33 <span class="bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300 {{ $markerstyle }}">MODIFIED</span> 34 34 {{ end }} 35 35 36 + {{ $stat := .Stats }} 37 + <div class="flex items-center font-mono text-sm"> 38 + {{ if and $stat.Insertions $stat.Deletions }} 39 + <span class="rounded-l p-1 select-none bg-green-100 text-green-700 dark:bg-green-800/50 dark:text-green-400">+{{ $stat.Insertions }}</span> 40 + <span class="rounded-r p-1 select-none bg-red-100 text-red-700 dark:bg-red-800/50 dark:text-red-400">-{{ $stat.Deletions }}</span> 41 + {{ else if $stat.Insertions }} 42 + <span class="rounded p-1 select-none bg-green-100 text-green-700 dark:bg-green-800/50 dark:text-green-400">+{{ $stat.Insertions }}</span> 43 + {{ else if $stat.Deletions }} 44 + <span class="rounded p-1 select-none bg-red-100 text-red-700 dark:bg-red-800/50 dark:text-red-400">-{{ $stat.Deletions }}</span> 45 + {{ end }} 46 + </div> 47 + 36 48 {{ if .IsDelete }} 37 49 <a class="dark:text-white whitespace-nowrap overflow-x-auto" {{if $this }}href="/{{ $repo }}/blob/{{ $this }}/{{ .Name.Old }}"{{end}}> 38 50 {{ .Name.Old }} ··· 72 84 73 85 <div class="transition-all duration-700 ease-in-out"> 74 86 {{ if .IsDelete }} 75 - <p class="text-center text-gray-400 dark:text-gray-500 p-4"> 76 - This file has been deleted in this commit. 77 - </p> 78 - {{ else }} 79 - {{ if .IsBinary }} 80 - <p class="text-center text-gray-400 dark:text-gray-500 p-4"> 81 - This is a binary file and will not be displayed. 82 - </p> 87 + <p class="text-center text-gray-400 dark:text-gray-500 p-4"> 88 + This file has been deleted. 89 + </p> 90 + {{ else if .IsCopy }} 91 + <p class="text-center text-gray-400 dark:text-gray-500 p-4"> 92 + This file has been copied. 93 + </p> 94 + {{ else if .IsRename }} 95 + <p class="text-center text-gray-400 dark:text-gray-500 p-4"> 96 + This file has been renamed. 97 + </p> 98 + {{ else if .IsBinary }} 99 + <p class="text-center text-gray-400 dark:text-gray-500 p-4"> 100 + This is a binary file and will not be displayed. 101 + </p> 83 102 {{ else }} 103 + {{ $name := .Name.New }} 84 104 <pre class="overflow-x-auto"><div class="overflow-x-auto"><div class="min-w-full inline-block">{{- range .TextFragments -}}<div class="bg-gray-100 dark:bg-gray-700 text-gray-500 dark:text-gray-400 select-none text-center">&middot;&middot;&middot;</div> 85 105 {{- $oldStart := .OldPosition -}} 86 106 {{- $newStart := .NewPosition -}} 87 - {{- $lineNrStyle := "min-w-[3rem] flex-shrink-0 select-none text-right" -}} 88 - {{- $lineNrSepStyle1 := "text-gray-400 dark:text-gray-500 bg-white dark:bg-gray-800" -}} 89 - {{- $lineNrSepStyle2 := "text-gray-400 dark:text-gray-500 bg-white dark:bg-gray-800 pr-2" -}} 107 + {{- $lineNrStyle := "min-w-[3.5rem] flex-shrink-0 select-none text-right bg-white dark:bg-gray-800 scroll-mt-10 target:border target:border-amber-500 target:rounded " -}} 108 + {{- $linkStyle := "text-gray-400 dark:text-gray-500 hover:underline" -}} 109 + {{- $lineNrSepStyle1 := "" -}} 110 + {{- $lineNrSepStyle2 := "pr-2" -}} 90 111 {{- range .Lines -}} 91 112 {{- if eq .Op.String "+" -}} 92 113 <div class="bg-green-100 dark:bg-green-800/30 text-green-700 dark:text-green-400 flex min-w-full items-center"> 93 114 <div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}"><span aria-hidden="true" class="invisible">{{$newStart}}</span></div> 94 - <div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}">{{ $newStart }}</div> 115 + <div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}" id="{{$name}}-N{{$newStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-N{{$newStart}}">{{ $newStart }}</a></div> 95 116 <div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div> 96 117 <div class="px-2">{{ .Line }}</div> 97 118 </div> ··· 99 120 {{- end -}} 100 121 {{- if eq .Op.String "-" -}} 101 122 <div class="bg-red-100 dark:bg-red-800/30 text-red-700 dark:text-red-400 flex min-w-full items-center"> 102 - <div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}">{{ $oldStart }}</div> 123 + <div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}" id="{{$name}}-O{{$oldStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-O{{$oldStart}}">{{ $oldStart }}</a></div> 103 124 <div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}"><span aria-hidden="true" class="invisible">{{$oldStart}}</span></div> 104 125 <div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div> 105 126 <div class="px-2">{{ .Line }}</div> ··· 108 129 {{- end -}} 109 130 {{- if eq .Op.String " " -}} 110 131 <div class="bg-white dark:bg-gray-800 text-gray-500 dark:text-gray-400 flex min-w-full items-center"> 111 - <div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}">{{ $oldStart }}</div> 112 - <div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}">{{ $newStart }}</div> 132 + <div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}" id="{{$name}}-O{{$oldStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-O{{$oldStart}}">{{ $oldStart }}</a></div> 133 + <div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}" id="{{$name}}-N{{$newStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-N{{$newStart}}">{{ $newStart }}</a></div> 113 134 <div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div> 114 135 <div class="px-2">{{ .Line }}</div> 115 136 </div> ··· 119 140 {{- end -}} 120 141 {{- end -}}</div></div></pre> 121 142 {{- end -}} 122 - {{ end }} 123 143 </div> 124 144 125 145 </details>
+1 -1
appview/pages/templates/repo/pulls/pull.html
··· 156 156 {{ end }} 157 157 </div> 158 158 </details> 159 - <hr class="md:hidden"/> 159 + <hr class="md:hidden border-t border-gray-300 dark:border-gray-600"/> 160 160 {{ end }} 161 161 {{ end }} 162 162 {{ end }}
+14
types/diff.go
··· 23 23 IsRename bool `json:"is_rename"` 24 24 } 25 25 26 + type DiffStat struct { 27 + Insertions int64 28 + Deletions int64 29 + } 30 + 31 + func (d *Diff) Stats() DiffStat { 32 + var stats DiffStat 33 + for _, f := range d.TextFragments { 34 + stats.Insertions += f.LinesAdded 35 + stats.Deletions += f.LinesDeleted 36 + } 37 + return stats 38 + } 39 + 26 40 // A nicer git diff representation. 27 41 type NiceDiff struct { 28 42 Commit struct {