1{{ define "repo/fragments/interdiff" }}
2{{ $repo := index . 0 }}
3{{ $x := index . 1 }}
4{{ $diff := $x.Files }}
5
6 <section class="mt-6 p-6 border border-gray-200 dark:border-gray-700 w-full mx-auto rounded bg-white dark:bg-gray-800 drop-shadow-sm">
7 <div class="diff-stat">
8 <div class="flex gap-2 items-center">
9 <strong class="text-sm uppercase dark:text-gray-200">files</strong>
10 </div>
11 <div class="overflow-x-auto">
12 <ul class="dark:text-gray-200">
13 {{ range $diff }}
14 <li><a href="#file-{{ .Name }}" class="dark:hover:text-gray-300">{{ .Name }}</a></li>
15 {{ end }}
16 </ul>
17 </div>
18 </div>
19 </section>
20
21 {{ $last := sub (len $diff) 1 }}
22 {{ range $idx, $hunk := $diff }}
23 {{ with $hunk }}
24 <section class="mt-6 border border-gray-200 dark:border-gray-700 w-full mx-auto rounded bg-white dark:bg-gray-800 drop-shadow-sm">
25 <div id="file-{{ .Name }}">
26 <div id="diff-file">
27 <details {{ if not (.Status.IsOnlyInOne) }}open{{end}}>
28 <summary class="list-none cursor-pointer sticky top-0">
29 <div id="diff-file-header" class="rounded cursor-pointer bg-white dark:bg-gray-800 flex justify-between">
30 <div id="left-side-items" class="p-2 flex gap-2 items-center overflow-x-auto">
31 <div class="flex gap-1 items-center" style="direction: ltr;">
32 {{ $markerstyle := "diff-type p-1 mr-1 font-mono text-sm rounded select-none" }}
33 {{ if .Status.IsOk }}
34 <span class="bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300 {{ $markerstyle }}">CHANGED</span>
35 {{ else if .Status.IsUnchanged }}
36 <span class="bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300 {{ $markerstyle }}">UNCHANGED</span>
37 {{ else if .Status.IsOnlyInOne }}
38 <span class="bg-red-100 text-red-700 dark:bg-red-800/50 dark:text-red-400 {{ $markerstyle }}">REVERTED</span>
39 {{ else if .Status.IsOnlyInTwo }}
40 <span class="bg-green-100 text-green-700 dark:bg-green-800/50 dark:text-green-400 {{ $markerstyle }}">NEW</span>
41 {{ else if .Status.IsRebased }}
42 <span class="bg-amber-100 text-amber-700 dark:bg-amber-800/50 dark:text-amber-400 {{ $markerstyle }}">REBASED</span>
43 {{ else }}
44 <span class="bg-red-100 text-red-700 dark:bg-red-800/50 dark:text-red-400 {{ $markerstyle }}">ERROR</span>
45 {{ end }}
46 </div>
47
48 <div class="flex gap-2 items-center overflow-x-auto" style="direction: rtl;">
49 <a class="dark:text-white whitespace-nowrap overflow-x-auto" href="">
50 {{ .Name }}
51 </a>
52 </div>
53 </div>
54
55 {{ $iconstyle := "p-1 mx-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded" }}
56 <div id="right-side-items" class="p-2 flex items-center">
57 <a title="top of file" href="#file-{{ .Name }}" class="{{ $iconstyle }}">{{ i "arrow-up-to-line" "w-4 h-4" }}</a>
58 {{ if gt $idx 0 }}
59 {{ $prev := index $diff (sub $idx 1) }}
60 <a title="previous file" href="#file-{{ $prev.Name }}" class="{{ $iconstyle }}">{{ i "arrow-up" "w-4 h-4" }}</a>
61 {{ end }}
62
63 {{ if lt $idx $last }}
64 {{ $next := index $diff (add $idx 1) }}
65 <a title="next file" href="#file-{{ $next.Name }}" class="{{ $iconstyle }}">{{ i "arrow-down" "w-4 h-4" }}</a>
66 {{ end }}
67 </div>
68
69 </div>
70 </summary>
71
72 <div class="transition-all duration-700 ease-in-out">
73 {{ if .Status.IsUnchanged }}
74 <p class="text-center text-gray-400 dark:text-gray-500 p-4">
75 This file has not been changed.
76 </p>
77 {{ else if .Status.IsRebased }}
78 <p class="text-center text-gray-400 dark:text-gray-500 p-4">
79 This patch was likely rebased, as context lines do not match.
80 </p>
81 {{ else if .Status.IsError }}
82 <p class="text-center text-gray-400 dark:text-gray-500 p-4">
83 Failed to calculate interdiff for this file.
84 </p>
85 {{ else }}
86 {{ $name := .Name }}
87 <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>
88 {{- $oldStart := .OldPosition -}}
89 {{- $newStart := .NewPosition -}}
90 {{- $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 " -}}
91 {{- $linkStyle := "text-gray-400 dark:text-gray-500 hover:underline" -}}
92 {{- $lineNrSepStyle1 := "" -}}
93 {{- $lineNrSepStyle2 := "pr-2" -}}
94 {{- range .Lines -}}
95 {{- if eq .Op.String "+" -}}
96 <div class="bg-green-100 dark:bg-green-800/30 text-green-700 dark:text-green-400 flex min-w-full items-center">
97 <div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}"><span aria-hidden="true" class="invisible">{{$newStart}}</span></div>
98 <div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}" id="{{$name}}-N{{$newStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-N{{$newStart}}">{{ $newStart }}</a></div>
99 <div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div>
100 <div class="px-2">{{ .Line }}</div>
101 </div>
102 {{- $newStart = add64 $newStart 1 -}}
103 {{- end -}}
104 {{- if eq .Op.String "-" -}}
105 <div class="bg-red-100 dark:bg-red-800/30 text-red-700 dark:text-red-400 flex min-w-full items-center">
106 <div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}" id="{{$name}}-O{{$oldStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-O{{$oldStart}}">{{ $oldStart }}</a></div>
107 <div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}"><span aria-hidden="true" class="invisible">{{$oldStart}}</span></div>
108 <div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div>
109 <div class="px-2">{{ .Line }}</div>
110 </div>
111 {{- $oldStart = add64 $oldStart 1 -}}
112 {{- end -}}
113 {{- if eq .Op.String " " -}}
114 <div class="bg-white dark:bg-gray-800 text-gray-500 dark:text-gray-400 flex min-w-full items-center">
115 <div class="{{$lineNrStyle}} {{$lineNrSepStyle1}}" id="{{$name}}-O{{$oldStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-O{{$oldStart}}">{{ $oldStart }}</a></div>
116 <div class="{{$lineNrStyle}} {{$lineNrSepStyle2}}" id="{{$name}}-N{{$newStart}}"><a class="{{$linkStyle}}" href="#{{$name}}-N{{$newStart}}">{{ $newStart }}</a></div>
117 <div class="w-5 flex-shrink-0 select-none text-center">{{ .Op.String }}</div>
118 <div class="px-2">{{ .Line }}</div>
119 </div>
120 {{- $newStart = add64 $newStart 1 -}}
121 {{- $oldStart = add64 $oldStart 1 -}}
122 {{- end -}}
123 {{- end -}}
124 {{- end -}}</div></div></pre>
125 {{- end -}}
126 </div>
127
128 </details>
129
130 </div>
131 </div>
132 </section>
133 {{ end }}
134 {{ end }}
135{{ end }}
136
137{{ define "statPill" }}
138 <div class="flex items-center font-mono text-sm">
139 {{ if and .Insertions .Deletions }}
140 <span class="rounded-l p-1 select-none bg-green-100 text-green-700 dark:bg-green-800/50 dark:text-green-400">+{{ .Insertions }}</span>
141 <span class="rounded-r p-1 select-none bg-red-100 text-red-700 dark:bg-red-800/50 dark:text-red-400">-{{ .Deletions }}</span>
142 {{ else if .Insertions }}
143 <span class="rounded p-1 select-none bg-green-100 text-green-700 dark:bg-green-800/50 dark:text-green-400">+{{ .Insertions }}</span>
144 {{ else if .Deletions }}
145 <span class="rounded p-1 select-none bg-red-100 text-red-700 dark:bg-red-800/50 dark:text-red-400">-{{ .Deletions }}</span>
146 {{ end }}
147 </div>
148{{ end }}