this repo has no description

wip: rework commit views

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

Changed files
+225 -185
appview
models
pages
templates
spindle
models
+39
appview/models/pipeline.go
··· 1 1 package models 2 2 3 3 import ( 4 + "fmt" 4 5 "slices" 6 + "strings" 5 7 "time" 6 8 7 9 "github.com/bluesky-social/indigo/atproto/syntax" ··· 50 52 } 51 53 52 54 return 0 55 + } 56 + 57 + // produces short summary of successes: 58 + // - "0/4" when zero successes of 4 workflows 59 + // - "4/4" when all successes of 4 workflows 60 + // - "0/0" when no workflows run in this pipeline 61 + func (p Pipeline) ShortStatusSummary() string { 62 + counts := make(map[spindle.StatusKind]int) 63 + for _, w := range p.Statuses { 64 + counts[w.Latest().Status] += 1 65 + } 66 + 67 + total := len(p.Statuses) 68 + successes := counts[spindle.StatusKindSuccess] 69 + 70 + return fmt.Sprintf("%d/%d", successes, total) 71 + } 72 + 73 + // produces a string of the form "3/4 success, 2/4 failed, 1/4 pending" 74 + func (p Pipeline) LongStatusSummary() string { 75 + counts := make(map[spindle.StatusKind]int) 76 + for _, w := range p.Statuses { 77 + counts[w.Latest().Status] += 1 78 + } 79 + 80 + total := len(p.Statuses) 81 + 82 + var result []string 83 + // finish states first, followed by start states 84 + states := append(spindle.FinishStates[:], spindle.StartStates[:]...) 85 + for _, state := range states { 86 + if count, ok := counts[state]; ok { 87 + result = append(result, fmt.Sprintf("%d/%d %s", count, total, state.String())) 88 + } 89 + } 90 + 91 + return strings.Join(result, ", ") 53 92 } 54 93 55 94 func (p Pipeline) Counts() map[string]int {
+1 -1
appview/pages/templates/fragments/tabSelector.html
··· 9 9 {{ range $index, $value := $all }} 10 10 {{ $isActive := eq $value.Key $active }} 11 11 <a href="?{{ $name }}={{ $value.Key }}" 12 - hx-boost 12 + hx-boost=true 13 13 {{ if $include }} 14 14 hx-get="?{{ $name }}={{ $value.Key }}" 15 15 hx-include="{{ $include }}"
+60 -69
appview/pages/templates/repo/pipelines/fragments/pipelineSymbol.html
··· 1 1 {{ define "repo/pipelines/fragments/pipelineSymbol" }} 2 - <div class="cursor-pointer"> 3 - {{ $c := .Counts }} 4 - {{ $statuses := .Statuses }} 5 - {{ $total := len $statuses }} 6 - {{ $success := index $c "success" }} 7 - {{ $fail := index $c "failed" }} 8 - {{ $timeout := index $c "timeout" }} 9 - {{ $empty := eq $total 0 }} 10 - {{ $allPass := eq $success $total }} 11 - {{ $allFail := eq $fail $total }} 12 - {{ $allTimeout := eq $timeout $total }} 13 - 14 - {{ if $empty }} 15 - <div class="flex gap-1 items-center"> 16 - {{ i "hourglass" "size-4 text-gray-600 dark:text-gray-400 " }} 17 - <span>0/{{ $total }}</span> 18 - </div> 19 - {{ else if $allPass }} 20 - <div class="flex gap-1 items-center"> 21 - {{ i "check" "size-4 text-green-600" }} 22 - <span>{{ $total }}/{{ $total }}</span> 23 - </div> 24 - {{ else if $allFail }} 25 - <div class="flex gap-1 items-center"> 26 - {{ i "x" "size-4 text-red-500" }} 27 - <span>0/{{ $total }}</span> 28 - </div> 29 - {{ else if $allTimeout }} 30 - <div class="flex gap-1 items-center"> 31 - {{ i "clock-alert" "size-4 text-orange-500" }} 32 - <span>0/{{ $total }}</span> 33 - </div> 2 + <div class="cursor-pointer flex gap-2 items-center"> 3 + {{ template "symbol" .Pipeline }} 4 + {{ if .ShortSummary }} 5 + {{ .Pipeline.ShortStatusSummary }} 34 6 {{ else }} 35 - {{ $radius := f64 8 }} 36 - {{ $circumference := mulf64 2.0 (mulf64 3.1416 $radius) }} 37 - {{ $offset := 0.0 }} 38 - <div class="flex gap-1 items-center"> 39 - <svg class="w-4 h-4 transform -rotate-90" viewBox="0 0 20 20"> 40 - <circle cx="10" cy="10" r="{{ $radius }}" fill="none" stroke="#f3f4f633" stroke-width="2"/> 7 + {{ .Pipeline.LongStatusSummary }} 8 + {{ end }} 9 + </div> 10 + {{ end }} 41 11 42 - {{ range $kind, $count := $c }} 43 - {{ $color := "" }} 44 - {{ if or (eq $kind "pending") (eq $kind "running") }} 45 - {{ $color = "#eab308" }} {{/* amber-500 */}} 46 - {{ else if eq $kind "success" }} 47 - {{ $color = "#10b981" }} {{/* green-500 */}} 48 - {{ else if eq $kind "cancelled" }} 49 - {{ $color = "#6b7280" }} {{/* gray-500 */}} 50 - {{ else if eq $kind "timeout" }} 51 - {{ $color = "#fb923c" }} {{/* orange-400 */}} 52 - {{ else }} 53 - {{ $color = "#ef4444" }} {{/* red-500 for failed or unknown */}} 54 - {{ end }} 12 + {{ define "symbol" }} 13 + {{ $c := .Counts }} 14 + {{ $statuses := .Statuses }} 15 + {{ $total := len $statuses }} 16 + {{ $success := index $c "success" }} 17 + {{ $fail := index $c "failed" }} 18 + {{ $timeout := index $c "timeout" }} 19 + {{ $empty := eq $total 0 }} 20 + {{ $allPass := eq $success $total }} 21 + {{ $allFail := eq $fail $total }} 22 + {{ $allTimeout := eq $timeout $total }} 55 23 56 - {{ $percent := divf64 (f64 $count) (f64 $total) }} 57 - {{ $length := mulf64 $percent $circumference }} 58 - 59 - <circle 60 - cx="10" cy="10" r="{{ $radius }}" 61 - fill="none" 62 - stroke="{{ $color }}" 63 - stroke-width="2" 64 - stroke-dasharray="{{ printf "%.2f %.2f" $length (subf64 $circumference $length) }}" 65 - stroke-dashoffset="{{ printf "%.2f" (negf64 $offset) }}" 66 - /> 67 - {{ $offset = addf64 $offset $length }} 68 - {{ end }} 69 - </svg> 70 - <span>{{ $success }}/{{ $total }}</span> 71 - </div> 72 - {{ end }} 73 - </div> 24 + {{ if $empty }} 25 + {{ i "hourglass" "size-4 text-gray-600 dark:text-gray-400 " }} 26 + {{ else if $allPass }} 27 + {{ i "check" "size-4 text-green-600 dark:text-green-500" }} 28 + {{ else if $allFail }} 29 + {{ i "x" "size-4 text-red-600 dark:text-red-500" }} 30 + {{ else if $allTimeout }} 31 + {{ i "clock-alert" "size-4 text-orange-500" }} 32 + {{ else }} 33 + {{ $radius := f64 8 }} 34 + {{ $circumference := mulf64 2.0 (mulf64 3.1416 $radius) }} 35 + {{ $offset := 0.0 }} 36 + <svg class="w-4 h-4 transform -rotate-90" viewBox="0 0 20 20"> 37 + <circle cx="10" cy="10" r="{{ $radius }}" fill="none" class="stroke-gray-200 dark:stroke-gray-700" stroke-width="2"/> 38 + {{ range $kind, $count := $c }} 39 + {{ $colorClass := "" }} 40 + {{ if or (eq $kind "pending") (eq $kind "running") }} 41 + {{ $colorClass = "stroke-yellow-600 dark:stroke-yellow-500" }} 42 + {{ else if eq $kind "success" }} 43 + {{ $colorClass = "stroke-green-600 dark:stroke-green-500" }} 44 + {{ else if eq $kind "cancelled" }} 45 + {{ $colorClass = "stroke-gray-600 dark:stroke-gray-500" }} 46 + {{ else if eq $kind "timeout" }} 47 + {{ $colorClass = "stroke-orange-600 dark:stroke-orange-500" }} 48 + {{ else }} 49 + {{ $colorClass = "stroke-red-600 dark:stroke-red-500" }} 50 + {{ end }} 51 + {{ $percent := divf64 (f64 $count) (f64 $total) }} 52 + {{ $length := mulf64 $percent $circumference }} 53 + <circle 54 + cx="10" cy="10" r="{{ $radius }}" 55 + fill="none" 56 + class="{{ $colorClass }}" 57 + stroke-width="2" 58 + stroke-dasharray="{{ printf "%.2f %.2f" $length (subf64 $circumference $length) }}" 59 + stroke-dashoffset="{{ printf "%.2f" (negf64 $offset) }}" 60 + /> 61 + {{ $offset = addf64 $offset $length }} 62 + {{ end }} 63 + </svg> 64 + {{ end }} 74 65 {{ end }}
+1 -1
appview/pages/templates/repo/pipelines/fragments/pipelineSymbolLong.html
··· 4 4 <div class="relative inline-block"> 5 5 <details class="relative"> 6 6 <summary class="cursor-pointer list-none"> 7 - {{ template "repo/pipelines/fragments/pipelineSymbol" .Pipeline }} 7 + {{ template "repo/pipelines/fragments/pipelineSymbol" (dict "Pipeline" $pipeline "ShortSummary" true) }} 8 8 </summary> 9 9 {{ template "repo/pipelines/fragments/tooltip" $ }} 10 10 </details>
+1 -1
appview/pages/templates/repo/pulls/fragments/summarizedPullHeader.html
··· 18 18 {{ $lastSubmission := index .Submissions $latestRound }} 19 19 {{ $commentCount := len $lastSubmission.Comments }} 20 20 {{ if and $pipeline $pipeline.Id }} 21 - {{ template "repo/pipelines/fragments/pipelineSymbol" $pipeline }} 21 + {{ template "repo/pipelines/fragments/pipelineSymbol" (dict "Pipeline" $pipeline "ShortSummary" true) }} 22 22 <span class="before:content-['·'] before:select-none text-gray-500 dark:text-gray-400"></span> 23 23 {{ end }} 24 24 <span>
+120 -110
appview/pages/templates/repo/pulls/pull.html
··· 121 121 /> 122 122 </div> 123 123 <!-- right column: name and body in two rows --> 124 - <div class="flex-1 min-w-0 flex flex-col gap-2"> 124 + <div class="flex-1 min-w-0 flex flex-col gap-1"> 125 125 <div class="flex gap-2 items-center justify-between mb-1"> 126 - <span class="inline-flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-500"> 126 + <span class="inline-flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400"> 127 127 {{ resolve $.Pull.OwnerDid }} submitted v{{ $round }} 128 128 <span class="select-none before:content-['\00B7']"></span> 129 129 <a class="text-gray-500 dark:text-gray-400 hover:text-gray-500" href="#round-#{{ $round }}">{{ template "repo/fragments/shortTimeAgo" .Created }}</a> ··· 137 137 </a> 138 138 {{ end }} 139 139 </div> 140 + <details class="group"> 141 + <summary class="list-none cursor-pointer flex items-center gap-2"> 142 + <span>{{ i "git-commit-horizontal" "w-4 h-4" }}</span> 143 + {{ len $patches }} commit{{ if ne (len $patches) 1 }}s{{ end }} 144 + </summary> 145 + {{ range $patches }} 146 + <div id="commit-{{.SHA}}" class="py-1 relative w-full md:max-w-3/5 md:w-fit flex flex-col text-gray-600 dark:text-gray-300"> 147 + <div class="flex items-baseline gap-2"> 148 + <div> 149 + <!-- attempt to resolve $fullRepo: this is possible only on non-deleted forks and branches --> 150 + {{ $fullRepo := "" }} 151 + {{ if and $.Pull.IsForkBased $.Pull.PullSource.Repo }} 152 + {{ $fullRepo = printf "%s/%s" $.Pull.OwnerDid $.Pull.PullSource.Repo.Name }} 153 + {{ else if $.Pull.IsBranchBased }} 154 + {{ $fullRepo = $.RepoInfo.FullName }} 155 + {{ end }} 156 + 157 + <!-- if $fullRepo was resolved, link to it, otherwise just span without a link --> 158 + {{ if $fullRepo }} 159 + <a href="/{{ $fullRepo }}/commit/{{ .SHA }}" class="font-mono text-gray-600 dark:text-gray-300">{{ slice .SHA 0 8 }}</a> 160 + {{ else }} 161 + <span class="font-mono">{{ slice .SHA 0 8 }}</span> 162 + {{ end }} 163 + </div> 164 + 165 + <div> 166 + <span>{{ .Title | description }}</span> 167 + {{ if gt (len .Body) 0 }} 168 + <button 169 + 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" 170 + hx-on:click="document.getElementById('body-{{$round}}-{{.SHA}}').classList.toggle('hidden')" 171 + > 172 + {{ i "ellipsis" "w-3 h-3" }} 173 + </button> 174 + {{ end }} 175 + {{ if gt (len .Body) 0 }} 176 + <p id="body-{{$round}}-{{.SHA}}" class="hidden mt-1 text-sm pb-2">{{ nl2br .Body }}</p> 177 + {{ end }} 178 + </div> 179 + </div> 180 + </div> 181 + {{ end }} 182 + </details> 140 183 <div> 141 - {{ if eq 1 (len $patches) }} 142 - <!-- only one commit, just inline the message into the round header --> 143 - {{ $commit := index $patches 0 }} 144 - <span>{{ $commit.Title | description }}</span> 145 - {{ if gt (len $commit.Body) 0 }} 146 - <p id="body-{{$round}}-{{$commit.SHA}}" class="mt-1 pb-2"> 147 - {{ nl2br $commit.Body }} 148 - </p> 149 - {{ end }} 150 - {{ else }} 151 - <span>Commits:</span> 152 - {{ range $patches }} 153 - <div id="commit-{{.SHA}}" class="py-1 px-2 relative w-full md:max-w-3/5 md:w-fit flex flex-col"> 154 - <div class="flex items-center gap-2"> 155 - {{ i "git-commit-horizontal" "w-4 h-4 flex-shrink-0" }} 156 - <div class="flex items-center"> 157 - <span>{{ .Title | description }}</span> 158 - {{ if gt (len .Body) 0 }} 159 - <button 160 - 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" 161 - hx-on:click="document.getElementById('body-{{$round}}-{{.SHA}}').classList.toggle('hidden')" 162 - > 163 - {{ i "ellipsis" "w-3 h-3" }} 164 - </button> 165 - {{ end }} 166 - </div> 167 - </div> 168 - {{ if gt (len .Body) 0 }} 169 - <p id="body-{{$round}}-{{.SHA}}" class="hidden mt-1 text-sm pb-2"> 170 - {{ nl2br .Body }} 171 - </p> 172 - {{ end }} 173 - </div> 174 - {{ end }} 175 - {{ end }} 176 - </div> 177 - <div> 178 - {{ block "pipelineStatus" (list $ .) }} {{ end }} 179 - </div> 184 + {{ block "pipelineStatus" (list $ .) }} {{ end }} 185 + </div> 186 + {{ if eq $lastIdx .RoundNumber }} 187 + {{ block "mergeCheck" $ }} {{ end }} 188 + {{ end }} 180 189 </div> 181 190 </div> 182 191 <div class="relative ml-10 border-l-2 border-gray-200 dark:border-gray-700"> ··· 454 463 {{ end }} 455 464 {{ end }} 456 465 466 + {{ define "mergeCheck" }} 467 + {{ $isOpen := .Pull.State.IsOpen }} 468 + {{ if and $isOpen .MergeCheck .MergeCheck.Error }} 469 + <div class="flex items-center gap-2"> 470 + {{ i "triangle-alert" "w-4 h-4 text-red-500 dark:text-red-300" }} 471 + {{ .MergeCheck.Error }} 472 + </div> 473 + {{ else if and $isOpen .MergeCheck .MergeCheck.IsConflicted }} 474 + <details class="group"> 475 + <summary class="flex items-center justify-between cursor-pointer list-none"> 476 + <div class="flex items-center gap-2 "> 477 + {{ i "triangle-alert" "w-4 h-4" }} 478 + <span class="font-medium">merge conflicts detected</span> 479 + </div> 480 + <div> 481 + <span class="group-open:hidden inline">{{ i "chevrons-up-down" "w-4 h-4" }}</span> 482 + <span class="hidden group-open:inline">{{ i "chevrons-down-up" "w-4 h-4" }}</span> 483 + </div> 484 + </summary> 485 + {{ if gt (len .MergeCheck.Conflicts) 0 }} 486 + <ul class="space-y-1 mt-2"> 487 + {{ range .MergeCheck.Conflicts }} 488 + {{ if .Filename }} 489 + <li class="flex items-center"> 490 + {{ i "file-warning" "inline-flex w-4 h-4 mr-1.5 text-red-500 dark:text-red-300 flex-shrink-0" }} 491 + <span class="font-mono" style="word-break: keep-all; overflow-wrap: break-word;">{{ .Filename }}</span> 492 + </li> 493 + {{ else if .Reason }} 494 + <li class="flex items-center"> 495 + {{ i "file-warning" "w-4 h-4 mr-1.5 text-red-500 dark:text-red-300" }} 496 + <span>{{.Reason}}</span> 497 + </li> 498 + {{ end }} 499 + {{ end }} 500 + </ul> 501 + {{ end }} 502 + </details> 503 + {{ else if and $isOpen .MergeCheck }} 504 + <div class="flex items-center gap-2"> 505 + {{ i "check" "w-4 h-4 text-green-600 dark:text-green-500" }} 506 + <span>no conflicts, ready to merge</span> 507 + </div> 508 + {{ end }} 509 + {{ end }} 510 + 457 511 {{ define "mergeStatus" }} 458 512 {{ if .Pull.State.IsClosed }} 459 513 <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"> ··· 478 532 <span class="font-medium">This pull has been deleted (possibly by jj abandon or jj squash)</span> 479 533 </div> 480 534 </div> 481 - {{ else if and .MergeCheck .MergeCheck.Error }} 482 - <div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative"> 483 - <div class="flex items-center gap-2 text-red-500 dark:text-red-300"> 484 - {{ i "triangle-alert" "w-4 h-4" }} 485 - <span class="font-medium">{{ .MergeCheck.Error }}</span> 486 - </div> 487 - </div> 488 - {{ else if and .MergeCheck .MergeCheck.IsConflicted }} 489 - <div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative"> 490 - <details class="text-red-500 dark:text-red-300 group"> 491 - <summary class="flex items-center justify-between cursor-pointer list-none"> 492 - <div class="flex items-center gap-2 "> 493 - {{ i "triangle-alert" "w-4 h-4" }} 494 - <span class="font-medium">merge conflicts detected</span> 495 - </div> 496 - <div> 497 - <span class="group-open:hidden inline">{{ i "chevrons-up-down" "w-4 h-4" }}</span> 498 - <span class="hidden group-open:inline">{{ i "chevrons-down-up" "w-4 h-4" }}</span> 499 - </div> 500 - </summary> 501 - {{ if gt (len .MergeCheck.Conflicts) 0 }} 502 - <ul class="space-y-1 mt-2"> 503 - {{ range .MergeCheck.Conflicts }} 504 - {{ if .Filename }} 505 - <li class="flex items-center"> 506 - {{ i "file-warning" "inline-flex w-4 h-4 mr-1.5 text-red-500 dark:text-red-300 flex-shrink-0" }} 507 - <span class="font-mono" style="word-break: keep-all; overflow-wrap: break-word;">{{ .Filename }}</span> 508 - </li> 509 - {{ else if .Reason }} 510 - <li class="flex items-center"> 511 - {{ i "file-warning" "w-4 h-4 mr-1.5 text-red-500 dark:text-red-300" }} 512 - <span>{{.Reason}}</span> 513 - </li> 514 - {{ end }} 515 - {{ end }} 516 - </ul> 517 - {{ end }} 518 - </details> 519 - </div> 520 - {{ else if .MergeCheck }} 521 - <div class="bg-green-50 dark:bg-green-900 border border-green-500 rounded drop-shadow-sm px-6 py-2 relative"> 522 - <div class="flex items-center gap-2 text-green-500 dark:text-green-300"> 523 - {{ i "circle-check-big" "w-4 h-4" }} 524 - <span class="font-medium">no conflicts, ready to merge</span> 525 - </div> 526 - </div> 527 535 {{ end }} 528 536 {{ end }} 529 537 ··· 545 553 {{ with $pipeline }} 546 554 {{ $id := .Id }} 547 555 {{ if .Statuses }} 548 - <span>Workflows:</span> 549 - <div class=" 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"> 550 - {{ range $name, $all := .Statuses }} 551 - <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"> 552 - <div 553 - class="flex gap-2 items-center justify-between p-2"> 554 - {{ $lastStatus := $all.Latest }} 555 - {{ $kind := $lastStatus.Status.String }} 556 + <details> 557 + <summary class="cursor-pointer list-none">{{ template "repo/pipelines/fragments/pipelineSymbol" (dict "Pipeline" $pipeline "ShortSummary" false) }}</summary> 558 + <div class="my-2 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"> 559 + {{ range $name, $all := .Statuses }} 560 + <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"> 561 + <div 562 + class="flex gap-2 items-center justify-between p-2"> 563 + {{ $lastStatus := $all.Latest }} 564 + {{ $kind := $lastStatus.Status.String }} 556 565 557 - <div id="left" class="flex items-center gap-2 flex-shrink-0"> 558 - {{ template "repo/pipelines/fragments/workflowSymbol" $all }} 559 - {{ $name }} 560 - </div> 561 - <div id="right" class="flex items-center gap-2 flex-shrink-0"> 562 - <span class="font-bold">{{ $kind }}</span> 563 - {{ if .TimeTaken }} 564 - {{ template "repo/fragments/duration" .TimeTaken }} 565 - {{ else }} 566 - {{ template "repo/fragments/shortTimeAgo" $lastStatus.Created }} 567 - {{ end }} 568 - </div> 566 + <div id="left" class="flex items-center gap-2 flex-shrink-0"> 567 + {{ template "repo/pipelines/fragments/workflowSymbol" $all }} 568 + {{ $name }} 569 + </div> 570 + <div id="right" class="flex items-center gap-2 flex-shrink-0"> 571 + <span class="font-bold">{{ $kind }}</span> 572 + {{ if .TimeTaken }} 573 + {{ template "repo/fragments/duration" .TimeTaken }} 574 + {{ else }} 575 + {{ template "repo/fragments/shortTimeAgo" $lastStatus.Created }} 576 + {{ end }} 577 + </div> 578 + </div> 579 + </a> 580 + {{ end }} 569 581 </div> 570 - </a> 571 - {{ end }} 572 - </div> 582 + </details> 573 583 {{ end }} 574 584 {{ end }} 575 585 {{ end }}
+1 -1
appview/pages/templates/repo/pulls/pulls.html
··· 136 136 {{ $pipeline := index $.Pipelines .LatestSha }} 137 137 {{ if and $pipeline $pipeline.Id }} 138 138 <span class="before:content-['·']"></span> 139 - {{ template "repo/pipelines/fragments/pipelineSymbol" $pipeline }} 139 + {{ template "repo/pipelines/fragments/pipelineSymbol" (dict "Pipeline" $pipeline "ShortSummary" true) }} 140 140 {{ end }} 141 141 142 142 {{ $state := .Labels }}
+2 -2
spindle/models/models.go
··· 53 53 StatusKindRunning, 54 54 } 55 55 FinishStates [4]StatusKind = [4]StatusKind{ 56 - StatusKindCancelled, 57 56 StatusKindFailed, 58 - StatusKindSuccess, 59 57 StatusKindTimeout, 58 + StatusKindCancelled, 59 + StatusKindSuccess, 60 60 } 61 61 ) 62 62