+36
-16
appview/pages/templates/fragments/diff.html
+36
-16
appview/pages/templates/fragments/diff.html
···
33
<span class="bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300 {{ $markerstyle }}">MODIFIED</span>
34
{{ end }}
35
36
{{ if .IsDelete }}
37
<a class="dark:text-white whitespace-nowrap overflow-x-auto" {{if $this }}href="/{{ $repo }}/blob/{{ $this }}/{{ .Name.Old }}"{{end}}>
38
{{ .Name.Old }}
···
72
73
<div class="transition-all duration-700 ease-in-out">
74
{{ 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>
83
{{ else }}
84
<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
{{- $oldStart := .OldPosition -}}
86
{{- $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" -}}
90
{{- range .Lines -}}
91
{{- if eq .Op.String "+" -}}
92
<div class="bg-green-100 dark:bg-green-800/30 text-green-700 dark:text-green-400 flex min-w-full items-center">
93
<div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}"><span aria-hidden="true" class="invisible">{{$newStart}}</span></div>
94
-
<div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}">{{ $newStart }}</div>
95
<div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div>
96
<div class="px-2">{{ .Line }}</div>
97
</div>
···
99
{{- end -}}
100
{{- if eq .Op.String "-" -}}
101
<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>
103
<div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}"><span aria-hidden="true" class="invisible">{{$oldStart}}</span></div>
104
<div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div>
105
<div class="px-2">{{ .Line }}</div>
···
108
{{- end -}}
109
{{- if eq .Op.String " " -}}
110
<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>
113
<div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div>
114
<div class="px-2">{{ .Line }}</div>
115
</div>
···
119
{{- end -}}
120
{{- end -}}</div></div></pre>
121
{{- end -}}
122
-
{{ end }}
123
</div>
124
125
</details>
···
33
<span class="bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300 {{ $markerstyle }}">MODIFIED</span>
34
{{ end }}
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
+
48
{{ if .IsDelete }}
49
<a class="dark:text-white whitespace-nowrap overflow-x-auto" {{if $this }}href="/{{ $repo }}/blob/{{ $this }}/{{ .Name.Old }}"{{end}}>
50
{{ .Name.Old }}
···
84
85
<div class="transition-all duration-700 ease-in-out">
86
{{ if .IsDelete }}
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>
102
{{ else }}
103
+
{{ $name := .Name.New }}
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>
105
{{- $oldStart := .OldPosition -}}
106
{{- $newStart := .NewPosition -}}
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" -}}
111
{{- range .Lines -}}
112
{{- if eq .Op.String "+" -}}
113
<div class="bg-green-100 dark:bg-green-800/30 text-green-700 dark:text-green-400 flex min-w-full items-center">
114
<div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}"><span aria-hidden="true" class="invisible">{{$newStart}}</span></div>
115
+
<div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}" id="{{$name}}-N{{$newStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-N{{$newStart}}">{{ $newStart }}</a></div>
116
<div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div>
117
<div class="px-2">{{ .Line }}</div>
118
</div>
···
120
{{- end -}}
121
{{- if eq .Op.String "-" -}}
122
<div class="bg-red-100 dark:bg-red-800/30 text-red-700 dark:text-red-400 flex min-w-full items-center">
123
+
<div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}" id="{{$name}}-O{{$oldStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-O{{$oldStart}}">{{ $oldStart }}</a></div>
124
<div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}"><span aria-hidden="true" class="invisible">{{$oldStart}}</span></div>
125
<div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div>
126
<div class="px-2">{{ .Line }}</div>
···
129
{{- end -}}
130
{{- if eq .Op.String " " -}}
131
<div class="bg-white dark:bg-gray-800 text-gray-500 dark:text-gray-400 flex min-w-full items-center">
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>
134
<div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div>
135
<div class="px-2">{{ .Line }}</div>
136
</div>
···
140
{{- end -}}
141
{{- end -}}</div></div></pre>
142
{{- end -}}
143
</div>
144
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
IsRename bool `json:"is_rename"`
24
}
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
+
40
// A nicer git diff representation.
41
type NiceDiff struct {
42
Commit struct {