forked from tangled.org/core
this repo has no description

appview: add CI status component to pulls view

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li 96c219f5 8ce49f07

verified
Changed files
+89 -20
appview
db
pages
templates
repo
pulls
+4 -3
appview/db/pipeline.go
···
"github.com/bluesky-social/indigo/atproto/syntax"
"github.com/go-git/go-git/v5/plumbing"
spindle "tangled.sh/tangled.sh/core/spindle/models"
+
"tangled.sh/tangled.sh/core/workflow"
)
type Pipeline struct {
···
type Trigger struct {
Id int
-
Kind string
+
Kind workflow.TriggerKind
// push trigger fields
PushRef *string
···
}
func (t *Trigger) IsPush() bool {
-
return t != nil && t.Kind == "push"
+
return t != nil && t.Kind == workflow.TriggerKindPush
}
func (t *Trigger) IsPullRequest() bool {
-
return t != nil && t.Kind == "pull_request"
+
return t != nil && t.Kind == workflow.TriggerKindPullRequest
}
func (t *Trigger) TargetRef() string {
+1
appview/pages/pages.go
···
AbandonedPulls []*db.Pull
MergeCheck types.MergeCheckResponse
ResubmitCheck ResubmitResult
+
Pipelines map[string]db.Pipeline
}
func (p *Pages) RepoSinglePull(w io.Writer, params RepoSinglePullParams) error {
+3 -4
appview/pages/templates/repo/pipelines/fragments/logBlock.html
···
{{ define "repo/pipelines/fragments/logBlock" }}
<div id="lines" hx-swap-oob="beforeend">
-
<details id="step-{{ .Id }}" {{if not .Collapsed}}open{{end}} class="group bg-gray-100 px-2 dark:bg-gray-900">
-
<summary class="sticky top-0 py-1 list-none cursor-pointer py-2 bg-gray-100 dark:bg-gray-900 hover:text-gray-500 hover:dark:text-gray-400">
+
<details id="step-{{ .Id }}" {{if not .Collapsed}}open{{end}} class="group bg-gray-100 pb-2 px-2 dark:bg-gray-900">
+
<summary class="sticky top-0 pt-2 group-open:pb-2 list-none cursor-pointer bg-gray-100 dark:bg-gray-900 hover:text-gray-500 hover:dark:text-gray-400">
<div class="group-open:hidden flex items-center gap-1">
{{ i "chevron-right" "w-4 h-4" }} {{ .Name }}
</div>
···
{{ i "chevron-down" "w-4 h-4" }} {{ .Name }}
</div>
</summary>
-
<div class="text-blue-600 dark:text-blue-300 font-mono">{{ .Command }}</div>
-
<div id="step-body-{{ .Id }}" class="font-mono"></div>
+
<div class="font-mono whitespace-pre overflow-x-auto"><div class="text-blue-600 dark:text-blue-300">{{ .Command }}</div><div id="step-body-{{ .Id }}"></div></div>
</details>
</div>
{{ end }}
+1 -3
appview/pages/templates/repo/pipelines/fragments/logLine.html
···
{{ define "repo/pipelines/fragments/logLine" }}
-
<div id="step-body-{{ .Id }}" hx-swap-oob="beforeend">
-
<p>{{ .Content }}</p>
-
</div>
+
<div id="step-body-{{ .Id }}" hx-swap-oob="beforeend" class="whitespace-pre"><p>{{ .Content }}</p></div>
{{ end }}
+13 -8
appview/pages/templates/repo/pipelines/pipelines.html
···
{{ $p := index . 1 }}
{{ with $p }}
<div class="grid grid-cols-6 md:grid-cols-12 gap-2 items-center w-full">
-
<div class="col-span-2 md:col-span-8 flex items-center gap-4">
+
<div class="text-sm md:text-base col-span-1">
+
{{ .Trigger.Kind.String }}
+
</div>
+
+
<div class="col-span-2 md:col-span-7 flex items-center gap-4">
{{ $target := .Trigger.TargetRef }}
{{ $workflows := .Workflows }}
{{ $link := "" }}
···
{{ end }}
{{ if .Trigger.IsPush }}
<span class="font-bold">{{ $target }}</span>
-
<span>push</span>
<span class="hidden md:inline-flex gap-2 items-center font-mono text-sm">
{{ $old := deref .Trigger.PushOldSha }}
{{ $new := deref .Trigger.PushNewSha }}
···
<a href="/{{ $root.RepoInfo.FullName }}/commit/{{ $old }}">{{ slice $old 0 8 }}</a>
</span>
{{ else if .Trigger.IsPullRequest }}
-
<span>
-
pull request
-
<span class="inline-flex gap-2 items-center">
-
{{ $target }}
-
{{ i "arrow-left" "size-4" }}
-
{{ .Trigger.PRSourceBranch }}
+
{{ $sha := deref .Trigger.PRSourceSha }}
+
<span class="inline-flex gap-2 items-center">
+
<span class="font-bold">{{ $target }}</span>
+
{{ i "arrow-left" "size-4" }}
+
{{ .Trigger.PRSourceBranch }}
+
<span class="text-sm font-mono">
+
@
+
<a href="/{{ $root.RepoInfo.FullName }}/commit/{{ $sha }}">{{ slice $sha 0 8 }}</a>
</span>
</span>
{{ end }}
+40 -1
appview/pages/templates/repo/pulls/pull.html
···
</div>
{{ end }}
+
{{ block "pipelineStatus" (list $ .) }} {{ end }}
+
{{ if eq $lastIdx .RoundNumber }}
{{ block "mergeStatus" $ }} {{ end }}
{{ block "resubmitStatus" $ }} {{ end }}
···
{{ end }}
{{ end }}
-
{{ define "commits" }}
+
{{ define "pipelineStatus" }}
+
{{ $root := index . 0 }}
+
{{ $submission := index . 1 }}
+
{{ $pipeline := index $root.Pipelines $submission.SourceRev }}
+
{{ with $pipeline }}
+
{{ $id := .Id }}
+
{{ if .Statuses }}
+
<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">
+
{{ range $name, $all := .Statuses }}
+
<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">
+
<div
+
class="flex gap-2 items-center justify-between p-2">
+
{{ $lastStatus := $all.Latest }}
+
{{ $kind := $lastStatus.Status.String }}
+
+
{{ $t := .TimeTaken }}
+
{{ $time := "" }}
+
+
{{ if $t }}
+
{{ $time = durationFmt $t }}
+
{{ else }}
+
{{ $time = printf "%s ago" (shortTimeFmt $lastStatus.Created) }}
+
{{ end }}
+
+
<div id="left" class="flex items-center gap-2 flex-shrink-0">
+
{{ template "repo/pipelines/fragments/workflowSymbol" $all }}
+
{{ $name }}
+
</div>
+
<div id="right" class="flex items-center gap-2 flex-shrink-0">
+
<span class="font-bold">{{ $kind }}</span>
+
<time>{{ $time }}</time>
+
</div>
+
</div>
+
</a>
+
{{ end }}
+
</div>
+
{{ end }}
+
{{ end }}
{{ end }}
+27 -1
appview/pulls/pulls.go
···
resubmitResult = s.resubmitCheck(f, pull, stack)
}
+
repoInfo := f.RepoInfo(user)
+
+
m := make(map[string]db.Pipeline)
+
+
var shas []string
+
for _, s := range pull.Submissions {
+
shas = append(shas, s.SourceRev)
+
}
+
+
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
+
}
+
+
for _, p := range ps {
+
m[p.Sha] = p
+
}
+
s.pages.RepoSinglePull(w, pages.RepoSinglePullParams{
LoggedInUser: user,
-
RepoInfo: f.RepoInfo(user),
+
RepoInfo: repoInfo,
DidHandleMap: didHandleMap,
Pull: pull,
Stack: stack,
AbandonedPulls: abandonedPulls,
MergeCheck: mergeCheckResponse,
ResubmitCheck: resubmitResult,
+
Pipelines: m,
})
}