Skip to content

Commit 956da70

Browse files
defjosiahnathanshelly
authored andcommitted
Add status_filters to pr resource (#2)
* Add status_filters to pr resource * Update check.go Co-authored-by: Nathan Shelly <nathan.shelly@opendoor.com> * Update dockerfile and task file Co-authored-by: Nathan Shelly <nathan.shelly@opendoor.com>
1 parent 7d31bf1 commit 956da70

File tree

11 files changed

+117
-37
lines changed

11 files changed

+117
-37
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ sudo: false
33
matrix:
44
include:
55
- os: osx
6-
go: 1.14.x
6+
go: 1.16.x
77
- os: linux
8-
go: 1.14.x
8+
go: 1.16.x
99
notifications:
1010
email: false
1111
script:

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM golang:1.14 as builder
1+
FROM golang:1.16 as builder
22
ADD . /go/src/github.com/telia-oss/github-pr-resource
33
WORKDIR /go/src/github.com/telia-oss/github-pr-resource
44
RUN curl -sL https://taskfile.dev/install.sh | sh

Taskfile.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: '2'
1+
version: '3'
22

33
vars:
44
BUILD_DIR: build

check.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,22 @@ Loop:
6868
}
6969
}
7070

71+
if len(request.Source.StatusFilters) > 0 {
72+
for _, statusFilter := range request.Source.StatusFilters {
73+
isValid := false
74+
for _, prStatus := range p.Tip.Status.Contexts {
75+
if prStatus.Context == statusFilter.Context && strings.EqualFold(prStatus.State, statusFilter.State) {
76+
// requires the given status exists and that it matches the desired state
77+
isValid = true
78+
break
79+
}
80+
}
81+
if !isValid {
82+
continue Loop
83+
}
84+
}
85+
}
86+
7187
// Filter out forks.
7288
if request.Source.DisableForks && p.IsCrossRepository {
7389
continue

check_test.go

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,27 @@ import (
1111

1212
var (
1313
testPullRequests = []*resource.PullRequest{
14-
createTestPR(1, "master", true, false, 0, nil, false, githubv4.PullRequestStateOpen),
15-
createTestPR(2, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
16-
createTestPR(3, "master", false, false, 0, nil, true, githubv4.PullRequestStateOpen),
17-
createTestPR(4, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
18-
createTestPR(5, "master", false, true, 0, nil, false, githubv4.PullRequestStateOpen),
19-
createTestPR(6, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
20-
createTestPR(7, "develop", false, false, 0, []string{"enhancement"}, false, githubv4.PullRequestStateOpen),
21-
createTestPR(8, "master", false, false, 1, []string{"wontfix"}, false, githubv4.PullRequestStateOpen),
22-
createTestPR(9, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
23-
createTestPR(10, "master", false, false, 0, nil, false, githubv4.PullRequestStateClosed),
24-
createTestPR(11, "master", false, false, 0, nil, false, githubv4.PullRequestStateMerged),
25-
createTestPR(12, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
14+
createTestPR(1, "master", true, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
15+
createTestPR(2, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
16+
createTestPR(3, "master", false, false, 0, nil, true, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
17+
createTestPR(4, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
18+
createTestPR(5, "master", false, true, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
19+
createTestPR(6, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
20+
createTestPR(7, "develop", false, false, 0, []string{"enhancement"}, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
21+
createTestPR(8, "master", false, false, 1, []string{"wontfix"}, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
22+
createTestPR(9, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
23+
createTestPR(10, "master", false, false, 0, nil, false, githubv4.PullRequestStateClosed, []resource.StatusContext{}),
24+
createTestPR(11, "master", false, false, 0, nil, false, githubv4.PullRequestStateMerged, []resource.StatusContext{}),
25+
createTestPR(12, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
26+
27+
createTestPR(13, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{
28+
{Context: "my-status-check", State: "SUCCESS"},
29+
}),
30+
// multiple status check
31+
createTestPR(14, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{
32+
{Context: "my-status-check", State: "SUCCESS"},
33+
{Context: "my-failed-status-check", State: "FAILURE"},
34+
}),
2635
}
2736
)
2837

@@ -38,8 +47,9 @@ func TestCheck(t *testing.T) {
3847
{
3948
description: "check returns the latest version if there is no previous",
4049
source: resource.Source{
41-
Repository: "itsdalmo/test-repository",
42-
AccessToken: "oauthtoken",
50+
Repository: "itsdalmo/test-repository",
51+
AccessToken: "oauthtoken",
52+
StatusFilters: []resource.StatusFilter{},
4353
},
4454
version: resource.Version{},
4555
pullRequests: testPullRequests,
@@ -262,6 +272,40 @@ func TestCheck(t *testing.T) {
262272
resource.NewVersion(testPullRequests[10]),
263273
},
264274
},
275+
276+
{
277+
description: "check returns a PR that has a complete status for a status check",
278+
source: resource.Source{
279+
Repository: "itsdalmo/test-repository",
280+
AccessToken: "oauthtoken",
281+
StatusFilters: []resource.StatusFilter{
282+
{Context: "my-status-check", State: "success"},
283+
},
284+
},
285+
version: resource.Version{},
286+
pullRequests: testPullRequests,
287+
files: [][]string{},
288+
expected: resource.CheckResponse{
289+
resource.NewVersion(testPullRequests[12]),
290+
},
291+
},
292+
{
293+
description: "check returns a PR that has multiple required status checks",
294+
source: resource.Source{
295+
Repository: "itsdalmo/test-repository",
296+
AccessToken: "oauthtoken",
297+
StatusFilters: []resource.StatusFilter{
298+
{Context: "my-status-check", State: "success"},
299+
{Context: "my-failed-status-check", State: "failure"},
300+
},
301+
},
302+
version: resource.Version{},
303+
pullRequests: testPullRequests,
304+
files: [][]string{},
305+
expected: resource.CheckResponse{
306+
resource.NewVersion(testPullRequests[13]),
307+
},
308+
},
265309
}
266310

267311
for _, tc := range tests {

e2e/e2e_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
//go:build e2e
12
// +build e2e
23

34
package e2e_test

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module github.com/telia-oss/github-pr-resource
22

3+
go 1.16
4+
35
require (
46
github.com/golang/protobuf v1.4.0 // indirect
57
github.com/google/btree v1.0.0 // indirect
@@ -18,5 +20,3 @@ require (
1820
golang.org/x/tools v0.0.0-20200423205358-59e73619c742 // indirect
1921
google.golang.org/appengine v1.6.6 // indirect
2022
)
21-
22-
go 1.14

in_test.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func TestGet(t *testing.T) {
4242
State: githubv4.PullRequestStateOpen,
4343
},
4444
parameters: resource.GetParameters{},
45-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
45+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
4646
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
4747
metadataString: `[{"name":"pr","value":"1"},{"name":"title","value":"pr1 title"},{"name":"url","value":"pr1 url"},{"name":"head_name","value":"pr1"},{"name":"head_sha","value":"oid1"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"sha"},{"name":"message","value":"commit message1"},{"name":"author","value":"login1"},{"name":"author_email","value":"user@example.com"},{"name":"state","value":"OPEN"}]`,
4848
},
@@ -61,7 +61,7 @@ func TestGet(t *testing.T) {
6161
State: githubv4.PullRequestStateOpen,
6262
},
6363
parameters: resource.GetParameters{},
64-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
64+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
6565
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
6666
metadataString: `[{"name":"pr","value":"1"},{"name":"title","value":"pr1 title"},{"name":"url","value":"pr1 url"},{"name":"head_name","value":"pr1"},{"name":"head_sha","value":"oid1"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"sha"},{"name":"message","value":"commit message1"},{"name":"author","value":"login1"},{"name":"author_email","value":"user@example.com"},{"name":"state","value":"OPEN"}]`,
6767
},
@@ -81,7 +81,7 @@ func TestGet(t *testing.T) {
8181
parameters: resource.GetParameters{
8282
IntegrationTool: "rebase",
8383
},
84-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
84+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
8585
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
8686
metadataString: `[{"name":"pr","value":"1"},{"name":"title","value":"pr1 title"},{"name":"url","value":"pr1 url"},{"name":"head_name","value":"pr1"},{"name":"head_sha","value":"oid1"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"sha"},{"name":"message","value":"commit message1"},{"name":"author","value":"login1"},{"name":"author_email","value":"user@example.com"},{"name":"state","value":"OPEN"}]`,
8787
},
@@ -101,7 +101,7 @@ func TestGet(t *testing.T) {
101101
parameters: resource.GetParameters{
102102
IntegrationTool: "checkout",
103103
},
104-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
104+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
105105
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
106106
metadataString: `[{"name":"pr","value":"1"},{"name":"title","value":"pr1 title"},{"name":"url","value":"pr1 url"},{"name":"head_name","value":"pr1"},{"name":"head_sha","value":"oid1"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"sha"},{"name":"message","value":"commit message1"},{"name":"author","value":"login1"},{"name":"author_email","value":"user@example.com"},{"name":"state","value":"OPEN"}]`,
107107
},
@@ -121,7 +121,7 @@ func TestGet(t *testing.T) {
121121
parameters: resource.GetParameters{
122122
GitDepth: 2,
123123
},
124-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
124+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
125125
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
126126
metadataString: `[{"name":"pr","value":"1"},{"name":"title","value":"pr1 title"},{"name":"url","value":"pr1 url"},{"name":"head_name","value":"pr1"},{"name":"head_sha","value":"oid1"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"sha"},{"name":"message","value":"commit message1"},{"name":"author","value":"login1"},{"name":"author_email","value":"user@example.com"},{"name":"state","value":"OPEN"}]`,
127127
},
@@ -141,7 +141,7 @@ func TestGet(t *testing.T) {
141141
parameters: resource.GetParameters{
142142
ListChangedFiles: true,
143143
},
144-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
144+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
145145
files: []resource.ChangedFileObject{
146146
{
147147
Path: "README.md",
@@ -327,6 +327,7 @@ func createTestPR(
327327
labels []string,
328328
isDraft bool,
329329
state githubv4.PullRequestState,
330+
status []resource.StatusContext,
330331
) *resource.PullRequest {
331332
n := strconv.Itoa(count)
332333
d := time.Now().AddDate(0, 0, -count)
@@ -376,6 +377,9 @@ func createTestPR(
376377
},
377378
Email: "user@example.com",
378379
},
380+
Status: struct{ Contexts []resource.StatusContext }{
381+
Contexts: status,
382+
},
379383
},
380384
ApprovedReviewCount: approvedCount,
381385
Labels: labelObjects,

models.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import (
99
"github.com/shurcooL/githubv4"
1010
)
1111

12+
type StatusFilter struct {
13+
Context string
14+
State string
15+
}
16+
1217
// Source represents the configuration for the resource.
1318
type Source struct {
1419
Repository string `json:"repository"`
@@ -27,6 +32,7 @@ type Source struct {
2732
RequiredReviewApprovals int `json:"required_review_approvals"`
2833
Labels []string `json:"labels"`
2934
States []githubv4.PullRequestState `json:"states"`
35+
StatusFilters []StatusFilter `json:"status_filters"`
3036
}
3137

3238
// Validate the source configuration.
@@ -142,6 +148,14 @@ type CommitObject struct {
142148
}
143149
Email string
144150
}
151+
Status struct {
152+
Contexts []StatusContext
153+
}
154+
}
155+
156+
type StatusContext struct {
157+
Context string
158+
State string
145159
}
146160

147161
// ChangedFileObject represents the GraphQL FilesChanged node.

out_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func TestPut(t *testing.T) {
3434
CommittedDate: time.Time{},
3535
},
3636
parameters: resource.PutParameters{},
37-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
37+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
3838
},
3939

4040
{
@@ -51,7 +51,7 @@ func TestPut(t *testing.T) {
5151
parameters: resource.PutParameters{
5252
Status: "success",
5353
},
54-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
54+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
5555
},
5656

5757
{
@@ -69,7 +69,7 @@ func TestPut(t *testing.T) {
6969
Status: "failure",
7070
Context: "build",
7171
},
72-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
72+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
7373
},
7474

7575
{
@@ -88,7 +88,7 @@ func TestPut(t *testing.T) {
8888
BaseContext: "concourse-ci-custom",
8989
Context: "build",
9090
},
91-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
91+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
9292
},
9393

9494
{
@@ -106,7 +106,7 @@ func TestPut(t *testing.T) {
106106
Status: "failure",
107107
TargetURL: "https://targeturl.com/concourse",
108108
},
109-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
109+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
110110
},
111111

112112
{
@@ -124,7 +124,7 @@ func TestPut(t *testing.T) {
124124
Status: "failure",
125125
Description: "Concourse CI build",
126126
},
127-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
127+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
128128
},
129129

130130
{
@@ -141,7 +141,7 @@ func TestPut(t *testing.T) {
141141
parameters: resource.PutParameters{
142142
Comment: "comment",
143143
},
144-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
144+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
145145
},
146146

147147
{
@@ -158,7 +158,7 @@ func TestPut(t *testing.T) {
158158
parameters: resource.PutParameters{
159159
DeletePreviousComments: true,
160160
},
161-
pullRequest: createTestPR(1, "master", false, false, 0, []string{}, false, githubv4.PullRequestStateOpen),
161+
pullRequest: createTestPR(1, "master", false, false, 0, []string{}, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
162162
},
163163
}
164164

@@ -251,7 +251,7 @@ func TestVariableSubstitution(t *testing.T) {
251251
Comment: fmt.Sprintf("$%s", variableName),
252252
},
253253
expectedComment: variableValue,
254-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
254+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
255255
},
256256

257257
{
@@ -270,7 +270,7 @@ func TestVariableSubstitution(t *testing.T) {
270270
TargetURL: fmt.Sprintf("%s$%s", variableURL, variableName),
271271
},
272272
expectedTargetURL: fmt.Sprintf("%s%s", variableURL, variableValue),
273-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
273+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
274274
},
275275

276276
{
@@ -288,7 +288,7 @@ func TestVariableSubstitution(t *testing.T) {
288288
Comment: "$THIS_IS_NOT_SUBSTITUTED",
289289
},
290290
expectedComment: "$THIS_IS_NOT_SUBSTITUTED",
291-
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
291+
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, []resource.StatusContext{}),
292292
},
293293
}
294294

0 commit comments

Comments
 (0)