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