appview/pages: show CI status in all pulls view #380

merged
opened by oppi.li targeting master from push-pvpnsqvvzuky
Changed files
+37 -10
appview
pages
templates
repo
pulls
+1
appview/pages/pages.go
···
DidHandleMap map[string]string
FilteringBy db.PullState
Stacks map[string]db.Stack
+
Pipelines map[string]db.Pipeline
}
func (p *Pages) RepoPulls(w io.Writer, params RepoPullsParams) error {
+5 -7
appview/pages/templates/repo/pulls/fragments/summarizedPullHeader.html
···
</span>
</div>
-
<div class="flex-shrink-0 flex items-center">
+
<div class="flex-shrink-0 flex items-center gap-2">
{{ $latestRound := .LastRoundNumber }}
{{ $lastSubmission := index .Submissions $latestRound }}
{{ $commentCount := len $lastSubmission.Comments }}
{{ if and $pipeline $pipeline.Id }}
-
<div class="inline-flex items-center gap-2">
-
{{ template "repo/pipelines/fragments/pipelineSymbol" $pipeline }}
-
<span class="mx-2 before:content-['·'] before:select-none"></span>
-
</div>
+
{{ template "repo/pipelines/fragments/pipelineSymbol" $pipeline }}
+
<span class="before:content-['·'] before:select-none text-gray-500 dark:text-gray-400"></span>
{{ end }}
<span>
-
<div class="inline-flex items-center gap-2">
+
<div class="inline-flex items-center gap-1">
{{ i "message-square" "w-3 h-3 md:hidden" }}
{{ $commentCount }}
<span class="hidden md:inline">comment{{if ne $commentCount 1}}s{{end}}</span>
</div>
</span>
-
<span class="mx-2 before:content-['·'] before:select-none"></span>
+
<span class="before:content-['·'] before:select-none text-gray-500 dark:text-gray-400"></span>
<span>
<span class="hidden md:inline">round</span>
<span class="font-mono">#{{ $latestRound }}</span>
+10 -3
appview/pages/templates/repo/pulls/pulls.html
···
<span class="text-gray-500 dark:text-gray-400">#{{ .PullId }}</span>
</a>
</div>
-
<p class="text-sm text-gray-500 dark:text-gray-400 flex flex-wrap items-center gap-1">
+
<div class="text-sm text-gray-500 dark:text-gray-400 flex flex-wrap items-center gap-1">
{{ $owner := index $.DidHandleMap .OwnerDid }}
{{ $bgColor := "bg-gray-800 dark:bg-gray-700" }}
{{ $icon := "ban" }}
···
#{{ .LastRoundNumber }}
</span>
</span>
-
</p>
+
+
{{ $pipeline := index $.Pipelines .LatestSha }}
+
{{ if $pipeline }}
+
<span class="before:content-['·']"></span>
+
{{ template "repo/pipelines/fragments/pipelineSymbol" $pipeline }}
+
{{ end }}
+
</div>
</div>
{{ if .StackId }}
{{ $otherPulls := index $.Stacks .StackId }}
···
{{ $root := index . 1 }}
<div class="grid grid-cols-1 rounded-b border-b border-t border-gray-200 dark:border-gray-900 divide-y divide-gray-200 dark:divide-gray-900">
{{ range $pull := $list }}
+
{{ $pipeline := index $root.Pipelines $pull.LatestSha }}
<a href="/{{ $root.RepoInfo.FullName }}/pulls/{{ $pull.PullId }}" class="no-underline hover:no-underline hover:bg-gray-100/25 hover:dark:bg-gray-700/25">
<div class="flex gap-2 items-center px-6">
<div class="flex-grow min-w-0 w-full py-2">
-
{{ template "repo/pulls/fragments/summarizedHeader" (list $pull 0) }}
+
{{ template "repo/pulls/fragments/summarizedHeader" (list $pull $pipeline) }}
</div>
</div>
</a>
+21
appview/pulls/pulls.go
···
// we want to group all stacked PRs into just one list
stacks := make(map[string]db.Stack)
+
var shas []string
n := 0
for _, p := range pulls {
+
// store the sha for later
+
shas = append(shas, p.LatestSha())
// this PR is stacked
if p.StackId != "" {
// we have already seen this PR stack
···
}
pulls = pulls[:n]
+
repoInfo := f.RepoInfo(user)
+
ps, err := db.GetPipelineStatuses(
+
s.db,
+
db.FilterEq("repo_owner", repoInfo.OwnerDid),
+
db.FilterEq("repo_name", repoInfo.Name),
+
db.FilterEq("knot", repoInfo.Knot),
+
db.FilterIn("sha", shas),
+
)
+
if err != nil {
+
log.Printf("failed to fetch pipeline statuses: %s", err)
+
// non-fatal
+
}
+
m := make(map[string]db.Pipeline)
+
for _, p := range ps {
+
m[p.Sha] = p
+
}
+
identsToResolve := make([]string, len(pulls))
for i, pull := range pulls {
identsToResolve[i] = pull.OwnerDid
···
DidHandleMap: didHandleMap,
FilteringBy: state,
Stacks: stacks,
+
Pipelines: m,
})
}