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