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