1{{ define "title" }}
2 {{ .Pull.Title }} · pull #{{ .Pull.PullId }} · {{ .RepoInfo.FullName }}
3{{ end }}
4
5{{ define "extrameta" }}
6 {{ template "repo/pulls/fragments/og" (dict "RepoInfo" .RepoInfo "Pull" .Pull) }}
7{{ end }}
8
9{{ define "repoContentLayout" }}
10 <div class="grid grid-cols-1 md:grid-cols-10 gap-4 w-full">
11 <div class="col-span-1 md:col-span-8">
12 <section class="bg-white dark:bg-gray-800 p-6 rounded relative w-full mx-auto dark:text-white">
13 {{ block "repoContent" . }}{{ end }}
14 </section>
15 {{ block "repoAfter" . }}{{ end }}
16 </div>
17 <div class="col-span-1 md:col-span-2 flex flex-col gap-6">
18 {{ template "repo/fragments/labelPanel"
19 (dict "RepoInfo" $.RepoInfo
20 "Defs" $.LabelDefs
21 "Subject" $.Pull.AtUri
22 "State" $.Pull.Labels) }}
23 {{ template "repo/fragments/participants" $.Pull.Participants }}
24 {{ template "repo/fragments/externalLinkPanel" $.Pull.AtUri }}
25 </div>
26 </div>
27{{ end }}
28
29{{ define "repoContent" }}
30 {{ template "repo/pulls/fragments/pullHeader" . }}
31
32 {{ if .Pull.IsStacked }}
33 <div class="mt-8">
34 {{ template "repo/pulls/fragments/pullStack" . }}
35 </div>
36 {{ end }}
37{{ end }}
38
39{{ define "repoAfter" }}
40 <section id="submissions" class="mt-4">
41 <div class="flex flex-col gap-4">
42 {{ block "submissions" . }} {{ end }}
43 </div>
44 </section>
45
46 <div id="pull-close"></div>
47 <div id="pull-reopen"></div>
48{{ end }}
49
50{{ define "submissions" }}
51 {{ $lastIdx := sub (len .Pull.Submissions) 1 }}
52 {{ $targetBranch := .Pull.TargetBranch }}
53 {{ $repoName := .RepoInfo.FullName }}
54 {{ range $idx, $item := .Pull.Submissions }}
55 {{ with $item }}
56 <details {{ if eq $idx $lastIdx }}open{{ end }}>
57 <summary id="round-#{{ .RoundNumber }}" class="list-none cursor-pointer">
58 <div class="flex flex-wrap gap-2 items-stretch">
59 <!-- round number -->
60 <div class="rounded bg-white dark:bg-gray-800 drop-shadow-sm px-3 py-2 dark:text-white">
61 <span class="flex items-center">{{ i "hash" "w-4 h-4" }}{{ .RoundNumber }}</span>
62 </div>
63 <!-- round summary -->
64 <div class="flex-1 rounded drop-shadow-sm bg-white dark:bg-gray-800 p-2 text-gray-500 dark:text-gray-400">
65 <span class="gap-1 flex items-center">
66 {{ $owner := resolve $.Pull.OwnerDid }}
67 {{ $re := "re" }}
68 {{ if eq .RoundNumber 0 }}
69 {{ $re = "" }}
70 {{ end }}
71 <span class="hidden md:inline">{{$re}}submitted</span>
72 by {{ template "user/fragments/picHandleLink" $.Pull.OwnerDid }}
73 <span class="select-none before:content-['\00B7']"></span>
74 <a class="text-gray-500 dark:text-gray-400 hover:text-gray-500" href="#round-#{{ .RoundNumber }}">{{ template "repo/fragments/shortTime" .Created }}</a>
75 <span class="select-none before:content-['·']"></span>
76 {{ $s := "s" }}
77 {{ if eq (len .Comments) 1 }}
78 {{ $s = "" }}
79 {{ end }}
80 {{ len .Comments }} comment{{$s}}
81 </span>
82 </div>
83
84 <a class="btn flex items-center gap-2 no-underline hover:no-underline p-2 group"
85 hx-boost="true"
86 href="/{{ $.RepoInfo.FullName }}/pulls/{{ $.Pull.PullId }}/round/{{.RoundNumber}}">
87 {{ i "file-diff" "w-4 h-4" }}
88 <span class="hidden md:inline">diff</span>
89 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
90 </a>
91 {{ if ne $idx 0 }}
92 <a class="btn flex items-center gap-2 no-underline hover:no-underline p-2 group"
93 hx-boost="true"
94 href="/{{ $.RepoInfo.FullName }}/pulls/{{ $.Pull.PullId }}/round/{{.RoundNumber}}/interdiff">
95 {{ i "chevrons-left-right-ellipsis" "w-4 h-4 rotate-90" }}
96 <span class="hidden md:inline">interdiff</span>
97 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
98 </a>
99 {{ end }}
100 <span id="interdiff-error-{{.RoundNumber}}"></span>
101 </div>
102 </summary>
103
104 {{ if .IsFormatPatch }}
105 {{ $patches := .AsFormatPatch }}
106 {{ $round := .RoundNumber }}
107 <details class="group py-2 md:ml-[3.5rem] text-gray-500 dark:text-gray-400 flex flex-col gap-2 relative text-sm">
108 <summary class="py-1 list-none cursor-pointer hover:text-gray-500 hover:dark:text-gray-400">
109 {{ $s := "s" }}
110 {{ if eq (len $patches) 1 }}
111 {{ $s = "" }}
112 {{ end }}
113 <div class="group-open:hidden flex items-center gap-2 ml-2">
114 {{ i "chevrons-up-down" "w-4 h-4" }} expand {{ len $patches }} commit{{$s}}
115 </div>
116 <div class="hidden group-open:flex items-center gap-2 ml-2">
117 {{ i "chevrons-down-up" "w-4 h-4" }} hide {{ len $patches }} commit{{$s}}
118 </div>
119 </summary>
120 {{ range $patches }}
121 <div id="commit-{{.SHA}}" class="py-1 px-2 relative w-full md:max-w-3/5 md:w-fit flex flex-col">
122 <div class="flex items-center gap-2">
123 {{ i "git-commit-horizontal" "w-4 h-4" }}
124 <div class="text-sm text-gray-500 dark:text-gray-400">
125 <!-- attempt to resolve $fullRepo: this is possible only on non-deleted forks and branches -->
126 {{ $fullRepo := "" }}
127 {{ if and $.Pull.IsForkBased $.Pull.PullSource.Repo }}
128 {{ $fullRepo = printf "%s/%s" $owner $.Pull.PullSource.Repo.Name }}
129 {{ else if $.Pull.IsBranchBased }}
130 {{ $fullRepo = $.RepoInfo.FullName }}
131 {{ end }}
132
133 <!-- if $fullRepo was resolved, link to it, otherwise just span without a link -->
134 {{ if $fullRepo }}
135 <a href="/{{ $fullRepo }}/commit/{{ .SHA }}" class="font-mono text-gray-500 dark:text-gray-400">{{ slice .SHA 0 8 }}</a>
136 {{ else }}
137 <span class="font-mono">{{ slice .SHA 0 8 }}</span>
138 {{ end }}
139 </div>
140 <div class="flex items-center">
141 <span>{{ .Title | description }}</span>
142 {{ if gt (len .Body) 0 }}
143 <button
144 class="py-1/2 px-1 mx-2 bg-gray-200 hover:bg-gray-400 rounded dark:bg-gray-700 dark:hover:bg-gray-600"
145 hx-on:click="document.getElementById('body-{{$round}}-{{.SHA}}').classList.toggle('hidden')"
146 >
147 {{ i "ellipsis" "w-3 h-3" }}
148 </button>
149 {{ end }}
150 </div>
151 </div>
152 {{ if gt (len .Body) 0 }}
153 <p id="body-{{$round}}-{{.SHA}}" class="hidden mt-1 text-sm pb-2">
154 {{ nl2br .Body }}
155 </p>
156 {{ end }}
157 </div>
158 {{ end }}
159 </details>
160 {{ end }}
161
162
163 <div class="md:pl-[3.5rem] flex flex-col gap-2 mt-2 relative">
164 {{ range $cidx, $c := .Comments }}
165 <div id="comment-{{$c.ID}}" class="bg-white dark:bg-gray-800 rounded drop-shadow-sm py-2 px-4 relative w-full">
166 {{ if gt $cidx 0 }}
167 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300 dark:bg-gray-600"></div>
168 {{ end }}
169 <div class="text-sm text-gray-500 dark:text-gray-400 flex items-center gap-1">
170 {{ template "user/fragments/picHandleLink" $c.OwnerDid }}
171 <span class="before:content-['·']"></span>
172 <a class="text-gray-500 dark:text-gray-400 hover:text-gray-500 dark:hover:text-gray-300" href="#comment-{{.ID}}">{{ template "repo/fragments/time" $c.Created }}</a>
173 </div>
174 <div class="prose dark:prose-invert">
175 {{ $c.Body | markdown }}
176 </div>
177 </div>
178 {{ end }}
179
180 {{ block "pipelineStatus" (list $ .) }} {{ end }}
181
182 {{ if eq $lastIdx .RoundNumber }}
183 {{ block "mergeStatus" $ }} {{ end }}
184 {{ block "resubmitStatus" $ }} {{ end }}
185 {{ end }}
186
187 {{ if $.LoggedInUser }}
188 {{ template "repo/pulls/fragments/pullActions"
189 (dict
190 "LoggedInUser" $.LoggedInUser
191 "Pull" $.Pull
192 "RepoInfo" $.RepoInfo
193 "RoundNumber" .RoundNumber
194 "MergeCheck" $.MergeCheck
195 "ResubmitCheck" $.ResubmitCheck
196 "BranchDeleteStatus" $.BranchDeleteStatus
197 "Stack" $.Stack) }}
198 {{ else }}
199 <div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm p-2 relative flex gap-2 items-center w-fit">
200 <a href="/signup" class="btn-create py-0 hover:no-underline hover:text-white flex items-center gap-2">
201 sign up
202 </a>
203 <span class="text-gray-500 dark:text-gray-400">or</span>
204 <a href="/login" class="underline">login</a>
205 to add to the discussion
206 </div>
207 {{ end }}
208 </div>
209 </details>
210 {{ end }}
211 {{ end }}
212{{ end }}
213
214{{ define "mergeStatus" }}
215 {{ if .Pull.State.IsClosed }}
216 <div class="bg-gray-50 dark:bg-gray-700 border border-black dark:border-gray-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
217 <div class="flex items-center gap-2 text-black dark:text-white">
218 {{ i "ban" "w-4 h-4" }}
219 <span class="font-medium">closed without merging</span
220 >
221 </div>
222 </div>
223 {{ else if .Pull.State.IsMerged }}
224 <div class="bg-purple-50 dark:bg-purple-900 border border-purple-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
225 <div class="flex items-center gap-2 text-purple-500 dark:text-purple-300">
226 {{ i "git-merge" "w-4 h-4" }}
227 <span class="font-medium">pull request successfully merged</span
228 >
229 </div>
230 </div>
231 {{ else if .Pull.State.IsDeleted }}
232 <div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
233 <div class="flex items-center gap-2 text-red-500 dark:text-red-300">
234 {{ i "git-pull-request-closed" "w-4 h-4" }}
235 <span class="font-medium">This pull has been deleted (possibly by jj abandon or jj squash)</span>
236 </div>
237 </div>
238 {{ else if and .MergeCheck .MergeCheck.Error }}
239 <div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
240 <div class="flex items-center gap-2 text-red-500 dark:text-red-300">
241 {{ i "triangle-alert" "w-4 h-4" }}
242 <span class="font-medium">{{ .MergeCheck.Error }}</span>
243 </div>
244 </div>
245 {{ else if and .MergeCheck .MergeCheck.IsConflicted }}
246 <div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
247 <div class="flex flex-col gap-2 text-red-500 dark:text-red-300">
248 <div class="flex items-center gap-2">
249 {{ i "triangle-alert" "w-4 h-4" }}
250 <span class="font-medium">merge conflicts detected</span>
251 </div>
252 {{ if gt (len .MergeCheck.Conflicts) 0 }}
253 <ul class="space-y-1">
254 {{ range .MergeCheck.Conflicts }}
255 {{ if .Filename }}
256 <li class="flex items-center">
257 {{ i "file-warning" "w-4 h-4 mr-1.5 text-red-500 dark:text-red-300" }}
258 <span class="font-mono">{{ .Filename }}</span>
259 </li>
260 {{ else if .Reason }}
261 <li class="flex items-center">
262 {{ i "file-warning" "w-4 h-4 mr-1.5 text-red-500 dark:text-red-300" }}
263 <span>{{.Reason}}</span>
264 </li>
265 {{ end }}
266 {{ end }}
267 </ul>
268 {{ end }}
269 </div>
270 </div>
271 {{ else if .MergeCheck }}
272 <div class="bg-green-50 dark:bg-green-900 border border-green-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
273 <div class="flex items-center gap-2 text-green-500 dark:text-green-300">
274 {{ i "circle-check-big" "w-4 h-4" }}
275 <span class="font-medium">no conflicts, ready to merge</span>
276 </div>
277 </div>
278 {{ end }}
279{{ end }}
280
281{{ define "resubmitStatus" }}
282 {{ if .ResubmitCheck.Yes }}
283 <div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
284 <div class="flex items-center gap-2 text-amber-500 dark:text-amber-300">
285 {{ i "triangle-alert" "w-4 h-4" }}
286 <span class="font-medium">this branch has been updated, consider resubmitting</span>
287 </div>
288 </div>
289 {{ end }}
290{{ end }}
291
292{{ define "pipelineStatus" }}
293 {{ $root := index . 0 }}
294 {{ $submission := index . 1 }}
295 {{ $pipeline := index $root.Pipelines $submission.SourceRev }}
296 {{ with $pipeline }}
297 {{ $id := .Id }}
298 {{ if .Statuses }}
299 <div class="max-w-80 grid grid-cols-1 bg-white dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 divide-y divide-gray-200 dark:divide-gray-700">
300 {{ range $name, $all := .Statuses }}
301 <a href="/{{ $root.RepoInfo.FullName }}/pipelines/{{ $id }}/workflow/{{ $name }}" class="no-underline hover:no-underline hover:bg-gray-100/25 hover:dark:bg-gray-700/25">
302 <div
303 class="flex gap-2 items-center justify-between p-2">
304 {{ $lastStatus := $all.Latest }}
305 {{ $kind := $lastStatus.Status.String }}
306
307 <div id="left" class="flex items-center gap-2 flex-shrink-0">
308 {{ template "repo/pipelines/fragments/workflowSymbol" $all }}
309 {{ $name }}
310 </div>
311 <div id="right" class="flex items-center gap-2 flex-shrink-0">
312 <span class="font-bold">{{ $kind }}</span>
313 {{ if .TimeTaken }}
314 {{ template "repo/fragments/duration" .TimeTaken }}
315 {{ else }}
316 {{ template "repo/fragments/shortTimeAgo" $lastStatus.Created }}
317 {{ end }}
318 </div>
319 </div>
320 </a>
321 {{ end }}
322 </div>
323 {{ end }}
324 {{ end }}
325{{ end }}