+36
-16
appview/pages/templates/fragments/diff.html
+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">···</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
+1
-1
appview/pages/templates/repo/pulls/pull.html
+14
types/diff.go
+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 {