diff --git a/types/pipeline.go b/types/pipeline.go --- a/types/pipeline.go +++ b/types/pipeline.go @@ -189,6 +189,21 @@ return m } +// PipelinesByCommit keeps the first run per commit from newest-first input. +func PipelinesByCommit(pipelines []*tangled.CiPipeline) map[string]Pipeline { + m := make(map[string]Pipeline, len(pipelines)) + for _, pipeline := range pipelines { + if pipeline == nil { + continue + } + if _, ok := m[pipeline.Commit]; ok { + continue + } + m[pipeline.Commit] = Pipeline{CiPipeline: pipeline} + } + return m +} + func (p Pipeline) Counts() map[string]int { m := make(map[string]int) if p.CiPipeline != nil { diff --git a/types/pipeline_test.go b/types/pipeline_test.go new file mode 100644 --- /dev/null +++ b/types/pipeline_test.go @@ -0,0 +1,30 @@ +package types + +import ( + "testing" + + "tangled.org/core/api/tangled" +) + +func TestPipelinesByCommitKeepsNewestFirstPipeline(t *testing.T) { + newest := &tangled.CiPipeline{Id: "newest", Commit: "shared"} + older := &tangled.CiPipeline{Id: "older", Commit: "shared"} + other := &tangled.CiPipeline{Id: "other", Commit: "other"} + + got := PipelinesByCommit([]*tangled.CiPipeline{ + newest, + nil, + other, + older, + }) + + if len(got) != 2 { + t.Fatalf("got %d mapped commits, want 2: %#v", len(got), got) + } + if got["shared"].Id() != "newest" { + t.Fatalf("shared commit mapped to pipeline %q, want newest", got["shared"].Id()) + } + if got["other"].Id() != "other" { + t.Fatalf("other commit mapped to pipeline %q, want other", got["other"].Id()) + } +} diff --git a/appview/pulls/list.go b/appview/pulls/list.go --- a/appview/pulls/list.go +++ b/appview/pulls/list.go @@ -282,13 +282,7 @@ return m } - for _, pipeline := range out.Pipelines { - if pipeline == nil { - continue - } - m[pipeline.Commit] = types.Pipeline{CiPipeline: pipeline} - } - return m + return types.PipelinesByCommit(out.Pipelines) }(r.Context(), shas) labelDefs, err := db.GetLabelDefinitions( diff --git a/appview/pulls/single.go b/appview/pulls/single.go --- a/appview/pulls/single.go +++ b/appview/pulls/single.go @@ -178,13 +178,7 @@ return m } - for _, pipeline := range out.Pipelines { - if pipeline == nil { - continue - } - m[pipeline.Commit] = types.Pipeline{CiPipeline: pipeline} - } - return m + return types.PipelinesByCommit(out.Pipelines) }(r.Context()) var workflowsChanged bool diff --git a/appview/repo/repo_util.go b/appview/repo/repo_util.go --- a/appview/repo/repo_util.go +++ b/appview/repo/repo_util.go @@ -115,9 +115,5 @@ return nil, err } - for _, p := range out.Pipelines { - m[p.Commit] = types.Pipeline{CiPipeline: p} - } - - return m, nil + return types.PipelinesByCommit(out.Pipelines), nil }