Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: ability to filter on status context existence #189

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ Make sure to check out [#migrating](#migrating) to learn more.
| `labels` | No | `["bug", "enhancement"]` | The labels on the PR. The pipeline will only trigger on pull requests having at least one of the specified labels. |
| `disable_git_lfs` | No | `true` | Disable Git LFS, skipping an attempt to convert pointers of files tracked into their corresponding objects when checked out into a working copy. |
| `states` | No | `["OPEN", "MERGED"]` | The PR states to select (`OPEN`, `MERGED` or `CLOSED`). The pipeline will only trigger on pull requests matching one of the specified states. Default is ["OPEN"]. |
| `status_context` | No | `concourse-ci/build` | Filter out PRs that contain the status context on their latest SHA |

Notes:
- If `v3_endpoint` is set, `v4_endpoint` must also be set (and the other way around).
Expand Down
7 changes: 6 additions & 1 deletion check.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,12 @@ Loop:
}

// Filter out commits that are too old.
if !p.UpdatedDate().Time.After(request.Version.CommittedDate) {
if request.Source.StatusContext == "" && !p.Tip.CommittedDate.Time.After(request.Version.CommittedDate) {
continue
}

// Filter out commits that already have a build status
if request.Source.StatusContext != "" && p.HasStatus {
continue
}

Expand Down
43 changes: 31 additions & 12 deletions check_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ import (

var (
testPullRequests = []*resource.PullRequest{
createTestPR(1, "master", true, false, 0, nil, false, githubv4.PullRequestStateOpen),
createTestPR(2, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
createTestPR(3, "master", false, false, 0, nil, true, githubv4.PullRequestStateOpen),
createTestPR(4, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
createTestPR(5, "master", false, true, 0, nil, false, githubv4.PullRequestStateOpen),
createTestPR(6, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
createTestPR(7, "develop", false, false, 0, []string{"enhancement"}, false, githubv4.PullRequestStateOpen),
createTestPR(8, "master", false, false, 1, []string{"wontfix"}, false, githubv4.PullRequestStateOpen),
createTestPR(9, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
createTestPR(10, "master", false, false, 0, nil, false, githubv4.PullRequestStateClosed),
createTestPR(11, "master", false, false, 0, nil, false, githubv4.PullRequestStateMerged),
createTestPR(12, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
createTestPR(1, "master", true, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
createTestPR(2, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, true),
createTestPR(3, "master", false, false, 0, nil, true, githubv4.PullRequestStateOpen, false),
createTestPR(4, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, true),
createTestPR(5, "master", false, true, 0, nil, false, githubv4.PullRequestStateOpen, false),
createTestPR(6, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
createTestPR(7, "develop", false, false, 0, []string{"enhancement"}, false, githubv4.PullRequestStateOpen, true),
createTestPR(8, "master", false, false, 1, []string{"wontfix"}, false, githubv4.PullRequestStateOpen, true),
createTestPR(9, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
createTestPR(10, "master", false, false, 0, nil, false, githubv4.PullRequestStateClosed, false),
createTestPR(11, "master", false, false, 0, nil, false, githubv4.PullRequestStateMerged, false),
createTestPR(12, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
}
)

Expand Down Expand Up @@ -262,6 +262,25 @@ func TestCheck(t *testing.T) {
resource.NewVersion(testPullRequests[10]),
},
},

{
description: "check returns versions with no status",
source: resource.Source{
Repository: "itsdalmo/test-repository",
AccessToken: "oauthtoken",
StatusContext: "some-status",
},
version: resource.NewVersion(testPullRequests[11]),
pullRequests: testPullRequests,
files: [][]string{},
expected: resource.CheckResponse{
resource.NewVersion(testPullRequests[11]),
resource.NewVersion(testPullRequests[8]),
resource.NewVersion(testPullRequests[5]),
resource.NewVersion(testPullRequests[4]),
resource.NewVersion(testPullRequests[2]),
},
},
}

for _, tc := range tests {
Expand Down
43 changes: 25 additions & 18 deletions github.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ type Github interface {

// GithubClient for handling requests to the Github V3 and V4 APIs.
type GithubClient struct {
V3 *github.Client
V4 *githubv4.Client
Repository string
Owner string
V3 *github.Client
V4 *githubv4.Client
Repository string
Owner string
StatusContext string
}

// NewGithubClient ...
Expand Down Expand Up @@ -90,10 +91,11 @@ func NewGithubClient(s *Source) (*GithubClient, error) {
}

return &GithubClient{
V3: v3,
V4: v4,
Owner: owner,
Repository: repository,
V3: v3,
V4: v4,
Owner: owner,
Repository: repository,
StatusContext: s.StatusContext,
}, nil
}

Expand All @@ -111,7 +113,10 @@ func (m *GithubClient) ListPullRequests(prStates []githubv4.PullRequestState) ([
Commits struct {
Edges []struct {
Node struct {
Commit CommitObject
Commit struct {
CommitObject
Status StatusObject
}
}
}
} `graphql:"commits(last:$commitsLast)"`
Expand All @@ -133,14 +138,15 @@ func (m *GithubClient) ListPullRequests(prStates []githubv4.PullRequestState) ([
}

vars := map[string]interface{}{
"repositoryOwner": githubv4.String(m.Owner),
"repositoryName": githubv4.String(m.Repository),
"prFirst": githubv4.Int(100),
"prStates": prStates,
"prCursor": (*githubv4.String)(nil),
"commitsLast": githubv4.Int(1),
"prReviewStates": []githubv4.PullRequestReviewState{githubv4.PullRequestReviewStateApproved},
"labelsFirst": githubv4.Int(100),
"repositoryOwner": githubv4.String(m.Owner),
"repositoryName": githubv4.String(m.Repository),
"statusContextName": githubv4.String(m.StatusContext),
"prFirst": githubv4.Int(100),
"prStates": prStates,
"prCursor": (*githubv4.String)(nil),
"commitsLast": githubv4.Int(1),
"prReviewStates": []githubv4.PullRequestReviewState{githubv4.PullRequestReviewStateApproved},
"labelsFirst": githubv4.Int(100),
}

var response []*PullRequest
Expand All @@ -157,9 +163,10 @@ func (m *GithubClient) ListPullRequests(prStates []githubv4.PullRequestState) ([
for _, c := range p.Node.Commits.Edges {
response = append(response, &PullRequest{
PullRequestObject: p.Node.PullRequestObject,
Tip: c.Node.Commit,
Tip: c.Node.Commit.CommitObject,
ApprovedReviewCount: p.Node.Reviews.TotalCount,
Labels: labels,
HasStatus: !(c.Node.Commit.Status.Context.Context == nil),
})
}
}
Expand Down
14 changes: 8 additions & 6 deletions in_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func TestGet(t *testing.T) {
State: githubv4.PullRequestStateOpen,
},
parameters: resource.GetParameters{},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
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":"[email protected]"},{"name":"state","value":"OPEN"}]`,
},
Expand All @@ -61,7 +61,7 @@ func TestGet(t *testing.T) {
State: githubv4.PullRequestStateOpen,
},
parameters: resource.GetParameters{},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
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":"[email protected]"},{"name":"state","value":"OPEN"}]`,
},
Expand All @@ -81,7 +81,7 @@ func TestGet(t *testing.T) {
parameters: resource.GetParameters{
IntegrationTool: "rebase",
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
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":"[email protected]"},{"name":"state","value":"OPEN"}]`,
},
Expand All @@ -101,7 +101,7 @@ func TestGet(t *testing.T) {
parameters: resource.GetParameters{
IntegrationTool: "checkout",
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
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":"[email protected]"},{"name":"state","value":"OPEN"}]`,
},
Expand All @@ -121,7 +121,7 @@ func TestGet(t *testing.T) {
parameters: resource.GetParameters{
GitDepth: 2,
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0","state":"OPEN"}`,
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":"[email protected]"},{"name":"state","value":"OPEN"}]`,
},
Expand All @@ -141,7 +141,7 @@ func TestGet(t *testing.T) {
parameters: resource.GetParameters{
ListChangedFiles: true,
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
files: []resource.ChangedFileObject{
{
Path: "README.md",
Expand Down Expand Up @@ -327,6 +327,7 @@ func createTestPR(
labels []string,
isDraft bool,
state githubv4.PullRequestState,
hasStatus bool,
) *resource.PullRequest {
n := strconv.Itoa(count)
d := time.Now().AddDate(0, 0, -count)
Expand Down Expand Up @@ -379,6 +380,7 @@ func createTestPR(
},
ApprovedReviewCount: approvedCount,
Labels: labelObjects,
HasStatus: hasStatus,
}
}

Expand Down
10 changes: 10 additions & 0 deletions models.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type Source struct {
RequiredReviewApprovals int `json:"required_review_approvals"`
Labels []string `json:"labels"`
States []githubv4.PullRequestState `json:"states"`
StatusContext string `json:"status_context"`
}

// Validate the source configuration.
Expand Down Expand Up @@ -95,6 +96,7 @@ type PullRequest struct {
Tip CommitObject
ApprovedReviewCount int
Labels []LabelObject
HasStatus bool
}

// PullRequestObject represents the GraphQL commit node.
Expand Down Expand Up @@ -144,6 +146,14 @@ type CommitObject struct {
}
}

// StatusObject represents the GraphQL FilesChanged node.
// https://developer.github.com/v4/object/status/
type StatusObject struct {
Context struct {
Context *githubv4.String
} `graphql:"context(name:$statusContextName)"`
}

// ChangedFileObject represents the GraphQL FilesChanged node.
// https://developer.github.com/v4/object/pullrequestchangedfile/
type ChangedFileObject struct {
Expand Down
22 changes: 11 additions & 11 deletions out_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func TestPut(t *testing.T) {
CommittedDate: time.Time{},
},
parameters: resource.PutParameters{},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},

{
Expand All @@ -51,7 +51,7 @@ func TestPut(t *testing.T) {
parameters: resource.PutParameters{
Status: "success",
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},

{
Expand All @@ -69,7 +69,7 @@ func TestPut(t *testing.T) {
Status: "failure",
Context: "build",
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},

{
Expand All @@ -88,7 +88,7 @@ func TestPut(t *testing.T) {
BaseContext: "concourse-ci-custom",
Context: "build",
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},

{
Expand All @@ -106,7 +106,7 @@ func TestPut(t *testing.T) {
Status: "failure",
TargetURL: "https://targeturl.com/concourse",
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},

{
Expand All @@ -124,7 +124,7 @@ func TestPut(t *testing.T) {
Status: "failure",
Description: "Concourse CI build",
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},

{
Expand All @@ -141,7 +141,7 @@ func TestPut(t *testing.T) {
parameters: resource.PutParameters{
Comment: "comment",
},
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},

{
Expand All @@ -158,7 +158,7 @@ func TestPut(t *testing.T) {
parameters: resource.PutParameters{
DeletePreviousComments: true,
},
pullRequest: createTestPR(1, "master", false, false, 0, []string{}, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, []string{}, false, githubv4.PullRequestStateOpen, false),
},
}

Expand Down Expand Up @@ -251,7 +251,7 @@ func TestVariableSubstitution(t *testing.T) {
Comment: fmt.Sprintf("$%s", variableName),
},
expectedComment: variableValue,
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},

{
Expand All @@ -270,7 +270,7 @@ func TestVariableSubstitution(t *testing.T) {
TargetURL: fmt.Sprintf("%s$%s", variableURL, variableName),
},
expectedTargetURL: fmt.Sprintf("%s%s", variableURL, variableValue),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},

{
Expand All @@ -288,7 +288,7 @@ func TestVariableSubstitution(t *testing.T) {
Comment: "$THIS_IS_NOT_SUBSTITUTED",
},
expectedComment: "$THIS_IS_NOT_SUBSTITUTED",
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen),
pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen, false),
},
}

Expand Down