Skip to content

Commit 232ce6d

Browse files
authored
Only use the most recent check runs on a commit (#823)
This fixes an issue where we would iterate over all check runs on a commit and keep the last one. Because GitHub returns check runs in reverse chronological order, this meant we used the oldest result for each run in the event of duplicates instead of the most recent.
1 parent 38f1378 commit 232ce6d

File tree

4 files changed

+81
-1
lines changed

4 files changed

+81
-1
lines changed

pull/github.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,9 +819,18 @@ func (ghc *GitHubContext) getCheckStatuses() (map[string]string, error) {
819819
if err != nil {
820820
return nil, errors.Wrapf(err, "failed to get check runs for page %d", opt.Page)
821821
}
822+
823+
// Check runs are ordered from most to least recent. In some cases,
824+
// like when a commit is included in multiple PRs or when users re-run
825+
// checks, there may be multiple runs with the same name. We only want
826+
// to keep the first (most recent) result for each name.
822827
for _, checkRun := range checkRuns.CheckRuns {
823-
statuses[checkRun.GetName()] = checkRun.GetConclusion()
828+
name := checkRun.GetName()
829+
if _, exists := statuses[name]; !exists {
830+
statuses[name] = checkRun.GetConclusion()
831+
}
824832
}
833+
825834
if resp.NextPage == 0 {
826835
break
827836
}

pull/github_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,30 @@ func TestLatestWorkflowRuns(t *testing.T) {
644644
assert.Equal(t, 2, runsRule.Count, "incorrect http request count")
645645
}
646646

647+
func TestLatestStatuses(t *testing.T) {
648+
pr := defaultTestPR()
649+
650+
rp := &ResponsePlayer{}
651+
rp.AddRule(
652+
ExactPathMatcher("/repos/testorg/testrepo/commits/"+pr.Head.GetSHA()+"/status"),
653+
"testdata/responses/combined_status_for_ref.yml",
654+
)
655+
rp.AddRule(
656+
ExactPathMatcher("/repos/testorg/testrepo/commits/"+pr.Head.GetSHA()+"/check-runs"),
657+
"testdata/responses/check_runs_for_ref.yml",
658+
)
659+
660+
ctx := makeContext(t, rp, pr, nil)
661+
statuses, err := ctx.LatestStatuses()
662+
require.NoError(t, err)
663+
664+
assert.Len(t, statuses, 4, "incorrect number of statuses")
665+
assert.Equal(t, statuses["commit-status-a"], "success", "incorrect conclusion for 'commit-status-a' status")
666+
assert.Equal(t, statuses["commit-status-b"], "pending", "incorrect conclusion for 'commit-status-a' status")
667+
assert.Equal(t, statuses["check-run-a"], "success", "incorrect conclusion for 'check-run-a' status")
668+
assert.Equal(t, statuses["check-run-b"], "failure", "incorrect conclusion for 'check-run-b' status")
669+
}
670+
647671
func makeContext(t *testing.T, rp *ResponsePlayer, pr *github.PullRequest, gc GlobalCache) Context {
648672
ctx := context.Background()
649673
client := github.NewClient(&http.Client{Transport: rp})
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
- status: 200
2+
body: |
3+
{
4+
"total_count": 3,
5+
"check_runs": [
6+
{
7+
"status": "completed",
8+
"conclusion": "success",
9+
"started_at": "2024-08-14T12:12:45Z",
10+
"completed_at": "2024-08-14T12:13:14Z",
11+
"name": "check-run-a"
12+
},
13+
{
14+
"status": "completed",
15+
"conclusion": "failure",
16+
"started_at": "2024-08-14T12:10:00Z",
17+
"completed_at": "2024-08-14T12:10:36Z",
18+
"name": "check-run-b"
19+
},
20+
{
21+
"status": "completed",
22+
"conclusion": "failure",
23+
"started_at": "2024-08-14T12:10:00Z",
24+
"completed_at": "2024-08-14T12:10:21Z",
25+
"name": "check-run-a"
26+
}
27+
]
28+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
- status: 200
2+
body: |
3+
{
4+
"state": "pending",
5+
"statuses": [
6+
{
7+
"state": "pending",
8+
"context": "commit-status-b",
9+
"created_at": "2024-08-14T12:13:14Z",
10+
"updated_at": "2024-08-14T12:13:14Z"
11+
},
12+
{
13+
"state": "success",
14+
"context": "commit-status-a",
15+
"created_at": "2024-08-14T12:12:00Z",
16+
"updated_at": "2024-08-14T12:12:00Z"
17+
}
18+
]
19+
}

0 commit comments

Comments
 (0)