From 7fe61b936fff7a861429122df2eb64851986f0cb Mon Sep 17 00:00:00 2001 From: Vladimir Yarotsky Date: Tue, 22 Oct 2019 13:58:17 -0700 Subject: [PATCH 01/36] Add author_email to metadata --- in.go | 1 + in_test.go | 35 ++++++++++++++++++++--------------- models.go | 1 + 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/in.go b/in.go index c8ce9d1b..08ab13e1 100644 --- a/in.go +++ b/in.go @@ -72,6 +72,7 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp metadata.Add("base_sha", baseSHA) metadata.Add("message", pull.Tip.Message) metadata.Add("author", pull.Tip.Author.User.Login) + metadata.Add("author_email", pull.Tip.Author.Email) // Write version and metadata for reuse in PUT path := filepath.Join(outputDir, ".git", "resource") diff --git a/in_test.go b/in_test.go index 80dd60ed..0de26dbf 100644 --- a/in_test.go +++ b/in_test.go @@ -42,7 +42,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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"}]`, }, { description: "get supports unlocking with git crypt", @@ -59,7 +59,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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"}]`, }, { description: "get supports rebasing", @@ -77,7 +77,7 @@ func TestGet(t *testing.T) { }, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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"}]`, }, { description: "get supports checkout", @@ -95,7 +95,7 @@ func TestGet(t *testing.T) { }, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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"}]`, }, { description: "get supports git_depth", @@ -113,7 +113,7 @@ func TestGet(t *testing.T) { }, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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"}]`, }, { description: "get supports list_changed_files", @@ -139,7 +139,7 @@ func TestGet(t *testing.T) { }, }, versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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"}]`, filesString: "README.md\nOther.md\n", }, } @@ -175,14 +175,15 @@ func TestGet(t *testing.T) { // Verify individual files files := map[string]string{ - "pr": "1", - "url": "pr1 url", - "head_name": "pr1", - "head_sha": "oid1", - "base_name": "master", - "base_sha": "sha", - "message": "commit message1", - "author": "login1", + "pr": "1", + "url": "pr1 url", + "head_name": "pr1", + "head_sha": "oid1", + "base_name": "master", + "base_sha": "sha", + "message": "commit message1", + "author": "login1", + "author_email": "user@example.com", } for filename, expected := range files { @@ -341,10 +342,14 @@ func createTestPR( OID: fmt.Sprintf("oid%s", n), CommittedDate: githubv4.DateTime{Time: d}, Message: m, - Author: struct{ User struct{ Login string } }{ + Author: struct { + User struct{ Login string } + Email string + }{ User: struct{ Login string }{ Login: fmt.Sprintf("login%s", n), }, + Email: "user@example.com", }, }, ApprovedReviewCount: approvedCount, diff --git a/models.go b/models.go index 71309e14..296265ec 100644 --- a/models.go +++ b/models.go @@ -106,6 +106,7 @@ type CommitObject struct { User struct { Login string } + Email string } } From a4a51ca48366255c537fc3aa8d3d7e35bf6c3cc9 Mon Sep 17 00:00:00 2001 From: Ally Weir Date: Sat, 25 Jan 2020 13:14:34 +0000 Subject: [PATCH 02/36] Add git-lfs package --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 4420d2b1..9990704e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,7 @@ FROM alpine:3.8 as resource COPY --from=builder /go/src/github.com/telia-oss/github-pr-resource/build /opt/resource RUN apk add --update --no-cache \ git \ + git-lfs \ openssh \ && chmod +x /opt/resource/* ADD scripts/install_git_crypt.sh install_git_crypt.sh From b8e495e04de2dcf0151832fd8d75da227ceb367b Mon Sep 17 00:00:00 2001 From: Ally Weir Date: Sat, 25 Jan 2020 13:27:59 +0000 Subject: [PATCH 03/36] Add ability to disable git-lfs --- README.md | 1 + git.go | 3 +++ models.go | 1 + 3 files changed, 5 insertions(+) diff --git a/README.md b/README.md index c5abc127..c446e60d 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Make sure to check out [#migrating](#migrating) to learn more. | `git_crypt_key` | No | `AEdJVENSWVBUS0VZAAAAA...` | Base64 encoded git-crypt key. Setting this will unlock / decrypt the repository with git-crypt. To get the key simply execute `git-crypt export-key -- - | base64` in an encrypted repository. | | `base_branch` | No | `master` | Name of a branch. The pipeline will only trigger on pull requests against the specified branch. | | `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. | Notes: - If `v3_endpoint` is set, `v4_endpoint` must also be set (and the other way around). diff --git a/git.go b/git.go index 874b85f5..7d225889 100644 --- a/git.go +++ b/git.go @@ -31,6 +31,9 @@ func NewGitClient(source *Source, dir string, output io.Writer) (*GitClient, err if source.SkipSSLVerification { os.Setenv("GIT_SSL_NO_VERIFY", "true") } + if source.DisableGitLFS { + os.Setenv("GIT_LFS_SKIP_SMUDGE", "true") + } return &GitClient{ AccessToken: source.AccessToken, Directory: dir, diff --git a/models.go b/models.go index 71309e14..7480cde9 100644 --- a/models.go +++ b/models.go @@ -17,6 +17,7 @@ type Source struct { Paths []string `json:"paths"` IgnorePaths []string `json:"ignore_paths"` DisableCISkip bool `json:"disable_ci_skip"` + DisableGitLFS bool `json:"disable_git_lfs"` SkipSSLVerification bool `json:"skip_ssl_verification"` DisableForks bool `json:"disable_forks"` GitCryptKey string `json:"git_crypt_key"` From 072def4b4e56aab93626e5158ac9b6f9b73facb7 Mon Sep 17 00:00:00 2001 From: Ally Weir Date: Sat, 25 Jan 2020 14:38:13 +0000 Subject: [PATCH 04/36] Configure origin for pulling This is required to allow git-lfs to smudge the pointers and attempt to convert these to their corresponding files. --- git.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/git.go b/git.go index 7d225889..51c50af7 100644 --- a/git.go +++ b/git.go @@ -80,7 +80,11 @@ func (g *GitClient) Pull(uri, branch string, depth int) error { return err } - args := []string{"pull", endpoint + ".git", branch} + if err := g.command("git", "remote", "add", "origin", endpoint).Run(); err != nil { + return fmt.Errorf("setting 'origin' remote to '%s' failed: %s", endpoint, err) + } + + args := []string{"pull", "origin", branch} if depth > 0 { args = append(args, "--depth", strconv.Itoa(depth)) } From 1cbc155e75147362f207a29b646d6db678a698da Mon Sep 17 00:00:00 2001 From: itsdalmo Date: Fri, 24 Apr 2020 13:45:04 +0200 Subject: [PATCH 05/36] Bump go version used for builds --- .travis.yml | 4 ++-- Dockerfile | 2 +- go.mod | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index c6110759..d9698cfd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,9 @@ sudo: false matrix: include: - os: osx - go: 1.13.x + go: 1.14.x - os: linux - go: 1.13.x + go: 1.14.x notifications: email: false script: diff --git a/Dockerfile b/Dockerfile index 4420d2b1..f4eb060b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.13 as builder +FROM golang:1.14 as builder ADD . /go/src/github.com/telia-oss/github-pr-resource WORKDIR /go/src/github.com/telia-oss/github-pr-resource RUN curl -sL https://taskfile.dev/install.sh | sh diff --git a/go.mod b/go.mod index fd7ed191..df8c08ec 100644 --- a/go.mod +++ b/go.mod @@ -13,4 +13,4 @@ require ( google.golang.org/appengine v1.6.5 // indirect ) -go 1.13 +go 1.14 From 85653727cfff566e035fa11e31f21fb0e7c8dbb4 Mon Sep 17 00:00:00 2001 From: itsdalmo Date: Fri, 24 Apr 2020 13:45:22 +0200 Subject: [PATCH 06/36] Bump all go dependencies to latest minor version --- go.mod | 15 ++++++------ go.sum | 75 +++++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index df8c08ec..ef1f5ca4 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,17 @@ module github.com/telia-oss/github-pr-resource require ( - github.com/golang/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.4.0 // indirect github.com/google/go-github/v28 v28.1.1 - github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2 - github.com/shurcooL/githubv4 v0.0.0-20191127044304-8f68eb5628d0 + github.com/maxbrunsfeld/counterfeiter/v6 v6.2.3 + github.com/shurcooL/githubv4 v0.0.0-20200414012201-bbc966b061dd github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f // indirect github.com/stretchr/testify v1.3.0 - golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 // indirect - golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 - google.golang.org/appengine v1.6.5 // indirect + golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5 // indirect + golang.org/x/net v0.0.0-20200421231249-e086a090c8fd // indirect + golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d + golang.org/x/tools v0.0.0-20200423205358-59e73619c742 // indirect + google.golang.org/appengine v1.6.6 // indirect ) go 1.14 diff --git a/go.sum b/go.sum index 281d7227..82ec24e7 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,16 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github/v28 v28.1.1 h1:kORf5ekX5qwXO2mGzXXOjMe/g6ap8ahVe0sBEulhSxo= github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -21,29 +29,37 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2 h1:g+4J5sZg6osfvEfkRZxJ1em0VT95/UOZgi/l7zi1/oE= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.3 h1:z1lXirM9f9WTcdmzSZahKh/t+LCqPiiwK2/DB1kLlI4= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.3/go.mod h1:1ftk08SazyElaaNvmqAfZWGwJzshjCfBXDLoQtPAMNk= github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sclevine/spec v1.2.0 h1:1Jwdf9jSfDl9NVmt8ndHqbTZ7XCCPbh1jI3hkDBHVYA= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/shurcooL/githubv4 v0.0.0-20191127044304-8f68eb5628d0 h1:T9uus1QvcPgeLShS30YOnnzk3r9Vvygp45muhlrufgY= -github.com/shurcooL/githubv4 v0.0.0-20191127044304-8f68eb5628d0/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= +github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= +github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= +github.com/shurcooL/githubv4 v0.0.0-20200414012201-bbc966b061dd h1:EwtC+kDj8s9OKiaStPZtTv3neldOyr98AXIxvmn3Gss= +github.com/shurcooL/githubv4 v0.0.0-20200414012201-bbc966b061dd/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f h1:tygelZueB1EtXkPI6mQ4o9DQ0+FKW41hTbunoXZCTqk= github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5 h1:Q7tZBpemrlsc2I7IyODzhtallWRSm4Q0d09pL6XbQtU= +golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee h1:WG0RUwxtNT4qqaXX3DPA8zHFNm/D9xaBpxzHt1WcA/E= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -52,32 +68,49 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd h1:QPwSajcTUrFriMF1nJ3XzgoqakqQEsnZf9LdXdi2nkI= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db h1:9hRk1xeL9LTT3yX/941DqeBz87XgHAQuj+TbimYJuiw= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200301222351-066e0c02454c h1:FD7jysxM+EJqg5UYYy3XYDsAiUickFsn4UiaanJkf8c= +golang.org/x/tools v0.0.0-20200301222351-066e0c02454c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200423205358-59e73619c742 h1:9OGWpORUXvk8AsaBJlpzzDx7Srv/rSK6rvjcsJq4rJo= +golang.org/x/tools v0.0.0-20200423205358-59e73619c742/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= @@ -86,7 +119,5 @@ gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 75e217bc4d6c2ed5c468ade46eadb6191839f757 Mon Sep 17 00:00:00 2001 From: itsdalmo Date: Fri, 24 Apr 2020 13:45:42 +0200 Subject: [PATCH 07/36] Remove GO111MODULE from taskfile --- Taskfile.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Taskfile.yml b/Taskfile.yml index 64480f09..f01ebc28 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,8 +1,5 @@ version: '2' -env: - GO111MODULE: on - vars: BUILD_DIR: build DOCKER_REPO: teliaoss/github-pr-resource From 7027a1ac75d3c4c042ef0a95b21656da8351a127 Mon Sep 17 00:00:00 2001 From: itsdalmo Date: Fri, 24 Apr 2020 14:51:24 +0200 Subject: [PATCH 08/36] Use alpine 3.11 instead of 3.8 (end of support) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f4eb060b..eacc71f0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /go/src/github.com/telia-oss/github-pr-resource RUN curl -sL https://taskfile.dev/install.sh | sh RUN ./bin/task build -FROM alpine:3.8 as resource +FROM alpine:3.11 as resource COPY --from=builder /go/src/github.com/telia-oss/github-pr-resource/build /opt/resource RUN apk add --update --no-cache \ git \ From c1061f42c1d58568b1b5b006e533ee31a8f0da52 Mon Sep 17 00:00:00 2001 From: Rick Date: Fri, 24 Apr 2020 11:59:55 -0400 Subject: [PATCH 09/36] Update paths parameter to reflect as a list item (#180) * Bump all dependencies * Update README.md Co-authored-by: itsdalmo --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c5abc127..83273a2a 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,8 @@ Make sure to check out [#migrating](#migrating) to learn more. | `access_token` | Yes | | A Github Access Token with repository access (required for setting status on commits). N.B. If you want github-pr-resource to work with a private repository. Set `repo:full` permissions on the access token you create on GitHub. If it is a public repository, `repo:status` is enough. | | `v3_endpoint` | No | `https://api.github.com` | Endpoint to use for the V3 Github API (Restful). | | `v4_endpoint` | No | `https://api.github.com/graphql` | Endpoint to use for the V4 Github API (Graphql). | -| `paths` | No | `terraform/*/*.tf` | Only produce new versions if the PR includes changes to files that match one or more glob patterns or prefixes. | -| `ignore_paths` | No | `.ci/` | Inverse of the above. Pattern syntax is documented in [filepath.Match](https://golang.org/pkg/path/filepath/#Match), or a path prefix can be specified (e.g. `.ci/` will match everything in the `.ci` directory). | +| `paths` | No | `["terraform/*/*.tf"]` | Only produce new versions if the PR includes changes to files that match one or more glob patterns or prefixes. | +| `ignore_paths` | No | `[".ci/"]` | Inverse of the above. Pattern syntax is documented in [filepath.Match](https://golang.org/pkg/path/filepath/#Match), or a path prefix can be specified (e.g. `.ci/` will match everything in the `.ci` directory). | | `disable_ci_skip` | No | `true` | Disable ability to skip builds with `[ci skip]` and `[skip ci]` in commit message or pull request title. | | `skip_ssl_verification` | No | `true` | Disable SSL/TLS certificate validation on git and API clients. Use with care! | | `disable_forks` | No | `true` | Disable triggering of the resource if the pull request's fork repository is different to the configured repository. | @@ -80,7 +80,7 @@ requested version and the metadata emitted by `get` are available to your tasks - `.git/resource/changed_files` (if enabled by `list_changed_files`) The information in `metadata.json` is also available as individual files in the `.git/resource` directory, e.g. the `base_sha` -is available as `.git/resource/base_sha`. For a complete list of available (individual) metadata files, please check the code +is available as `.git/resource/base_sha`. For a complete list of available (individual) metadata files, please check the code [here](https://github.com/telia-oss/github-pr-resource/blob/master/in.go#L66). When specifying `skip_download` the pull request volume mounted to subsequent tasks will be empty, which is a problem From 313638be36aade4a038197389eddf199064adf43 Mon Sep 17 00:00:00 2001 From: mjdouble Date: Fri, 24 Apr 2020 12:51:20 -0400 Subject: [PATCH 10/36] add PR title to metadata (#172) * add PR title to metadata * add title meta to tests * fixing tests Co-authored-by: itsdalmo --- in.go | 1 + in_test.go | 13 +++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/in.go b/in.go index 08ab13e1..be3f6d2d 100644 --- a/in.go +++ b/in.go @@ -73,6 +73,7 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp metadata.Add("message", pull.Tip.Message) metadata.Add("author", pull.Tip.Author.User.Login) metadata.Add("author_email", pull.Tip.Author.Email) + metadata.Add("title", pull.Title) // Write version and metadata for reuse in PUT path := filepath.Join(outputDir, ".git", "resource") diff --git a/in_test.go b/in_test.go index 0de26dbf..306cd5dd 100644 --- a/in_test.go +++ b/in_test.go @@ -42,7 +42,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, }, { description: "get supports unlocking with git crypt", @@ -59,7 +59,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, }, { description: "get supports rebasing", @@ -77,7 +77,7 @@ func TestGet(t *testing.T) { }, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, }, { description: "get supports checkout", @@ -95,7 +95,7 @@ func TestGet(t *testing.T) { }, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, }, { description: "get supports git_depth", @@ -113,7 +113,7 @@ func TestGet(t *testing.T) { }, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, }, { description: "get supports list_changed_files", @@ -139,7 +139,7 @@ func TestGet(t *testing.T) { }, }, versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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"}]`, + metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, filesString: "README.md\nOther.md\n", }, } @@ -184,6 +184,7 @@ func TestGet(t *testing.T) { "message": "commit message1", "author": "login1", "author_email": "user@example.com", + "title": "pr1 title", } for filename, expected := range files { From 8eaccf8682b3a19a81817a253316cc4e98e6ed7a Mon Sep 17 00:00:00 2001 From: itsdalmo Date: Fri, 24 Apr 2020 19:03:34 +0200 Subject: [PATCH 11/36] Fix e2e tests after changes to metadata --- e2e/e2e_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index e9b5afba..95ded05b 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -256,7 +256,7 @@ func TestGetAndPutE2E(t *testing.T) { getParameters: resource.GetParameters{}, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, metadataFiles: map[string]string{ "pr": "4", "url": "https://github.com/itsdalmo/test-repository/pull/4", @@ -288,7 +288,7 @@ func TestGetAndPutE2E(t *testing.T) { }, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, expectedCommitCount: 9, expectedCommits: []string{"Push 2."}, }, @@ -310,7 +310,7 @@ func TestGetAndPutE2E(t *testing.T) { }, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, expectedCommitCount: 7, expectedCommits: []string{ "Push 2.", @@ -338,7 +338,7 @@ func TestGetAndPutE2E(t *testing.T) { getParameters: resource.GetParameters{}, putParameters: resource.PutParameters{}, versionString: `{"pr":"6","commit":"ac771f3b69cbd63b22bbda553f827ab36150c640","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"6"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/6"},{"name":"head_name","value":"test-develop-pr"},{"name":"head_sha","value":"ac771f3b69cbd63b22bbda553f827ab36150c640"},{"name":"base_name","value":"develop"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"[skip ci] Add a PR with a non-master base"},{"name":"author","value":"itsdalmo"}]`, + metadataString: `[{"name":"pr","value":"6"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/6"},{"name":"head_name","value":"test-develop-pr"},{"name":"head_sha","value":"ac771f3b69cbd63b22bbda553f827ab36150c640"},{"name":"base_name","value":"develop"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"[skip ci] Add a PR with a non-master base"},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"[skip ci] Add a PR with a non-master base"}]`, expectedCommitCount: 5, expectedCommits: []string{"[skip ci] Add a PR with a non-master base"}, // This merge ends up being fast-forwarded }, @@ -359,7 +359,7 @@ func TestGetAndPutE2E(t *testing.T) { getParameters: resource.GetParameters{}, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, expectedCommitCount: 10, expectedCommits: []string{"Merge commit 'a5114f6ab89f4b736655642a11e8d15ce363d882'"}, }, @@ -377,7 +377,7 @@ func TestGetAndPutE2E(t *testing.T) { getParameters: resource.GetParameters{GitDepth: 6}, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, expectedCommitCount: 9, expectedCommits: []string{ "Merge commit 'a5114f6ab89f4b736655642a11e8d15ce363d882'", @@ -407,7 +407,7 @@ func TestGetAndPutE2E(t *testing.T) { }, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, filesString: "README.md\ntest.txt\n", expectedCommitCount: 10, expectedCommits: []string{"Merge commit 'a5114f6ab89f4b736655642a11e8d15ce363d882'"}, From 735beaf89ec16b8e3819bc6c7f52028b9b95cdff Mon Sep 17 00:00:00 2001 From: itsdalmo Date: Sat, 25 Apr 2020 10:25:21 +0200 Subject: [PATCH 12/36] Reorder metadata so the PR title is more visible --- e2e/e2e_test.go | 14 +++++++------- in.go | 2 +- in_test.go | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 95ded05b..f1698bc6 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -256,7 +256,7 @@ func TestGetAndPutE2E(t *testing.T) { getParameters: resource.GetParameters{}, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"title","value":"Add comment from 2nd pull request."},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"}]`, metadataFiles: map[string]string{ "pr": "4", "url": "https://github.com/itsdalmo/test-repository/pull/4", @@ -288,7 +288,7 @@ func TestGetAndPutE2E(t *testing.T) { }, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"title","value":"Add comment from 2nd pull request."},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"}]`, expectedCommitCount: 9, expectedCommits: []string{"Push 2."}, }, @@ -310,7 +310,7 @@ func TestGetAndPutE2E(t *testing.T) { }, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"title","value":"Add comment from 2nd pull request."},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"}]`, expectedCommitCount: 7, expectedCommits: []string{ "Push 2.", @@ -338,7 +338,7 @@ func TestGetAndPutE2E(t *testing.T) { getParameters: resource.GetParameters{}, putParameters: resource.PutParameters{}, versionString: `{"pr":"6","commit":"ac771f3b69cbd63b22bbda553f827ab36150c640","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"6"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/6"},{"name":"head_name","value":"test-develop-pr"},{"name":"head_sha","value":"ac771f3b69cbd63b22bbda553f827ab36150c640"},{"name":"base_name","value":"develop"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"[skip ci] Add a PR with a non-master base"},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"[skip ci] Add a PR with a non-master base"}]`, + metadataString: `[{"name":"pr","value":"6"},{"name":"title","value":"[skip ci] Add a PR with a non-master base"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/6"},{"name":"head_name","value":"test-develop-pr"},{"name":"head_sha","value":"ac771f3b69cbd63b22bbda553f827ab36150c640"},{"name":"base_name","value":"develop"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"[skip ci] Add a PR with a non-master base"},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"}]`, expectedCommitCount: 5, expectedCommits: []string{"[skip ci] Add a PR with a non-master base"}, // This merge ends up being fast-forwarded }, @@ -359,7 +359,7 @@ func TestGetAndPutE2E(t *testing.T) { getParameters: resource.GetParameters{}, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"title","value":"Add comment from 2nd pull request."},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"}]`, expectedCommitCount: 10, expectedCommits: []string{"Merge commit 'a5114f6ab89f4b736655642a11e8d15ce363d882'"}, }, @@ -377,7 +377,7 @@ func TestGetAndPutE2E(t *testing.T) { getParameters: resource.GetParameters{GitDepth: 6}, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"title","value":"Add comment from 2nd pull request."},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"}]`, expectedCommitCount: 9, expectedCommits: []string{ "Merge commit 'a5114f6ab89f4b736655642a11e8d15ce363d882'", @@ -407,7 +407,7 @@ func TestGetAndPutE2E(t *testing.T) { }, putParameters: resource.PutParameters{}, versionString: `{"pr":"4","commit":"a5114f6ab89f4b736655642a11e8d15ce363d882","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"4"},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"},{"name":"title","value":"Add comment from 2nd pull request."}]`, + metadataString: `[{"name":"pr","value":"4"},{"name":"title","value":"Add comment from 2nd pull request."},{"name":"url","value":"https://github.com/itsdalmo/test-repository/pull/4"},{"name":"head_name","value":"my_second_pull"},{"name":"head_sha","value":"a5114f6ab89f4b736655642a11e8d15ce363d882"},{"name":"base_name","value":"master"},{"name":"base_sha","value":"93eeeedb8a16e6662062d1eca5655108977cc59a"},{"name":"message","value":"Push 2."},{"name":"author","value":"itsdalmo"},{"name":"author_email","value":"kristian@doingit.no"}]`, filesString: "README.md\ntest.txt\n", expectedCommitCount: 10, expectedCommits: []string{"Merge commit 'a5114f6ab89f4b736655642a11e8d15ce363d882'"}, diff --git a/in.go b/in.go index be3f6d2d..217f179c 100644 --- a/in.go +++ b/in.go @@ -65,6 +65,7 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp // Create the metadata var metadata Metadata metadata.Add("pr", strconv.Itoa(pull.Number)) + metadata.Add("title", pull.Title) metadata.Add("url", pull.URL) metadata.Add("head_name", pull.HeadRefName) metadata.Add("head_sha", pull.Tip.OID) @@ -73,7 +74,6 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp metadata.Add("message", pull.Tip.Message) metadata.Add("author", pull.Tip.Author.User.Login) metadata.Add("author_email", pull.Tip.Author.Email) - metadata.Add("title", pull.Title) // Write version and metadata for reuse in PUT path := filepath.Join(outputDir, ".git", "resource") diff --git a/in_test.go b/in_test.go index 306cd5dd..83563753 100644 --- a/in_test.go +++ b/in_test.go @@ -42,7 +42,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, + 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"}]`, }, { description: "get supports unlocking with git crypt", @@ -59,7 +59,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, + 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"}]`, }, { description: "get supports rebasing", @@ -77,7 +77,7 @@ func TestGet(t *testing.T) { }, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, + 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"}]`, }, { description: "get supports checkout", @@ -95,7 +95,7 @@ func TestGet(t *testing.T) { }, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, + 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"}]`, }, { description: "get supports git_depth", @@ -113,7 +113,7 @@ func TestGet(t *testing.T) { }, pullRequest: createTestPR(1, "master", false, false, 0, nil), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, + 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"}]`, }, { description: "get supports list_changed_files", @@ -139,7 +139,7 @@ func TestGet(t *testing.T) { }, }, versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, - metadataString: `[{"name":"pr","value":"1"},{"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":"title","value":"pr1 title"}]`, + 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"}]`, filesString: "README.md\nOther.md\n", }, } From c646b78ae50c7f05c530ab0d9b1ab924d6e2f659 Mon Sep 17 00:00:00 2001 From: Joe Hosteny Date: Mon, 27 Apr 2020 06:09:40 -0400 Subject: [PATCH 13/36] feat: add submodule support, with safe checkout using access tokens (#187) * feat: add submodule support, with safe checkout using access tokens * fix: revert maintainer label to proper org * Ensure we update submodules on integration --- Dockerfile | 1 + README.md | 1 + fakes/fake_git.go | 90 +++++++++++++++++++++++++--------------------- git.go | 64 +++++++++++++++++++++++++++------ in.go | 11 +++--- in_test.go | 15 +++++--- scripts/askpass.sh | 2 ++ 7 files changed, 123 insertions(+), 61 deletions(-) create mode 100755 scripts/askpass.sh diff --git a/Dockerfile b/Dockerfile index eacc71f0..48067691 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,7 @@ RUN apk add --update --no-cache \ git \ openssh \ && chmod +x /opt/resource/* +COPY scripts/askpass.sh /usr/local/bin/askpass.sh ADD scripts/install_git_crypt.sh install_git_crypt.sh RUN ./install_git_crypt.sh && rm ./install_git_crypt.sh diff --git a/README.md b/README.md index 83273a2a..8fbe815d 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ generate notifications over the webhook. So if you have a repository with little | `skip_download` | No | `true` | Use with `get_params` in a `put` step to do nothing on the implicit get. | | `integration_tool` | No | `rebase` | The integration tool to use, `merge`, `rebase` or `checkout`. Defaults to `merge`. | | `git_depth` | No | `1` | Shallow clone the repository using the `--depth` Git option | +| `submodules` | No | `true` | Recursively clone git submodules. Defaults to false. | | `list_changed_files` | No | `true` | Generate a list of changed files and save alongside metadata | Clones the base (e.g. `master` branch) at the latest commit, and merges the pull request at the specified commit diff --git a/fakes/fake_git.go b/fakes/fake_git.go index 9971dfa5..34252fe7 100644 --- a/fakes/fake_git.go +++ b/fakes/fake_git.go @@ -8,11 +8,12 @@ import ( ) type FakeGit struct { - CheckoutStub func(string, string) error + CheckoutStub func(string, string, bool) error checkoutMutex sync.RWMutex checkoutArgsForCall []struct { arg1 string arg2 string + arg3 bool } checkoutReturns struct { result1 error @@ -20,12 +21,13 @@ type FakeGit struct { checkoutReturnsOnCall map[int]struct { result1 error } - FetchStub func(string, int, int) error + FetchStub func(string, int, int, bool) error fetchMutex sync.RWMutex fetchArgsForCall []struct { arg1 string arg2 int arg3 int + arg4 bool } fetchReturns struct { result1 error @@ -55,10 +57,11 @@ type FakeGit struct { initReturnsOnCall map[int]struct { result1 error } - MergeStub func(string) error + MergeStub func(string, bool) error mergeMutex sync.RWMutex mergeArgsForCall []struct { arg1 string + arg2 bool } mergeReturns struct { result1 error @@ -66,12 +69,13 @@ type FakeGit struct { mergeReturnsOnCall map[int]struct { result1 error } - PullStub func(string, string, int) error + PullStub func(string, string, int, bool) error pullMutex sync.RWMutex pullArgsForCall []struct { arg1 string arg2 string arg3 int + arg4 bool } pullReturns struct { result1 error @@ -79,11 +83,12 @@ type FakeGit struct { pullReturnsOnCall map[int]struct { result1 error } - RebaseStub func(string, string) error + RebaseStub func(string, string, bool) error rebaseMutex sync.RWMutex rebaseArgsForCall []struct { arg1 string arg2 string + arg3 bool } rebaseReturns struct { result1 error @@ -108,17 +113,18 @@ type FakeGit struct { invocationsMutex sync.RWMutex } -func (fake *FakeGit) Checkout(arg1 string, arg2 string) error { +func (fake *FakeGit) Checkout(arg1 string, arg2 string, arg3 bool) error { fake.checkoutMutex.Lock() ret, specificReturn := fake.checkoutReturnsOnCall[len(fake.checkoutArgsForCall)] fake.checkoutArgsForCall = append(fake.checkoutArgsForCall, struct { arg1 string arg2 string - }{arg1, arg2}) - fake.recordInvocation("Checkout", []interface{}{arg1, arg2}) + arg3 bool + }{arg1, arg2, arg3}) + fake.recordInvocation("Checkout", []interface{}{arg1, arg2, arg3}) fake.checkoutMutex.Unlock() if fake.CheckoutStub != nil { - return fake.CheckoutStub(arg1, arg2) + return fake.CheckoutStub(arg1, arg2, arg3) } if specificReturn { return ret.result1 @@ -133,17 +139,17 @@ func (fake *FakeGit) CheckoutCallCount() int { return len(fake.checkoutArgsForCall) } -func (fake *FakeGit) CheckoutCalls(stub func(string, string) error) { +func (fake *FakeGit) CheckoutCalls(stub func(string, string, bool) error) { fake.checkoutMutex.Lock() defer fake.checkoutMutex.Unlock() fake.CheckoutStub = stub } -func (fake *FakeGit) CheckoutArgsForCall(i int) (string, string) { +func (fake *FakeGit) CheckoutArgsForCall(i int) (string, string, bool) { fake.checkoutMutex.RLock() defer fake.checkoutMutex.RUnlock() argsForCall := fake.checkoutArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 } func (fake *FakeGit) CheckoutReturns(result1 error) { @@ -169,18 +175,19 @@ func (fake *FakeGit) CheckoutReturnsOnCall(i int, result1 error) { }{result1} } -func (fake *FakeGit) Fetch(arg1 string, arg2 int, arg3 int) error { +func (fake *FakeGit) Fetch(arg1 string, arg2 int, arg3 int, arg4 bool) error { fake.fetchMutex.Lock() ret, specificReturn := fake.fetchReturnsOnCall[len(fake.fetchArgsForCall)] fake.fetchArgsForCall = append(fake.fetchArgsForCall, struct { arg1 string arg2 int arg3 int - }{arg1, arg2, arg3}) - fake.recordInvocation("Fetch", []interface{}{arg1, arg2, arg3}) + arg4 bool + }{arg1, arg2, arg3, arg4}) + fake.recordInvocation("Fetch", []interface{}{arg1, arg2, arg3, arg4}) fake.fetchMutex.Unlock() if fake.FetchStub != nil { - return fake.FetchStub(arg1, arg2, arg3) + return fake.FetchStub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1 @@ -195,17 +202,17 @@ func (fake *FakeGit) FetchCallCount() int { return len(fake.fetchArgsForCall) } -func (fake *FakeGit) FetchCalls(stub func(string, int, int) error) { +func (fake *FakeGit) FetchCalls(stub func(string, int, int, bool) error) { fake.fetchMutex.Lock() defer fake.fetchMutex.Unlock() fake.FetchStub = stub } -func (fake *FakeGit) FetchArgsForCall(i int) (string, int, int) { +func (fake *FakeGit) FetchArgsForCall(i int) (string, int, int, bool) { fake.fetchMutex.RLock() defer fake.fetchMutex.RUnlock() argsForCall := fake.fetchArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 } func (fake *FakeGit) FetchReturns(result1 error) { @@ -351,16 +358,17 @@ func (fake *FakeGit) InitReturnsOnCall(i int, result1 error) { }{result1} } -func (fake *FakeGit) Merge(arg1 string) error { +func (fake *FakeGit) Merge(arg1 string, arg2 bool) error { fake.mergeMutex.Lock() ret, specificReturn := fake.mergeReturnsOnCall[len(fake.mergeArgsForCall)] fake.mergeArgsForCall = append(fake.mergeArgsForCall, struct { arg1 string - }{arg1}) - fake.recordInvocation("Merge", []interface{}{arg1}) + arg2 bool + }{arg1, arg2}) + fake.recordInvocation("Merge", []interface{}{arg1, arg2}) fake.mergeMutex.Unlock() if fake.MergeStub != nil { - return fake.MergeStub(arg1) + return fake.MergeStub(arg1, arg2) } if specificReturn { return ret.result1 @@ -375,17 +383,17 @@ func (fake *FakeGit) MergeCallCount() int { return len(fake.mergeArgsForCall) } -func (fake *FakeGit) MergeCalls(stub func(string) error) { +func (fake *FakeGit) MergeCalls(stub func(string, bool) error) { fake.mergeMutex.Lock() defer fake.mergeMutex.Unlock() fake.MergeStub = stub } -func (fake *FakeGit) MergeArgsForCall(i int) string { +func (fake *FakeGit) MergeArgsForCall(i int) (string, bool) { fake.mergeMutex.RLock() defer fake.mergeMutex.RUnlock() argsForCall := fake.mergeArgsForCall[i] - return argsForCall.arg1 + return argsForCall.arg1, argsForCall.arg2 } func (fake *FakeGit) MergeReturns(result1 error) { @@ -411,18 +419,19 @@ func (fake *FakeGit) MergeReturnsOnCall(i int, result1 error) { }{result1} } -func (fake *FakeGit) Pull(arg1 string, arg2 string, arg3 int) error { +func (fake *FakeGit) Pull(arg1 string, arg2 string, arg3 int, arg4 bool) error { fake.pullMutex.Lock() ret, specificReturn := fake.pullReturnsOnCall[len(fake.pullArgsForCall)] fake.pullArgsForCall = append(fake.pullArgsForCall, struct { arg1 string arg2 string arg3 int - }{arg1, arg2, arg3}) - fake.recordInvocation("Pull", []interface{}{arg1, arg2, arg3}) + arg4 bool + }{arg1, arg2, arg3, arg4}) + fake.recordInvocation("Pull", []interface{}{arg1, arg2, arg3, arg4}) fake.pullMutex.Unlock() if fake.PullStub != nil { - return fake.PullStub(arg1, arg2, arg3) + return fake.PullStub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1 @@ -437,17 +446,17 @@ func (fake *FakeGit) PullCallCount() int { return len(fake.pullArgsForCall) } -func (fake *FakeGit) PullCalls(stub func(string, string, int) error) { +func (fake *FakeGit) PullCalls(stub func(string, string, int, bool) error) { fake.pullMutex.Lock() defer fake.pullMutex.Unlock() fake.PullStub = stub } -func (fake *FakeGit) PullArgsForCall(i int) (string, string, int) { +func (fake *FakeGit) PullArgsForCall(i int) (string, string, int, bool) { fake.pullMutex.RLock() defer fake.pullMutex.RUnlock() argsForCall := fake.pullArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 } func (fake *FakeGit) PullReturns(result1 error) { @@ -473,17 +482,18 @@ func (fake *FakeGit) PullReturnsOnCall(i int, result1 error) { }{result1} } -func (fake *FakeGit) Rebase(arg1 string, arg2 string) error { +func (fake *FakeGit) Rebase(arg1 string, arg2 string, arg3 bool) error { fake.rebaseMutex.Lock() ret, specificReturn := fake.rebaseReturnsOnCall[len(fake.rebaseArgsForCall)] fake.rebaseArgsForCall = append(fake.rebaseArgsForCall, struct { arg1 string arg2 string - }{arg1, arg2}) - fake.recordInvocation("Rebase", []interface{}{arg1, arg2}) + arg3 bool + }{arg1, arg2, arg3}) + fake.recordInvocation("Rebase", []interface{}{arg1, arg2, arg3}) fake.rebaseMutex.Unlock() if fake.RebaseStub != nil { - return fake.RebaseStub(arg1, arg2) + return fake.RebaseStub(arg1, arg2, arg3) } if specificReturn { return ret.result1 @@ -498,17 +508,17 @@ func (fake *FakeGit) RebaseCallCount() int { return len(fake.rebaseArgsForCall) } -func (fake *FakeGit) RebaseCalls(stub func(string, string) error) { +func (fake *FakeGit) RebaseCalls(stub func(string, string, bool) error) { fake.rebaseMutex.Lock() defer fake.rebaseMutex.Unlock() fake.RebaseStub = stub } -func (fake *FakeGit) RebaseArgsForCall(i int) (string, string) { +func (fake *FakeGit) RebaseArgsForCall(i int) (string, string, bool) { fake.rebaseMutex.RLock() defer fake.rebaseMutex.RUnlock() argsForCall := fake.rebaseArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 } func (fake *FakeGit) RebaseReturns(result1 error) { diff --git a/git.go b/git.go index 874b85f5..ccbd966b 100644 --- a/git.go +++ b/git.go @@ -17,12 +17,12 @@ import ( //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_git.go . Git type Git interface { Init(string) error - Pull(string, string, int) error + Pull(string, string, int, bool) error RevParse(string) (string, error) - Fetch(string, int, int) error - Checkout(string, string) error - Merge(string) error - Rebase(string, string) error + Fetch(string, int, int, bool) error + Checkout(string, string, bool) error + Merge(string, bool) error + Rebase(string, string, bool) error GitCryptUnlock(string) error } @@ -50,6 +50,10 @@ func (g *GitClient) command(name string, arg ...string) *exec.Cmd { cmd.Dir = g.Directory cmd.Stdout = g.Output cmd.Stderr = g.Output + cmd.Env = os.Environ() + cmd.Env = append(cmd.Env, + "X_OAUTH_BASIC_TOKEN="+g.AccessToken, + "GIT_ASKPASS=/usr/local/bin/askpass.sh") return cmd } @@ -67,11 +71,17 @@ func (g *GitClient) Init(branch string) error { if err := g.command("git", "config", "user.email", "concourse@local").Run(); err != nil { return fmt.Errorf("failed to configure git email: %s", err) } + if err := g.command("git", "config", "--global", "url.https://x-oauth-basic@github.com/.insteadOf", "git@github.com:").Run(); err != nil { + return fmt.Errorf("failed to configure github url: %s", err) + } + if err := g.command("git", "config", "--global", "url.https://.insteadOf", "git://").Run(); err != nil { + return fmt.Errorf("failed to configure github url: %s", err) + } return nil } // Pull ... -func (g *GitClient) Pull(uri, branch string, depth int) error { +func (g *GitClient) Pull(uri, branch string, depth int, submodules bool) error { endpoint, err := g.Endpoint(uri) if err != nil { return err @@ -81,6 +91,9 @@ func (g *GitClient) Pull(uri, branch string, depth int) error { if depth > 0 { args = append(args, "--depth", strconv.Itoa(depth)) } + if submodules { + args = append(args, "--recurse-submodules") + } cmd := g.command("git", args...) // Discard output to have zero chance of logging the access token. @@ -88,7 +101,13 @@ func (g *GitClient) Pull(uri, branch string, depth int) error { cmd.Stderr = ioutil.Discard if err := cmd.Run(); err != nil { - return fmt.Errorf("clone failed: %s", err) + return fmt.Errorf("pull failed: %s", cmd) + } + if submodules { + submodulesGet := g.command("git", "submodule", "update", "--init", "--recursive") + if err := submodulesGet.Run(); err != nil { + return fmt.Errorf("submodule update failed: %s", err) + } } return nil } @@ -105,7 +124,7 @@ func (g *GitClient) RevParse(branch string) (string, error) { } // Fetch ... -func (g *GitClient) Fetch(uri string, prNumber int, depth int) error { +func (g *GitClient) Fetch(uri string, prNumber int, depth int, submodules bool) error { endpoint, err := g.Endpoint(uri) if err != nil { return err @@ -115,6 +134,9 @@ func (g *GitClient) Fetch(uri string, prNumber int, depth int) error { if depth > 0 { args = append(args, "--depth", strconv.Itoa(depth)) } + if submodules { + args = append(args, "--recurse-submodules") + } cmd := g.command("git", args...) // Discard output to have zero chance of logging the access token. @@ -128,27 +150,47 @@ func (g *GitClient) Fetch(uri string, prNumber int, depth int) error { } // CheckOut -func (g *GitClient) Checkout(branch, sha string) error { +func (g *GitClient) Checkout(branch, sha string, submodules bool) error { if err := g.command("git", "checkout", "-b", branch, sha).Run(); err != nil { return fmt.Errorf("checkout failed: %s", err) } + if submodules { + if err := g.command("git", "submodule", "update", "--init", "--recursive", "--checkout").Run(); err != nil { + return fmt.Errorf("submodule update failed: %s", err) + } + } + return nil } // Merge ... -func (g *GitClient) Merge(sha string) error { +func (g *GitClient) Merge(sha string, submodules bool) error { if err := g.command("git", "merge", sha, "--no-stat").Run(); err != nil { return fmt.Errorf("merge failed: %s", err) } + + if submodules { + if err := g.command("git", "submodule", "update", "--init", "--recursive", "--merge").Run(); err != nil { + return fmt.Errorf("submodule update failed: %s", err) + } + } + return nil } // Rebase ... -func (g *GitClient) Rebase(baseRef string, headSha string) error { +func (g *GitClient) Rebase(baseRef string, headSha string, submodules bool) error { if err := g.command("git", "rebase", baseRef, headSha).Run(); err != nil { return fmt.Errorf("rebase failed: %s", err) } + + if submodules { + if err := g.command("git", "submodule", "update", "--init", "--recursive", "--rebase").Run(); err != nil { + return fmt.Errorf("submodule update failed: %s", err) + } + } + return nil } diff --git a/in.go b/in.go index 217f179c..5a2de486 100644 --- a/in.go +++ b/in.go @@ -24,7 +24,7 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp if err := git.Init(pull.BaseRefName); err != nil { return nil, err } - if err := git.Pull(pull.Repository.URL, pull.BaseRefName, request.Params.GitDepth); err != nil { + if err := git.Pull(pull.Repository.URL, pull.BaseRefName, request.Params.GitDepth, request.Params.Submodules); err != nil { return nil, err } @@ -35,21 +35,21 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp } // Fetch the PR and merge the specified commit into the base - if err := git.Fetch(pull.Repository.URL, pull.Number, request.Params.GitDepth); err != nil { + if err := git.Fetch(pull.Repository.URL, pull.Number, request.Params.GitDepth, request.Params.Submodules); err != nil { return nil, err } switch tool := request.Params.IntegrationTool; tool { case "rebase": - if err := git.Rebase(pull.BaseRefName, pull.Tip.OID); err != nil { + if err := git.Rebase(pull.BaseRefName, pull.Tip.OID, request.Params.Submodules); err != nil { return nil, err } case "merge", "": - if err := git.Merge(pull.Tip.OID); err != nil { + if err := git.Merge(pull.Tip.OID, request.Params.Submodules); err != nil { return nil, err } case "checkout": - if err := git.Checkout(pull.HeadRefName, pull.Tip.OID); err != nil { + if err := git.Checkout(pull.HeadRefName, pull.Tip.OID, request.Params.Submodules); err != nil { return nil, err } default: @@ -133,6 +133,7 @@ type GetParameters struct { SkipDownload bool `json:"skip_download"` IntegrationTool string `json:"integration_tool"` GitDepth int `json:"git_depth"` + Submodules bool `json:"submodules"` ListChangedFiles bool `json:"list_changed_files"` } diff --git a/in_test.go b/in_test.go index 83563753..5179bcec 100644 --- a/in_test.go +++ b/in_test.go @@ -212,10 +212,11 @@ func TestGet(t *testing.T) { } if assert.Equal(t, 1, git.PullCallCount()) { - url, base, depth := git.PullArgsForCall(0) + url, base, depth, submodules := git.PullArgsForCall(0) assert.Equal(t, tc.pullRequest.Repository.URL, url) assert.Equal(t, tc.pullRequest.BaseRefName, base) assert.Equal(t, tc.parameters.GitDepth, depth) + assert.Equal(t, tc.parameters.Submodules, submodules) } if assert.Equal(t, 1, git.RevParseCallCount()) { @@ -224,29 +225,33 @@ func TestGet(t *testing.T) { } if assert.Equal(t, 1, git.FetchCallCount()) { - url, pr, depth := git.FetchArgsForCall(0) + url, pr, depth, submodules := git.FetchArgsForCall(0) assert.Equal(t, tc.pullRequest.Repository.URL, url) assert.Equal(t, tc.pullRequest.Number, pr) assert.Equal(t, tc.parameters.GitDepth, depth) + assert.Equal(t, tc.parameters.Submodules, submodules) } switch tc.parameters.IntegrationTool { case "rebase": if assert.Equal(t, 1, git.RebaseCallCount()) { - branch, tip := git.RebaseArgsForCall(0) + branch, tip, submodules := git.RebaseArgsForCall(0) assert.Equal(t, tc.pullRequest.BaseRefName, branch) assert.Equal(t, tc.pullRequest.Tip.OID, tip) + assert.Equal(t, tc.parameters.Submodules, submodules) } case "checkout": if assert.Equal(t, 1, git.CheckoutCallCount()) { - branch, sha := git.CheckoutArgsForCall(0) + branch, sha, submodules := git.CheckoutArgsForCall(0) assert.Equal(t, tc.pullRequest.HeadRefName, branch) assert.Equal(t, tc.pullRequest.Tip.OID, sha) + assert.Equal(t, tc.parameters.Submodules, submodules) } default: if assert.Equal(t, 1, git.MergeCallCount()) { - tip := git.MergeArgsForCall(0) + tip, submodules := git.MergeArgsForCall(0) assert.Equal(t, tc.pullRequest.Tip.OID, tip) + assert.Equal(t, tc.parameters.Submodules, submodules) } } if tc.source.GitCryptKey != "" { diff --git a/scripts/askpass.sh b/scripts/askpass.sh new file mode 100755 index 00000000..49916739 --- /dev/null +++ b/scripts/askpass.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec echo "$X_OAUTH_BASIC_TOKEN" From a2ec386dc9b97357128dc87b94ee2cb46c57dce5 Mon Sep 17 00:00:00 2001 From: Kristian Dalmo Olsen Date: Mon, 27 Apr 2020 15:04:40 +0200 Subject: [PATCH 14/36] Add e2e test for submodules (#199) * Ocular patdown of e2e tests * Remove global flag from git config * Fix e2e tests for comments * Add e2e tests for submodules --- e2e/e2e_test.go | 103 +++++++++++++++++++++++++++++++++++++++++------- git.go | 4 +- 2 files changed, 90 insertions(+), 17 deletions(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index f1698bc6..523838c2 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -35,7 +35,6 @@ var ( ) func TestCheckE2E(t *testing.T) { - tests := []struct { description string source resource.Source @@ -472,12 +471,89 @@ func TestGetAndPutE2E(t *testing.T) { } } +func TestGetSubmodules(t *testing.T) { + tests := []struct { + description string + source resource.Source + version resource.Version + getParameters resource.GetParameters + expectedFiles []string + }{ + { + description: "get works with submodules", + source: resource.Source{ + Repository: "itsdalmo/test-repository-active", + AccessToken: os.Getenv("GITHUB_ACCESS_TOKEN"), + }, + version: resource.Version{ + PR: "4", + Commit: "49398613d1f23d14518aadf6023cddba5db649ee", + }, + getParameters: resource.GetParameters{ + Submodules: true, + }, + expectedFiles: []string{ + ".git", + "README.md", + "latest-test.txt", + "new-test.txt", + "pipeline.yml", + "test.txt", + }, + }, + { + description: "submodules are optional", + source: resource.Source{ + Repository: "itsdalmo/test-repository-active", + AccessToken: os.Getenv("GITHUB_ACCESS_TOKEN"), + }, + version: resource.Version{ + PR: "4", + Commit: "49398613d1f23d14518aadf6023cddba5db649ee", + }, + getParameters: resource.GetParameters{ + Submodules: false, + }, + expectedFiles: []string{}, + }, + } + + for _, tc := range tests { + t.Run(tc.description, func(t *testing.T) { + // Create temporary directory + dir, err := ioutil.TempDir("", "github-pr-resource") + require.NoError(t, err) + defer os.RemoveAll(dir) + + githubClient, err := resource.NewGithubClient(&tc.source) + require.NoError(t, err) + + git, err := resource.NewGitClient(&tc.source, dir, ioutil.Discard) + require.NoError(t, err) + + // Get (output and files) + getRequest := resource.GetRequest{Source: tc.source, Version: tc.version, Params: tc.getParameters} + _, err = resource.Get(getRequest, githubClient, git, dir) + require.NoError(t, err) + + files, err := ioutil.ReadDir(filepath.Join(dir, "submodule")) + require.NoError(t, err) + + for _, f := range files { + assert.Contains(t, tc.expectedFiles, f.Name()) + } + }) + } +} + func TestPutCommentsE2E(t *testing.T) { - owner := "itsdalmo" - repo := "github-pr-resource-e2e" + var ( + owner = "itsdalmo" + repository = "test-repository-active" + ) tests := []struct { - description, branch string + description string source resource.Source getParams resource.GetParameters putParameters resource.PutParameters @@ -485,9 +561,8 @@ func TestPutCommentsE2E(t *testing.T) { }{ { description: "delete previous comments removes old comments and makes new one", - branch: "delete-previous-comments-remove-old-add-new", source: resource.Source{ - Repository: fmt.Sprintf("%s/%s", owner, repo), + Repository: fmt.Sprintf("%s/%s", owner, repository), V3Endpoint: "https://api.github.com/", V4Endpoint: "https://api.github.com/graphql", AccessToken: os.Getenv("GITHUB_ACCESS_TOKEN"), @@ -504,9 +579,8 @@ func TestPutCommentsE2E(t *testing.T) { }, { description: "delete previous comments removes all comments when no new comment", - branch: "delete-previous-comments-remove-old", source: resource.Source{ - Repository: fmt.Sprintf("%s/%s", owner, repo), + Repository: fmt.Sprintf("%s/%s", owner, repository), V3Endpoint: "https://api.github.com/", V4Endpoint: "https://api.github.com/graphql", AccessToken: os.Getenv("GITHUB_ACCESS_TOKEN"), @@ -520,9 +594,8 @@ func TestPutCommentsE2E(t *testing.T) { }, { description: "delete previous comments should not delete comments when false", - branch: "delete-previous-comments-false", source: resource.Source{ - Repository: fmt.Sprintf("%s/%s", owner, repo), + Repository: fmt.Sprintf("%s/%s", owner, repository), V3Endpoint: "https://api.github.com/", V4Endpoint: "https://api.github.com/graphql", AccessToken: os.Getenv("GITHUB_ACCESS_TOKEN"), @@ -552,15 +625,15 @@ func TestPutCommentsE2E(t *testing.T) { git, err := resource.NewGitClient(&tc.source, dir, ioutil.Discard) require.NoError(t, err) - pullRequest, _, err := githubClient.V3.PullRequests.Create(context.TODO(), owner, repo, &github.NewPullRequest{ + pullRequest, _, err := githubClient.V3.PullRequests.Create(context.TODO(), owner, repository, &github.NewPullRequest{ Title: github.String(tc.description), Base: github.String("master"), - Head: github.String(fmt.Sprintf("%s:%s", owner, tc.branch)), + Head: github.String(fmt.Sprintf("%s:%s", owner, "test-comments")), }) require.NoError(t, err) for _, comment := range tc.previousComments { - _, _, err = githubClient.V3.Issues.CreateComment(context.TODO(), owner, repo, pullRequest.GetNumber(), &github.IssueComment{ + _, _, err = githubClient.V3.Issues.CreateComment(context.TODO(), owner, repository, pullRequest.GetNumber(), &github.IssueComment{ Body: github.String(comment), }) require.NoError(t, err) @@ -581,7 +654,7 @@ func TestPutCommentsE2E(t *testing.T) { _, err = resource.Put(putRequest, githubClient, dir) require.NoError(t, err) - comments, _, err := githubClient.V3.Issues.ListComments(context.TODO(), owner, repo, pullRequest.GetNumber(), nil) + comments, _, err := githubClient.V3.Issues.ListComments(context.TODO(), owner, repository, pullRequest.GetNumber(), nil) require.NoError(t, err) require.Len(t, comments, len(tc.expectedComments)) @@ -589,7 +662,7 @@ func TestPutCommentsE2E(t *testing.T) { require.Equal(t, tc.expectedComments[index], comment.GetBody()) } - _, _, err = githubClient.V3.PullRequests.Edit(context.TODO(), owner, repo, pullRequest.GetNumber(), &github.PullRequest{ + _, _, err = githubClient.V3.PullRequests.Edit(context.TODO(), owner, repository, pullRequest.GetNumber(), &github.PullRequest{ State: github.String("closed"), }) require.NoError(t, err) diff --git a/git.go b/git.go index ccbd966b..caf30a52 100644 --- a/git.go +++ b/git.go @@ -71,10 +71,10 @@ func (g *GitClient) Init(branch string) error { if err := g.command("git", "config", "user.email", "concourse@local").Run(); err != nil { return fmt.Errorf("failed to configure git email: %s", err) } - if err := g.command("git", "config", "--global", "url.https://x-oauth-basic@github.com/.insteadOf", "git@github.com:").Run(); err != nil { + if err := g.command("git", "config", "url.https://x-oauth-basic@github.com/.insteadOf", "git@github.com:").Run(); err != nil { return fmt.Errorf("failed to configure github url: %s", err) } - if err := g.command("git", "config", "--global", "url.https://.insteadOf", "git://").Run(); err != nil { + if err := g.command("git", "config", "url.https://.insteadOf", "git://").Run(); err != nil { return fmt.Errorf("failed to configure github url: %s", err) } return nil From 8628f31518c3fb02834246ad7309528de2388301 Mon Sep 17 00:00:00 2001 From: Max Knee Date: Wed, 27 May 2020 21:15:56 -0400 Subject: [PATCH 15/36] Moving example closer to text It was a little hard to grok that example listed was for a `put` for pending status, hopefully grouping these closer to the text will be helpful. --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8fbe815d..e257600c 100644 --- a/README.md +++ b/README.md @@ -87,8 +87,7 @@ is available as `.git/resource/base_sha`. For a complete list of available (indi When specifying `skip_download` the pull request volume mounted to subsequent tasks will be empty, which is a problem when you set e.g. the pending status before running the actual tests. The workaround for this is to use an alias for the `put` (see https://github.com/telia-oss/github-pr-resource/issues/32 for more details). - -git-crypt encrypted repositories will automatically be decrypted when the `git_crypt_key` is set in the source configuration. +Example here: ```yaml put: update-status <-- Use an alias for the pull-request resource @@ -99,6 +98,8 @@ params: get_params: {skip_download: true} ``` +git-crypt encrypted repositories will automatically be decrypted when the `git_crypt_key` is set in the source configuration. + Note that, should you retrigger a build in the hopes of testing the last commit to a PR against a newer version of the base, Concourse will reuse the volume (i.e. not trigger a new `get`) if it still exists, which can produce unexpected results (#5). As such, re-testing a PR against a newer version of the base is best done by *pushing an From e2d84b34c8d9df0a82ec5f6c571c9042eeddfbd4 Mon Sep 17 00:00:00 2001 From: Isaac Sanders Date: Wed, 19 Aug 2020 15:14:58 -0500 Subject: [PATCH 16/36] Adds approved review count to the version --- models.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/models.go b/models.go index 296265ec..71d9ce43 100644 --- a/models.go +++ b/models.go @@ -58,17 +58,19 @@ type MetadataField struct { // Version communicated with Concourse. type Version struct { - PR string `json:"pr"` - Commit string `json:"commit"` - CommittedDate time.Time `json:"committed,omitempty"` + PR string `json:"pr"` + Commit string `json:"commit"` + CommittedDate time.Time `json:"committed,omitempty"` + ApprovedReviewCount int `json:"approved_review_count"` } // NewVersion constructs a new Version. func NewVersion(p *PullRequest) Version { return Version{ - PR: strconv.Itoa(p.Number), - Commit: p.Tip.OID, - CommittedDate: p.Tip.CommittedDate.Time, + PR: strconv.Itoa(p.Number), + Commit: p.Tip.OID, + CommittedDate: p.Tip.CommittedDate.Time, + ApprovedReviewCount: p.ApprovedReviewCount, } } From b083b8c200fc2f82b58cdf331fc791349751e363 Mon Sep 17 00:00:00 2001 From: Isaac Sanders Date: Wed, 19 Aug 2020 15:33:40 -0500 Subject: [PATCH 17/36] fix: Updates tests --- in_test.go | 54 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/in_test.go b/in_test.go index 5179bcec..6bc441b9 100644 --- a/in_test.go +++ b/in_test.go @@ -35,13 +35,14 @@ func TestGet(t *testing.T) { AccessToken: "oauthtoken", }, version: resource.Version{ - PR: "pr1", - Commit: "commit1", - CommittedDate: time.Time{}, + PR: "pr1", + Commit: "commit1", + CommittedDate: time.Time{}, + ApprovedReviewCount: 0, }, parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, 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"}]`, }, { @@ -52,13 +53,14 @@ func TestGet(t *testing.T) { GitCryptKey: "gitcryptkey", }, version: resource.Version{ - PR: "pr1", - Commit: "commit1", - CommittedDate: time.Time{}, + PR: "pr1", + Commit: "commit1", + CommittedDate: time.Time{}, + ApprovedReviewCount: 0, }, parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, 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"}]`, }, { @@ -68,15 +70,16 @@ func TestGet(t *testing.T) { AccessToken: "oauthtoken", }, version: resource.Version{ - PR: "pr1", - Commit: "commit1", - CommittedDate: time.Time{}, + PR: "pr1", + Commit: "commit1", + CommittedDate: time.Time{}, + ApprovedReviewCount: 0, }, parameters: resource.GetParameters{ IntegrationTool: "rebase", }, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, 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"}]`, }, { @@ -86,15 +89,16 @@ func TestGet(t *testing.T) { AccessToken: "oauthtoken", }, version: resource.Version{ - PR: "pr1", - Commit: "commit1", - CommittedDate: time.Time{}, + PR: "pr1", + Commit: "commit1", + CommittedDate: time.Time{}, + ApprovedReviewCount: 0, }, parameters: resource.GetParameters{ IntegrationTool: "checkout", }, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, 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"}]`, }, { @@ -104,15 +108,16 @@ func TestGet(t *testing.T) { AccessToken: "oauthtoken", }, version: resource.Version{ - PR: "pr1", - Commit: "commit1", - CommittedDate: time.Time{}, + PR: "pr1", + Commit: "commit1", + CommittedDate: time.Time{}, + ApprovedReviewCount: 0, }, parameters: resource.GetParameters{ GitDepth: 2, }, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, 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"}]`, }, { @@ -122,9 +127,10 @@ func TestGet(t *testing.T) { AccessToken: "oauthtoken", }, version: resource.Version{ - PR: "pr1", - Commit: "commit1", - CommittedDate: time.Time{}, + PR: "pr1", + Commit: "commit1", + CommittedDate: time.Time{}, + ApprovedReviewCount: 0, }, parameters: resource.GetParameters{ ListChangedFiles: true, @@ -138,7 +144,7 @@ func TestGet(t *testing.T) { Path: "Other.md", }, }, - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z"}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, 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"}]`, filesString: "README.md\nOther.md\n", }, From c2077ff2abef9270544fb8a79f066289de0e9162 Mon Sep 17 00:00:00 2001 From: Gabriele Petronella Date: Fri, 21 Aug 2020 11:52:59 +0200 Subject: [PATCH 18/36] Write version and metadata before the integration step This allow using a put step for reporting integration errors --- in.go | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/in.go b/in.go index 5a2de486..473ed528 100644 --- a/in.go +++ b/in.go @@ -39,29 +39,6 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp return nil, err } - switch tool := request.Params.IntegrationTool; tool { - case "rebase": - if err := git.Rebase(pull.BaseRefName, pull.Tip.OID, request.Params.Submodules); err != nil { - return nil, err - } - case "merge", "": - if err := git.Merge(pull.Tip.OID, request.Params.Submodules); err != nil { - return nil, err - } - case "checkout": - if err := git.Checkout(pull.HeadRefName, pull.Tip.OID, request.Params.Submodules); err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("invalid integration tool specified: %s", tool) - } - - if request.Source.GitCryptKey != "" { - if err := git.GitCryptUnlock(request.Source.GitCryptKey); err != nil { - return nil, err - } - } - // Create the metadata var metadata Metadata metadata.Add("pr", strconv.Itoa(pull.Number)) @@ -101,7 +78,29 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp if err := ioutil.WriteFile(filepath.Join(path, filename), content, 0644); err != nil { return nil, fmt.Errorf("failed to write metadata file %s: %s", filename, err) } + } + + switch tool := request.Params.IntegrationTool; tool { + case "rebase": + if err := git.Rebase(pull.BaseRefName, pull.Tip.OID, request.Params.Submodules); err != nil { + return nil, err + } + case "merge", "": + if err := git.Merge(pull.Tip.OID, request.Params.Submodules); err != nil { + return nil, err + } + case "checkout": + if err := git.Checkout(pull.HeadRefName, pull.Tip.OID, request.Params.Submodules); err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("invalid integration tool specified: %s", tool) + } + if request.Source.GitCryptKey != "" { + if err := git.GitCryptUnlock(request.Source.GitCryptKey); err != nil { + return nil, err + } } if request.Params.ListChangedFiles { From 3f16855d59db88a19d818f9a2bb9c8d93020753b Mon Sep 17 00:00:00 2001 From: Joe Hosteny Date: Sat, 26 Sep 2020 13:13:51 -0400 Subject: [PATCH 19/36] feat: add support for optionally fetching tags --- README.md | 1 + fakes/fake_git.go | 18 ++++++++++-------- git.go | 7 +++++-- in.go | 3 ++- in_test.go | 3 ++- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 8fbe815d..86f72eb8 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ generate notifications over the webhook. So if you have a repository with little | `git_depth` | No | `1` | Shallow clone the repository using the `--depth` Git option | | `submodules` | No | `true` | Recursively clone git submodules. Defaults to false. | | `list_changed_files` | No | `true` | Generate a list of changed files and save alongside metadata | +| `fetch_tags` | No | `true` | Fetch tags from remote repository | Clones the base (e.g. `master` branch) at the latest commit, and merges the pull request at the specified commit into master. This ensures that we are both testing and setting status on the exact commit that was requested in diff --git a/fakes/fake_git.go b/fakes/fake_git.go index 34252fe7..2a395475 100644 --- a/fakes/fake_git.go +++ b/fakes/fake_git.go @@ -69,13 +69,14 @@ type FakeGit struct { mergeReturnsOnCall map[int]struct { result1 error } - PullStub func(string, string, int, bool) error + PullStub func(string, string, int, bool, bool) error pullMutex sync.RWMutex pullArgsForCall []struct { arg1 string arg2 string arg3 int arg4 bool + arg5 bool } pullReturns struct { result1 error @@ -419,7 +420,7 @@ func (fake *FakeGit) MergeReturnsOnCall(i int, result1 error) { }{result1} } -func (fake *FakeGit) Pull(arg1 string, arg2 string, arg3 int, arg4 bool) error { +func (fake *FakeGit) Pull(arg1 string, arg2 string, arg3 int, arg4 bool, arg5 bool) error { fake.pullMutex.Lock() ret, specificReturn := fake.pullReturnsOnCall[len(fake.pullArgsForCall)] fake.pullArgsForCall = append(fake.pullArgsForCall, struct { @@ -427,11 +428,12 @@ func (fake *FakeGit) Pull(arg1 string, arg2 string, arg3 int, arg4 bool) error { arg2 string arg3 int arg4 bool - }{arg1, arg2, arg3, arg4}) - fake.recordInvocation("Pull", []interface{}{arg1, arg2, arg3, arg4}) + arg5 bool + }{arg1, arg2, arg3, arg4, arg5}) + fake.recordInvocation("Pull", []interface{}{arg1, arg2, arg3, arg4, arg5}) fake.pullMutex.Unlock() if fake.PullStub != nil { - return fake.PullStub(arg1, arg2, arg3, arg4) + return fake.PullStub(arg1, arg2, arg3, arg4, arg5) } if specificReturn { return ret.result1 @@ -446,17 +448,17 @@ func (fake *FakeGit) PullCallCount() int { return len(fake.pullArgsForCall) } -func (fake *FakeGit) PullCalls(stub func(string, string, int, bool) error) { +func (fake *FakeGit) PullCalls(stub func(string, string, int, bool, bool) error) { fake.pullMutex.Lock() defer fake.pullMutex.Unlock() fake.PullStub = stub } -func (fake *FakeGit) PullArgsForCall(i int) (string, string, int, bool) { +func (fake *FakeGit) PullArgsForCall(i int) (string, string, int, bool, bool) { fake.pullMutex.RLock() defer fake.pullMutex.RUnlock() argsForCall := fake.pullArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 } func (fake *FakeGit) PullReturns(result1 error) { diff --git a/git.go b/git.go index caf30a52..40956927 100644 --- a/git.go +++ b/git.go @@ -17,7 +17,7 @@ import ( //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_git.go . Git type Git interface { Init(string) error - Pull(string, string, int, bool) error + Pull(string, string, int, bool, bool) error RevParse(string) (string, error) Fetch(string, int, int, bool) error Checkout(string, string, bool) error @@ -81,7 +81,7 @@ func (g *GitClient) Init(branch string) error { } // Pull ... -func (g *GitClient) Pull(uri, branch string, depth int, submodules bool) error { +func (g *GitClient) Pull(uri, branch string, depth int, submodules bool, fetchTags bool) error { endpoint, err := g.Endpoint(uri) if err != nil { return err @@ -91,6 +91,9 @@ func (g *GitClient) Pull(uri, branch string, depth int, submodules bool) error { if depth > 0 { args = append(args, "--depth", strconv.Itoa(depth)) } + if fetchTags { + args = append(args, "--tags") + } if submodules { args = append(args, "--recurse-submodules") } diff --git a/in.go b/in.go index 5a2de486..776a4af8 100644 --- a/in.go +++ b/in.go @@ -24,7 +24,7 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp if err := git.Init(pull.BaseRefName); err != nil { return nil, err } - if err := git.Pull(pull.Repository.URL, pull.BaseRefName, request.Params.GitDepth, request.Params.Submodules); err != nil { + if err := git.Pull(pull.Repository.URL, pull.BaseRefName, request.Params.GitDepth, request.Params.Submodules, request.Params.FetchTags); err != nil { return nil, err } @@ -135,6 +135,7 @@ type GetParameters struct { GitDepth int `json:"git_depth"` Submodules bool `json:"submodules"` ListChangedFiles bool `json:"list_changed_files"` + FetchTags bool `json:"fetch_tags"` } // GetRequest ... diff --git a/in_test.go b/in_test.go index 5179bcec..71a827d3 100644 --- a/in_test.go +++ b/in_test.go @@ -212,11 +212,12 @@ func TestGet(t *testing.T) { } if assert.Equal(t, 1, git.PullCallCount()) { - url, base, depth, submodules := git.PullArgsForCall(0) + url, base, depth, submodules, fetchTags := git.PullArgsForCall(0) assert.Equal(t, tc.pullRequest.Repository.URL, url) assert.Equal(t, tc.pullRequest.BaseRefName, base) assert.Equal(t, tc.parameters.GitDepth, depth) assert.Equal(t, tc.parameters.Submodules, submodules) + assert.Equal(t, tc.parameters.FetchTags, fetchTags) } if assert.Equal(t, 1, git.RevParseCallCount()) { From b8a2ffca66eedbb04aa29b8a809a54501f12baf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20L=C3=B6fstr=C3=B6m?= Date: Mon, 19 Oct 2020 16:27:33 +0200 Subject: [PATCH 20/36] Create test.yml Adds initial CI/CD Test for github-pr-resource --- .github/workflows/test.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..e9dc8482 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,22 @@ +on: [push, pull_request] +name: Test +jobs: + test: + strategy: + matrix: + go-version: [1.14.x, 1.15.x] + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + - name: Checkout code + uses: actions/checkout@v2 + - name: Install Task + uses: Arduino/actions/setup-taskfile@master + with: + version: '2.x' + - name: Run CI Task + run: task ci From 5b2e1012b16efea1e0295e2bdb1f81d9dce4220e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20L=C3=B6fstr=C3=B6m?= Date: Mon, 19 Oct 2020 16:36:50 +0200 Subject: [PATCH 21/36] Update test.yml Change to downloading module instead --- .github/workflows/test.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e9dc8482..0d249985 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,8 +15,6 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - name: Install Task - uses: Arduino/actions/setup-taskfile@master - with: - version: '2.x' + run: go get github.com/go-task/task - name: Run CI Task run: task ci From c06a2c034896b944c6bb5358a2f2546ab454e660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20L=C3=B6fstr=C3=B6m?= Date: Mon, 19 Oct 2020 16:43:31 +0200 Subject: [PATCH 22/36] Remove windows-latest runner --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0d249985..3078900f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ jobs: strategy: matrix: go-version: [1.14.x, 1.15.x] - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - name: Install Go @@ -15,6 +15,6 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - name: Install Task - run: go get github.com/go-task/task + run: curl -sL https://taskfile.dev/install.sh | sh - name: Run CI Task - run: task ci + run: ./bin/task ci From 76ea6d4230ca0588ef7d2cc558f342176263c7ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20L=C3=B6fstr=C3=B6m?= Date: Mon, 19 Oct 2020 16:51:00 +0200 Subject: [PATCH 23/36] Restore windows-runner to CI/CD flow --- .github/workflows/test.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3078900f..6a8af21a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,15 @@ jobs: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v2 - - name: Install Task + - name: Install Task (Linux/macOS) + if: runner.os != 'Windows' run: curl -sL https://taskfile.dev/install.sh | sh + - name: Install Task (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh') + scoop bucket add extras + scoop install task - name: Run CI Task - run: ./bin/task ci + run: task ci From 05d742665826b9d8e47c54d55df59435228091ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20L=C3=B6fstr=C3=B6m?= Date: Mon, 19 Oct 2020 16:55:10 +0200 Subject: [PATCH 24/36] Conditional rule to task --- .github/workflows/test.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6a8af21a..18e92155 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,5 +24,10 @@ jobs: Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh') scoop bucket add extras scoop install task - - name: Run CI Task + - name: Run CI Task (Linux/macOS) + if: runner.os != 'Windows' + run: ./bin/task ci + - name: Run CI Task (Windows) + if: runner.os == 'Windows' run: task ci + From 4edb60b6c57f8f6126971cdd0474eb3742912853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20L=C3=B6fstr=C3=B6m?= Date: Mon, 19 Oct 2020 16:57:35 +0200 Subject: [PATCH 25/36] Restore windows-latest --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 18e92155..dbdd9114 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ jobs: strategy: matrix: go-version: [1.14.x, 1.15.x] - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - name: Install Go From 940551a77273bb10d229cbed7122aa4a18ed3698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20L=C3=B6fstr=C3=B6m?= Date: Mon, 19 Oct 2020 17:03:05 +0200 Subject: [PATCH 26/36] Remove windows-latest --- .github/workflows/test.yml | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dbdd9114..9e56bb94 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ jobs: strategy: matrix: go-version: [1.14.x, 1.15.x] - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - name: Install Go @@ -14,20 +14,8 @@ jobs: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v2 - - name: Install Task (Linux/macOS) - if: runner.os != 'Windows' + - name: Install Task run: curl -sL https://taskfile.dev/install.sh | sh - - name: Install Task (Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh') - scoop bucket add extras - scoop install task - - name: Run CI Task (Linux/macOS) - if: runner.os != 'Windows' + - name: Run CI Task run: ./bin/task ci - - name: Run CI Task (Windows) - if: runner.os == 'Windows' - run: task ci From 9ff47d2b01ba3ce7581bc0639a2788178e59024c Mon Sep 17 00:00:00 2001 From: Isaac Sanders Date: Tue, 20 Oct 2020 08:28:56 -0500 Subject: [PATCH 27/36] docs: Updates README to reflect approved review count --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cb7baffb..edd900a3 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ A version is represented as follows: - `pr`: The pull request number. - `commit`: The commit SHA. - `committed`: Timestamp of when the commit was committed. Used to filter subsequent checks. +- `approved_review_count`: The number of reviews approving of the PR. If several commits are pushed to a given PR at the same time, the last commit will be the new version. From ad669caadb02fb4cceee21895d2a11b7ad2b5440 Mon Sep 17 00:00:00 2001 From: Isaac Sanders Date: Tue, 20 Oct 2020 08:52:34 -0500 Subject: [PATCH 28/36] fix: Converts Approved Review Count to string --- models.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models.go b/models.go index 71d9ce43..fc6aa9d0 100644 --- a/models.go +++ b/models.go @@ -70,7 +70,7 @@ func NewVersion(p *PullRequest) Version { PR: strconv.Itoa(p.Number), Commit: p.Tip.OID, CommittedDate: p.Tip.CommittedDate.Time, - ApprovedReviewCount: p.ApprovedReviewCount, + ApprovedReviewCount: strconv.Itoa(p.ApprovedReviewCount), } } From fc1d0fbfffc5a0fda27e64636c554a1ab3c787ec Mon Sep 17 00:00:00 2001 From: Isaac Sanders Date: Tue, 20 Oct 2020 09:01:18 -0500 Subject: [PATCH 29/36] fix: Converts more ints to strings --- in_test.go | 24 ++++++++++++------------ models.go | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/in_test.go b/in_test.go index 66bd810b..3ac8360e 100644 --- a/in_test.go +++ b/in_test.go @@ -38,11 +38,11 @@ func TestGet(t *testing.T) { PR: "pr1", Commit: "commit1", CommittedDate: time.Time{}, - ApprovedReviewCount: 0, + ApprovedReviewCount: "0", }, parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, 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"}]`, }, { @@ -56,11 +56,11 @@ func TestGet(t *testing.T) { PR: "pr1", Commit: "commit1", CommittedDate: time.Time{}, - ApprovedReviewCount: 0, + ApprovedReviewCount: "0", }, parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, 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"}]`, }, { @@ -73,13 +73,13 @@ func TestGet(t *testing.T) { PR: "pr1", Commit: "commit1", CommittedDate: time.Time{}, - ApprovedReviewCount: 0, + ApprovedReviewCount: "0", }, parameters: resource.GetParameters{ IntegrationTool: "rebase", }, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, 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"}]`, }, { @@ -92,13 +92,13 @@ func TestGet(t *testing.T) { PR: "pr1", Commit: "commit1", CommittedDate: time.Time{}, - ApprovedReviewCount: 0, + ApprovedReviewCount: "0", }, parameters: resource.GetParameters{ IntegrationTool: "checkout", }, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, 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"}]`, }, { @@ -111,13 +111,13 @@ func TestGet(t *testing.T) { PR: "pr1", Commit: "commit1", CommittedDate: time.Time{}, - ApprovedReviewCount: 0, + ApprovedReviewCount: "0", }, parameters: resource.GetParameters{ GitDepth: 2, }, pullRequest: createTestPR(1, "master", false, false, 0, nil), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, 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"}]`, }, { @@ -130,7 +130,7 @@ func TestGet(t *testing.T) { PR: "pr1", Commit: "commit1", CommittedDate: time.Time{}, - ApprovedReviewCount: 0, + ApprovedReviewCount: "0", }, parameters: resource.GetParameters{ ListChangedFiles: true, @@ -144,7 +144,7 @@ func TestGet(t *testing.T) { Path: "Other.md", }, }, - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":0}`, + versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, 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"}]`, filesString: "README.md\nOther.md\n", }, diff --git a/models.go b/models.go index fc6aa9d0..05167642 100644 --- a/models.go +++ b/models.go @@ -61,7 +61,7 @@ type Version struct { PR string `json:"pr"` Commit string `json:"commit"` CommittedDate time.Time `json:"committed,omitempty"` - ApprovedReviewCount int `json:"approved_review_count"` + ApprovedReviewCount string `json:"approved_review_count"` } // NewVersion constructs a new Version. From 8aa1ece5ec911c9f4220dc8b7c59268ba9c148e9 Mon Sep 17 00:00:00 2001 From: Anshul Sirur Date: Wed, 14 Oct 2020 20:58:57 +0200 Subject: [PATCH 30/36] Allow filtering PRs by state In some situations we might only want to pick up resource versions from PRs that have been merged or closed. For example, to trigger a job based once a PR gets closed. --- README.md | 5 ++-- check.go | 16 +++++++++++++ check_test.go | 66 ++++++++++++++++++++++++++++++++++++++++++++------- github.go | 2 +- in.go | 1 + in_test.go | 26 ++++++++++---------- models.go | 43 ++++++++++++++++++++++----------- out_test.go | 23 +++++++++--------- 8 files changed, 133 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 1e1ac086..e2c6e226 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,8 @@ Make sure to check out [#migrating](#migrating) to learn more. | `access_token` | Yes | | A Github Access Token with repository access (required for setting status on commits). N.B. If you want github-pr-resource to work with a private repository. Set `repo:full` permissions on the access token you create on GitHub. If it is a public repository, `repo:status` is enough. | | `v3_endpoint` | No | `https://api.github.com` | Endpoint to use for the V3 Github API (Restful). | | `v4_endpoint` | No | `https://api.github.com/graphql` | Endpoint to use for the V4 Github API (Graphql). | -| `paths` | No | `["terraform/*/*.tf"]` | Only produce new versions if the PR includes changes to files that match one or more glob patterns or prefixes. | -| `ignore_paths` | No | `[".ci/"]` | Inverse of the above. Pattern syntax is documented in [filepath.Match](https://golang.org/pkg/path/filepath/#Match), or a path prefix can be specified (e.g. `.ci/` will match everything in the `.ci` directory). | +| `paths` | No | `["terraform/*/*.tf"]` | Only produce new versions if the PR includes changes to files that match one or more glob patterns or prefixes. | +| `ignore_paths` | No | `[".ci/"]` | Inverse of the above. Pattern syntax is documented in [filepath.Match](https://golang.org/pkg/path/filepath/#Match), or a path prefix can be specified (e.g. `.ci/` will match everything in the `.ci` directory). | | `disable_ci_skip` | No | `true` | Disable ability to skip builds with `[ci skip]` and `[skip ci]` in commit message or pull request title. | | `skip_ssl_verification` | No | `true` | Disable SSL/TLS certificate validation on git and API clients. Use with care! | | `disable_forks` | No | `true` | Disable triggering of the resource if the pull request's fork repository is different to the configured repository. | @@ -35,6 +35,7 @@ Make sure to check out [#migrating](#migrating) to learn more. | `base_branch` | No | `master` | Name of a branch. The pipeline will only trigger on pull requests against the specified branch. | | `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"]. | Notes: - If `v3_endpoint` is set, `v4_endpoint` must also be set (and the other way around). diff --git a/check.go b/check.go index df128717..34fb58a3 100644 --- a/check.go +++ b/check.go @@ -38,6 +38,22 @@ Loop: continue } + // Filter out pull request if it does not have a filtered state + if len(request.Source.States) > 0 { + stateFound := false + + for _, state := range request.Source.States { + if p.State == state { + stateFound = true + break + } + } + + if !stateFound { + continue + } + } + // Filter out pull request if it does not contain at least one of the desired labels if len(request.Source.Labels) > 0 { labelFound := false diff --git a/check_test.go b/check_test.go index 9715394c..86fabf66 100644 --- a/check_test.go +++ b/check_test.go @@ -3,6 +3,7 @@ package resource_test import ( "testing" + "github.com/shurcooL/githubv4" "github.com/stretchr/testify/assert" resource "github.com/telia-oss/github-pr-resource" "github.com/telia-oss/github-pr-resource/fakes" @@ -10,15 +11,18 @@ import ( var ( testPullRequests = []*resource.PullRequest{ - createTestPR(1, "master", true, false, 0, nil), - createTestPR(2, "master", false, false, 0, nil), - createTestPR(3, "master", false, false, 0, nil), - createTestPR(4, "master", false, false, 0, nil), - createTestPR(5, "master", false, true, 0, nil), - createTestPR(6, "master", false, false, 0, nil), - createTestPR(7, "develop", false, false, 0, []string{"enhancement"}), - createTestPR(8, "master", false, false, 1, []string{"wontfix"}), - createTestPR(9, "master", false, false, 0, nil), + createTestPR(1, "master", true, false, 0, nil, githubv4.PullRequestStateOpen), + createTestPR(2, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + createTestPR(3, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + createTestPR(4, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + createTestPR(5, "master", false, true, 0, nil, githubv4.PullRequestStateOpen), + createTestPR(6, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + createTestPR(7, "develop", false, false, 0, []string{"enhancement"}, githubv4.PullRequestStateOpen), + createTestPR(8, "master", false, false, 1, []string{"wontfix"}, githubv4.PullRequestStateOpen), + createTestPR(9, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + createTestPR(10, "master", false, false, 0, nil, githubv4.PullRequestStateClosed), + createTestPR(11, "master", false, false, 0, nil, githubv4.PullRequestStateMerged), + createTestPR(12, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), } ) @@ -185,6 +189,50 @@ func TestCheck(t *testing.T) { resource.NewVersion(testPullRequests[6]), }, }, + + { + description: "check returns latest version from a PR with a single state filter", + source: resource.Source{ + Repository: "itsdalmo/test-repository", + AccessToken: "oauthtoken", + States: []githubv4.PullRequestState{githubv4.PullRequestStateClosed}, + }, + version: resource.Version{}, + pullRequests: testPullRequests, + files: [][]string{}, + expected: resource.CheckResponse{ + resource.NewVersion(testPullRequests[9]), + }, + }, + + { + description: "check filters out versions from a PR which do not match the state filter", + source: resource.Source{ + Repository: "itsdalmo/test-repository", + AccessToken: "oauthtoken", + States: []githubv4.PullRequestState{githubv4.PullRequestStateOpen}, + }, + version: resource.Version{}, + pullRequests: testPullRequests[9:11], + files: [][]string{}, + expected: resource.CheckResponse(nil), + }, + + { + description: "check returns versions from a PR with multiple state filters", + source: resource.Source{ + Repository: "itsdalmo/test-repository", + AccessToken: "oauthtoken", + States: []githubv4.PullRequestState{githubv4.PullRequestStateClosed, githubv4.PullRequestStateMerged}, + }, + version: resource.NewVersion(testPullRequests[11]), + pullRequests: testPullRequests, + files: [][]string{}, + expected: resource.CheckResponse{ + resource.NewVersion(testPullRequests[10]), + resource.NewVersion(testPullRequests[9]), + }, + }, } for _, tc := range tests { diff --git a/github.go b/github.go index fbbe4734..33372ccc 100644 --- a/github.go +++ b/github.go @@ -136,7 +136,7 @@ func (m *GithubClient) ListOpenPullRequests() ([]*PullRequest, error) { "repositoryOwner": githubv4.String(m.Owner), "repositoryName": githubv4.String(m.Repository), "prFirst": githubv4.Int(100), - "prStates": []githubv4.PullRequestState{githubv4.PullRequestStateOpen}, + "prStates": []githubv4.PullRequestState{githubv4.PullRequestStateOpen, githubv4.PullRequestStateClosed, githubv4.PullRequestStateMerged}, "prCursor": (*githubv4.String)(nil), "commitsLast": githubv4.Int(1), "prReviewStates": []githubv4.PullRequestReviewState{githubv4.PullRequestReviewStateApproved}, diff --git a/in.go b/in.go index cfde7e8d..fa0eb242 100644 --- a/in.go +++ b/in.go @@ -51,6 +51,7 @@ func Get(request GetRequest, github Github, git Git, outputDir string) (*GetResp metadata.Add("message", pull.Tip.Message) metadata.Add("author", pull.Tip.Author.User.Login) metadata.Add("author_email", pull.Tip.Author.Email) + metadata.Add("state", string(pull.State)) // Write version and metadata for reuse in PUT path := filepath.Join(outputDir, ".git", "resource") diff --git a/in_test.go b/in_test.go index 3ac8360e..a335421b 100644 --- a/in_test.go +++ b/in_test.go @@ -41,9 +41,9 @@ func TestGet(t *testing.T) { ApprovedReviewCount: "0", }, parameters: resource.GetParameters{}, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, - 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"}]`, + 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"}]`, }, { description: "get supports unlocking with git crypt", @@ -59,9 +59,9 @@ func TestGet(t *testing.T) { ApprovedReviewCount: "0", }, parameters: resource.GetParameters{}, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, - 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"}]`, + 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"}]`, }, { description: "get supports rebasing", @@ -78,9 +78,9 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{ IntegrationTool: "rebase", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, - 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"}]`, + 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"}]`, }, { description: "get supports checkout", @@ -97,9 +97,9 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{ IntegrationTool: "checkout", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, - 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"}]`, + 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"}]`, }, { description: "get supports git_depth", @@ -116,9 +116,9 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{ GitDepth: 2, }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, - 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"}]`, + 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"}]`, }, { description: "get supports list_changed_files", @@ -135,7 +135,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{ ListChangedFiles: true, }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), files: []resource.ChangedFileObject{ { Path: "README.md", @@ -145,7 +145,7 @@ func TestGet(t *testing.T) { }, }, versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, - 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"}]`, + 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"}]`, filesString: "README.md\nOther.md\n", }, } @@ -319,6 +319,7 @@ func createTestPR( isCrossRepo bool, approvedReviews int, labels []string, + state githubv4.PullRequestState, ) *resource.PullRequest { n := strconv.Itoa(count) d := time.Now().AddDate(0, 0, -count) @@ -349,6 +350,7 @@ func createTestPR( URL: fmt.Sprintf("repo%s url", n), }, IsCrossRepository: isCrossRepo, + State: state, }, Tip: resource.CommitObject{ ID: fmt.Sprintf("commit%s", n), diff --git a/models.go b/models.go index a252cd4e..b7ddb1cd 100644 --- a/models.go +++ b/models.go @@ -2,6 +2,7 @@ package resource import ( "errors" + "fmt" "strconv" "time" @@ -10,20 +11,21 @@ import ( // Source represents the configuration for the resource. type Source struct { - Repository string `json:"repository"` - AccessToken string `json:"access_token"` - V3Endpoint string `json:"v3_endpoint"` - V4Endpoint string `json:"v4_endpoint"` - Paths []string `json:"paths"` - IgnorePaths []string `json:"ignore_paths"` - DisableCISkip bool `json:"disable_ci_skip"` - DisableGitLFS bool `json:"disable_git_lfs"` - SkipSSLVerification bool `json:"skip_ssl_verification"` - DisableForks bool `json:"disable_forks"` - GitCryptKey string `json:"git_crypt_key"` - BaseBranch string `json:"base_branch"` - RequiredReviewApprovals int `json:"required_review_approvals"` - Labels []string `json:"labels"` + Repository string `json:"repository"` + AccessToken string `json:"access_token"` + V3Endpoint string `json:"v3_endpoint"` + V4Endpoint string `json:"v4_endpoint"` + Paths []string `json:"paths"` + IgnorePaths []string `json:"ignore_paths"` + DisableCISkip bool `json:"disable_ci_skip"` + DisableGitLFS bool `json:"disable_git_lfs"` + SkipSSLVerification bool `json:"skip_ssl_verification"` + DisableForks bool `json:"disable_forks"` + GitCryptKey string `json:"git_crypt_key"` + BaseBranch string `json:"base_branch"` + RequiredReviewApprovals int `json:"required_review_approvals"` + Labels []string `json:"labels"` + States []githubv4.PullRequestState `json:"states"` } // Validate the source configuration. @@ -40,6 +42,18 @@ func (s *Source) Validate() error { if s.V4Endpoint != "" && s.V3Endpoint == "" { return errors.New("v3_endpoint must be set together with v4_endpoint") } + for _, state := range s.States { + switch state { + case githubv4.PullRequestStateOpen: + case githubv4.PullRequestStateClosed: + case githubv4.PullRequestStateMerged: + default: + return errors.New(fmt.Sprintf("states value \"%s\" must be one of: OPEN, MERGED, CLOSED", state)) + } + } + if len(s.States) == 0 { + s.States = []githubv4.PullRequestState{githubv4.PullRequestStateOpen} + } return nil } @@ -96,6 +110,7 @@ type PullRequestObject struct { URL string } IsCrossRepository bool + State githubv4.PullRequestState } // CommitObject represents the GraphQL commit node. diff --git a/out_test.go b/out_test.go index b1fe56d7..79009881 100644 --- a/out_test.go +++ b/out_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + "github.com/shurcooL/githubv4" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" resource "github.com/telia-oss/github-pr-resource" @@ -33,7 +34,7 @@ func TestPut(t *testing.T) { CommittedDate: time.Time{}, }, parameters: resource.PutParameters{}, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, { @@ -50,7 +51,7 @@ func TestPut(t *testing.T) { parameters: resource.PutParameters{ Status: "success", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, { @@ -68,7 +69,7 @@ func TestPut(t *testing.T) { Status: "failure", Context: "build", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, { @@ -87,7 +88,7 @@ func TestPut(t *testing.T) { BaseContext: "concourse-ci-custom", Context: "build", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, { @@ -105,7 +106,7 @@ func TestPut(t *testing.T) { Status: "failure", TargetURL: "https://targeturl.com/concourse", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, { @@ -123,7 +124,7 @@ func TestPut(t *testing.T) { Status: "failure", Description: "Concourse CI build", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, { @@ -140,7 +141,7 @@ func TestPut(t *testing.T) { parameters: resource.PutParameters{ Comment: "comment", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, { @@ -157,7 +158,7 @@ func TestPut(t *testing.T) { parameters: resource.PutParameters{ DeletePreviousComments: true, }, - pullRequest: createTestPR(1, "master", false, false, 0, []string{}), + pullRequest: createTestPR(1, "master", false, false, 0, []string{}, githubv4.PullRequestStateOpen), }, } @@ -250,7 +251,7 @@ func TestVariableSubstitution(t *testing.T) { Comment: fmt.Sprintf("$%s", variableName), }, expectedComment: variableValue, - pullRequest: createTestPR(1, "master", false, false, 0, nil), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, { @@ -269,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), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, { @@ -287,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), + pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), }, } From c1d2f9472c3447889d38423a268effe14e32ac96 Mon Sep 17 00:00:00 2001 From: Anshul Sirur Date: Thu, 15 Oct 2020 14:45:17 +0200 Subject: [PATCH 31/36] Add PR state to resource version --- in_test.go | 18 ++++++++++++------ models.go | 10 ++++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/in_test.go b/in_test.go index a335421b..3f595ee7 100644 --- a/in_test.go +++ b/in_test.go @@ -39,10 +39,11 @@ func TestGet(t *testing.T) { Commit: "commit1", CommittedDate: time.Time{}, ApprovedReviewCount: "0", + State: githubv4.PullRequestStateOpen, }, parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, + 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, { @@ -57,10 +58,11 @@ func TestGet(t *testing.T) { Commit: "commit1", CommittedDate: time.Time{}, ApprovedReviewCount: "0", + State: githubv4.PullRequestStateOpen, }, parameters: resource.GetParameters{}, pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, + 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, { @@ -74,12 +76,13 @@ func TestGet(t *testing.T) { Commit: "commit1", CommittedDate: time.Time{}, ApprovedReviewCount: "0", + State: githubv4.PullRequestStateOpen, }, parameters: resource.GetParameters{ IntegrationTool: "rebase", }, pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, + 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, { @@ -93,12 +96,13 @@ func TestGet(t *testing.T) { Commit: "commit1", CommittedDate: time.Time{}, ApprovedReviewCount: "0", + State: githubv4.PullRequestStateOpen, }, parameters: resource.GetParameters{ IntegrationTool: "checkout", }, pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, + 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, { @@ -112,12 +116,13 @@ func TestGet(t *testing.T) { Commit: "commit1", CommittedDate: time.Time{}, ApprovedReviewCount: "0", + State: githubv4.PullRequestStateOpen, }, parameters: resource.GetParameters{ GitDepth: 2, }, pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, + 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, { @@ -131,6 +136,7 @@ func TestGet(t *testing.T) { Commit: "commit1", CommittedDate: time.Time{}, ApprovedReviewCount: "0", + State: githubv4.PullRequestStateOpen, }, parameters: resource.GetParameters{ ListChangedFiles: true, @@ -144,7 +150,7 @@ func TestGet(t *testing.T) { Path: "Other.md", }, }, - versionString: `{"pr":"pr1","commit":"commit1","committed":"0001-01-01T00:00:00Z","approved_review_count":"0"}`, + 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, filesString: "README.md\nOther.md\n", }, diff --git a/models.go b/models.go index b7ddb1cd..2fafbfa3 100644 --- a/models.go +++ b/models.go @@ -73,10 +73,11 @@ type MetadataField struct { // Version communicated with Concourse. type Version struct { - PR string `json:"pr"` - Commit string `json:"commit"` - CommittedDate time.Time `json:"committed,omitempty"` - ApprovedReviewCount string `json:"approved_review_count"` + PR string `json:"pr"` + Commit string `json:"commit"` + CommittedDate time.Time `json:"committed,omitempty"` + ApprovedReviewCount string `json:"approved_review_count"` + State githubv4.PullRequestState `json:"state"` } // NewVersion constructs a new Version. @@ -86,6 +87,7 @@ func NewVersion(p *PullRequest) Version { Commit: p.Tip.OID, CommittedDate: p.Tip.CommittedDate.Time, ApprovedReviewCount: strconv.Itoa(p.ApprovedReviewCount), + State: p.State, } } From 2e9461aa589676ef9700679085e9b816c168f187 Mon Sep 17 00:00:00 2001 From: Anshul Sirur Date: Thu, 15 Oct 2020 16:50:13 +0200 Subject: [PATCH 32/36] Use closedAt and mergedAt when comparing version timestamps When we're considering PRs in the closed or merged state, we need to use their closedAt or mergedAt timestamps to check how recent the version is. This is because PRs will not necessarily be closed or merged in the same order their commits have been made. --- check.go | 32 +++++++++++++++++++------------- check_test.go | 2 +- in_test.go | 2 ++ models.go | 20 ++++++++++++++++---- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/check.go b/check.go index 34fb58a3..a0100bf3 100644 --- a/check.go +++ b/check.go @@ -6,6 +6,8 @@ import ( "regexp" "sort" "strings" + + "github.com/shurcooL/githubv4" ) // Check (business logic) @@ -25,33 +27,37 @@ Loop: if !disableSkipCI && ContainsSkipCI(p.Title) { continue } + // [ci skip]/[skip ci] in Commit message if !disableSkipCI && ContainsSkipCI(p.Tip.Message) { continue } + // Filter pull request if the BaseBranch does not match the one specified in source if request.Source.BaseBranch != "" && p.PullRequestObject.BaseRefName != request.Source.BaseBranch { continue } - // Filter out commits that are too old. - if !p.Tip.CommittedDate.Time.After(request.Version.CommittedDate) { - continue - } // Filter out pull request if it does not have a filtered state + filterStates := []githubv4.PullRequestState{githubv4.PullRequestStateOpen} if len(request.Source.States) > 0 { - stateFound := false + filterStates = request.Source.States + } - for _, state := range request.Source.States { - if p.State == state { - stateFound = true - break - } + stateFound := false + for _, state := range filterStates { + if p.State == state { + stateFound = true + break } + } + if !stateFound { + continue + } - if !stateFound { - continue - } + // Filter out commits that are too old. + if !p.UpdatedDate().Time.After(request.Version.CommittedDate) { + continue } // Filter out pull request if it does not contain at least one of the desired labels diff --git a/check_test.go b/check_test.go index 86fabf66..fd88bae1 100644 --- a/check_test.go +++ b/check_test.go @@ -229,8 +229,8 @@ func TestCheck(t *testing.T) { pullRequests: testPullRequests, files: [][]string{}, expected: resource.CheckResponse{ - resource.NewVersion(testPullRequests[10]), resource.NewVersion(testPullRequests[9]), + resource.NewVersion(testPullRequests[10]), }, }, } diff --git a/in_test.go b/in_test.go index 3f595ee7..0d328600 100644 --- a/in_test.go +++ b/in_test.go @@ -357,6 +357,8 @@ func createTestPR( }, IsCrossRepository: isCrossRepo, State: state, + ClosedAt: githubv4.DateTime{Time: time.Now()}, + MergedAt: githubv4.DateTime{Time: time.Now()}, }, Tip: resource.CommitObject{ ID: fmt.Sprintf("commit%s", n), diff --git a/models.go b/models.go index 2fafbfa3..30c08b7b 100644 --- a/models.go +++ b/models.go @@ -51,9 +51,6 @@ func (s *Source) Validate() error { return errors.New(fmt.Sprintf("states value \"%s\" must be one of: OPEN, MERGED, CLOSED", state)) } } - if len(s.States) == 0 { - s.States = []githubv4.PullRequestState{githubv4.PullRequestStateOpen} - } return nil } @@ -85,7 +82,7 @@ func NewVersion(p *PullRequest) Version { return Version{ PR: strconv.Itoa(p.Number), Commit: p.Tip.OID, - CommittedDate: p.Tip.CommittedDate.Time, + CommittedDate: p.UpdatedDate().Time, ApprovedReviewCount: strconv.Itoa(p.ApprovedReviewCount), State: p.State, } @@ -113,6 +110,21 @@ type PullRequestObject struct { } IsCrossRepository bool State githubv4.PullRequestState + ClosedAt githubv4.DateTime + MergedAt githubv4.DateTime +} + +// UpdatedDate returns the last time a PR was updated, either by commit +// or being closed/merged. +func (p *PullRequest) UpdatedDate() githubv4.DateTime { + date := p.Tip.CommittedDate + switch p.State { + case githubv4.PullRequestStateClosed: + date = p.ClosedAt + case githubv4.PullRequestStateMerged: + date = p.MergedAt + } + return date } // CommitObject represents the GraphQL commit node. From 60e7a0cc1300230926383fd56613133f036fd96d Mon Sep 17 00:00:00 2001 From: Maria Shaldybin Date: Tue, 20 Oct 2020 13:59:13 -0700 Subject: [PATCH 33/36] Add ignore_drafts option to skip draft pull requests (#225) Co-authored-by: Gary Liu Co-authored-by: Maria Shaldybin [#174851535] Update TAS4K8s TKGi pipeline to use Nimbus (Toolsmith deprecating Nov 1st) Co-authored-by: Gary Liu --- README.md | 1 + check.go | 5 +++++ check_test.go | 53 +++++++++++++++++++++++++++++++++++++++------------ in_test.go | 14 ++++++++------ models.go | 2 ++ out_test.go | 22 ++++++++++----------- 6 files changed, 68 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index e2c6e226..d46077ff 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ Make sure to check out [#migrating](#migrating) to learn more. | `disable_ci_skip` | No | `true` | Disable ability to skip builds with `[ci skip]` and `[skip ci]` in commit message or pull request title. | | `skip_ssl_verification` | No | `true` | Disable SSL/TLS certificate validation on git and API clients. Use with care! | | `disable_forks` | No | `true` | Disable triggering of the resource if the pull request's fork repository is different to the configured repository. | +| `ignore_drafts` | No | `false` | Disable triggering of the resource if the pull request is in Draft status. | | `required_review_approvals` | No | `2` | Disable triggering of the resource if the pull request does not have at least `X` approved review(s). | | `git_crypt_key` | No | `AEdJVENSWVBUS0VZAAAAA...` | Base64 encoded git-crypt key. Setting this will unlock / decrypt the repository with git-crypt. To get the key simply execute `git-crypt export-key -- - | base64` in an encrypted repository. | | `base_branch` | No | `master` | Name of a branch. The pipeline will only trigger on pull requests against the specified branch. | diff --git a/check.go b/check.go index a0100bf3..445f6de4 100644 --- a/check.go +++ b/check.go @@ -84,6 +84,11 @@ Loop: continue } + // Filter out drafts. + if request.Source.IgnoreDrafts && p.IsDraft { + continue + } + // Filter pull request if it does not have the required number of approved review(s). if p.ApprovedReviewCount < request.Source.RequiredReviewApprovals { continue diff --git a/check_test.go b/check_test.go index fd88bae1..3bf35c46 100644 --- a/check_test.go +++ b/check_test.go @@ -11,18 +11,18 @@ import ( var ( testPullRequests = []*resource.PullRequest{ - createTestPR(1, "master", true, false, 0, nil, githubv4.PullRequestStateOpen), - createTestPR(2, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - createTestPR(3, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - createTestPR(4, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - createTestPR(5, "master", false, true, 0, nil, githubv4.PullRequestStateOpen), - createTestPR(6, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - createTestPR(7, "develop", false, false, 0, []string{"enhancement"}, githubv4.PullRequestStateOpen), - createTestPR(8, "master", false, false, 1, []string{"wontfix"}, githubv4.PullRequestStateOpen), - createTestPR(9, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), - createTestPR(10, "master", false, false, 0, nil, githubv4.PullRequestStateClosed), - createTestPR(11, "master", false, false, 0, nil, githubv4.PullRequestStateMerged), - createTestPR(12, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + 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), } ) @@ -130,6 +130,35 @@ func TestCheck(t *testing.T) { }, }, + { + description: "check correctly ignores drafts when drafts are ignored", + source: resource.Source{ + Repository: "itsdalmo/test-repository", + AccessToken: "oauthtoken", + IgnoreDrafts: true, + }, + version: resource.NewVersion(testPullRequests[3]), + pullRequests: testPullRequests, + expected: resource.CheckResponse{ + resource.NewVersion(testPullRequests[1]), + }, + }, + + { + description: "check does not ignore drafts when drafts are not ignored", + source: resource.Source{ + Repository: "itsdalmo/test-repository", + AccessToken: "oauthtoken", + IgnoreDrafts: false, + }, + version: resource.NewVersion(testPullRequests[3]), + pullRequests: testPullRequests, + expected: resource.CheckResponse{ + resource.NewVersion(testPullRequests[2]), + resource.NewVersion(testPullRequests[1]), + }, + }, + { description: "check correctly ignores cross repo pull requests", source: resource.Source{ diff --git a/in_test.go b/in_test.go index 0d328600..17e7abfc 100644 --- a/in_test.go +++ b/in_test.go @@ -42,7 +42,7 @@ func TestGet(t *testing.T) { State: githubv4.PullRequestStateOpen, }, parameters: resource.GetParameters{}, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, @@ -61,7 +61,7 @@ func TestGet(t *testing.T) { State: githubv4.PullRequestStateOpen, }, parameters: resource.GetParameters{}, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, @@ -81,7 +81,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{ IntegrationTool: "rebase", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, @@ -101,7 +101,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{ IntegrationTool: "checkout", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, @@ -121,7 +121,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{ GitDepth: 2, }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), 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":"user@example.com"},{"name":"state","value":"OPEN"}]`, }, @@ -141,7 +141,7 @@ func TestGet(t *testing.T) { parameters: resource.GetParameters{ ListChangedFiles: true, }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), files: []resource.ChangedFileObject{ { Path: "README.md", @@ -325,6 +325,7 @@ func createTestPR( isCrossRepo bool, approvedReviews int, labels []string, + isDraft bool, state githubv4.PullRequestState, ) *resource.PullRequest { n := strconv.Itoa(count) @@ -356,6 +357,7 @@ func createTestPR( URL: fmt.Sprintf("repo%s url", n), }, IsCrossRepository: isCrossRepo, + IsDraft: isDraft, State: state, ClosedAt: githubv4.DateTime{Time: time.Now()}, MergedAt: githubv4.DateTime{Time: time.Now()}, diff --git a/models.go b/models.go index 30c08b7b..9e4e7b1c 100644 --- a/models.go +++ b/models.go @@ -21,6 +21,7 @@ type Source struct { DisableGitLFS bool `json:"disable_git_lfs"` SkipSSLVerification bool `json:"skip_ssl_verification"` DisableForks bool `json:"disable_forks"` + IgnoreDrafts bool `json:"ignore_drafts"` GitCryptKey string `json:"git_crypt_key"` BaseBranch string `json:"base_branch"` RequiredReviewApprovals int `json:"required_review_approvals"` @@ -109,6 +110,7 @@ type PullRequestObject struct { URL string } IsCrossRepository bool + IsDraft bool State githubv4.PullRequestState ClosedAt githubv4.DateTime MergedAt githubv4.DateTime diff --git a/out_test.go b/out_test.go index 79009881..4d430c7b 100644 --- a/out_test.go +++ b/out_test.go @@ -34,7 +34,7 @@ func TestPut(t *testing.T) { CommittedDate: time.Time{}, }, parameters: resource.PutParameters{}, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, { @@ -51,7 +51,7 @@ func TestPut(t *testing.T) { parameters: resource.PutParameters{ Status: "success", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, { @@ -69,7 +69,7 @@ func TestPut(t *testing.T) { Status: "failure", Context: "build", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, { @@ -88,7 +88,7 @@ func TestPut(t *testing.T) { BaseContext: "concourse-ci-custom", Context: "build", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, { @@ -106,7 +106,7 @@ func TestPut(t *testing.T) { Status: "failure", TargetURL: "https://targeturl.com/concourse", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, { @@ -124,7 +124,7 @@ func TestPut(t *testing.T) { Status: "failure", Description: "Concourse CI build", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, { @@ -141,7 +141,7 @@ func TestPut(t *testing.T) { parameters: resource.PutParameters{ Comment: "comment", }, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, { @@ -158,7 +158,7 @@ func TestPut(t *testing.T) { parameters: resource.PutParameters{ DeletePreviousComments: true, }, - pullRequest: createTestPR(1, "master", false, false, 0, []string{}, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, []string{}, false, githubv4.PullRequestStateOpen), }, } @@ -251,7 +251,7 @@ func TestVariableSubstitution(t *testing.T) { Comment: fmt.Sprintf("$%s", variableName), }, expectedComment: variableValue, - pullRequest: createTestPR(1, "master", false, false, 0, nil, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, { @@ -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, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, { @@ -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, githubv4.PullRequestStateOpen), + pullRequest: createTestPR(1, "master", false, false, 0, nil, false, githubv4.PullRequestStateOpen), }, } From 99cb3eeba45993577744792dd151eea31b08770c Mon Sep 17 00:00:00 2001 From: Matthew Burgess <549318+mattburgess@users.noreply.github.com> Date: Wed, 21 Oct 2020 22:08:03 +0100 Subject: [PATCH 34/36] Expand Env Vars in context (#146) (#202) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expand Env Vars in context Co-authored-by: Rickard Löfström --- out.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/out.go b/out.go index bf2f3166..cd6245c9 100644 --- a/out.go +++ b/out.go @@ -49,7 +49,7 @@ func Put(request PutRequest, manager Github, inputDir string) (*PutResponse, err description = string(content) } - if err := manager.UpdateCommitStatus(version.Commit, p.BaseContext, p.Context, p.Status, safeExpandEnv(p.TargetURL), description); err != nil { + if err := manager.UpdateCommitStatus(version.Commit, p.BaseContext, safeExpandEnv(p.Context), p.Status, safeExpandEnv(p.TargetURL), description); err != nil { return nil, fmt.Errorf("failed to set status: %s", err) } } From a98122fceb4850e5a7ec38a19cf0fa81549f3b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20L=C3=B6fstr=C3=B6m?= Date: Fri, 23 Oct 2020 22:53:21 +0200 Subject: [PATCH 35/36] Fix os.FileMode was meant to be in octal. (#236) --- git.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git.go b/git.go index 95523349..53f339d4 100644 --- a/git.go +++ b/git.go @@ -216,7 +216,7 @@ func (g *GitClient) GitCryptUnlock(base64key string) error { return fmt.Errorf("failed to decode git-crypt key") } keyPath := filepath.Join(keyDir, "git-crypt-key") - if err := ioutil.WriteFile(keyPath, decodedKey, 600); err != nil { + if err := ioutil.WriteFile(keyPath, decodedKey, os.FileMode(0600)); err != nil { return fmt.Errorf("failed to write git-crypt key to file: %s", err) } if err := g.command("git-crypt", "unlock", keyPath).Run(); err != nil { From 9ec47e2d9f28d13a4738ff48f2f40d2a570b251a Mon Sep 17 00:00:00 2001 From: Joe Hosteny Date: Sat, 6 Feb 2021 12:59:30 -0500 Subject: [PATCH 36/36] fix: filter pull requests on the server, not client (#240) * fix: filter pull requests on the server, not client Ensure that the GraphQL query requests PRs matching the desired states, rather than requesting all PRs and filtering on the client. Fixes #233 * fix: ensure function name reflects implementation * fix: add missing fake --- check.go | 25 ++++--------- check_test.go | 17 ++++++++- fakes/fake_github.go | 89 ++++++++++++++++++++++++++------------------ github.go | 8 ++-- 4 files changed, 78 insertions(+), 61 deletions(-) diff --git a/check.go b/check.go index 445f6de4..64df9e24 100644 --- a/check.go +++ b/check.go @@ -14,7 +14,13 @@ import ( func Check(request CheckRequest, manager Github) (CheckResponse, error) { var response CheckResponse - pulls, err := manager.ListOpenPullRequests() + // Filter out pull request if it does not have a filtered state + filterStates := []githubv4.PullRequestState{githubv4.PullRequestStateOpen} + if len(request.Source.States) > 0 { + filterStates = request.Source.States + } + + pulls, err := manager.ListPullRequests(filterStates) if err != nil { return nil, fmt.Errorf("failed to get last commits: %s", err) } @@ -38,23 +44,6 @@ Loop: continue } - // Filter out pull request if it does not have a filtered state - filterStates := []githubv4.PullRequestState{githubv4.PullRequestStateOpen} - if len(request.Source.States) > 0 { - filterStates = request.Source.States - } - - stateFound := false - for _, state := range filterStates { - if p.State == state { - stateFound = true - break - } - } - if !stateFound { - continue - } - // Filter out commits that are too old. if !p.UpdatedDate().Time.After(request.Version.CommittedDate) { continue diff --git a/check_test.go b/check_test.go index 3bf35c46..8c422914 100644 --- a/check_test.go +++ b/check_test.go @@ -267,7 +267,20 @@ func TestCheck(t *testing.T) { for _, tc := range tests { t.Run(tc.description, func(t *testing.T) { github := new(fakes.FakeGithub) - github.ListOpenPullRequestsReturns(tc.pullRequests, nil) + pullRequests := []*resource.PullRequest{} + filterStates := []githubv4.PullRequestState{githubv4.PullRequestStateOpen} + if len(tc.source.States) > 0 { + filterStates = tc.source.States + } + for i := range tc.pullRequests { + for j := range filterStates { + if filterStates[j] == tc.pullRequests[i].PullRequestObject.State { + pullRequests = append(pullRequests, tc.pullRequests[i]) + break + } + } + } + github.ListPullRequestsReturns(pullRequests, nil) for i, file := range tc.files { github.ListModifiedFilesReturnsOnCall(i, file, nil) @@ -279,7 +292,7 @@ func TestCheck(t *testing.T) { if assert.NoError(t, err) { assert.Equal(t, tc.expected, output) } - assert.Equal(t, 1, github.ListOpenPullRequestsCallCount()) + assert.Equal(t, 1, github.ListPullRequestsCallCount()) }) } } diff --git a/fakes/fake_github.go b/fakes/fake_github.go index ac8242a6..1847478f 100644 --- a/fakes/fake_github.go +++ b/fakes/fake_github.go @@ -4,6 +4,7 @@ package fakes import ( "sync" + "github.com/shurcooL/githubv4" resource "github.com/telia-oss/github-pr-resource" ) @@ -60,15 +61,16 @@ type FakeGithub struct { result1 []string result2 error } - ListOpenPullRequestsStub func() ([]*resource.PullRequest, error) - listOpenPullRequestsMutex sync.RWMutex - listOpenPullRequestsArgsForCall []struct { + ListPullRequestsStub func([]githubv4.PullRequestState) ([]*resource.PullRequest, error) + listPullRequestsMutex sync.RWMutex + listPullRequestsArgsForCall []struct { + arg1 []githubv4.PullRequestState } - listOpenPullRequestsReturns struct { + listPullRequestsReturns struct { result1 []*resource.PullRequest result2 error } - listOpenPullRequestsReturnsOnCall map[int]struct { + listPullRequestsReturnsOnCall map[int]struct { result1 []*resource.PullRequest result2 error } @@ -355,56 +357,69 @@ func (fake *FakeGithub) ListModifiedFilesReturnsOnCall(i int, result1 []string, }{result1, result2} } -func (fake *FakeGithub) ListOpenPullRequests() ([]*resource.PullRequest, error) { - fake.listOpenPullRequestsMutex.Lock() - ret, specificReturn := fake.listOpenPullRequestsReturnsOnCall[len(fake.listOpenPullRequestsArgsForCall)] - fake.listOpenPullRequestsArgsForCall = append(fake.listOpenPullRequestsArgsForCall, struct { - }{}) - fake.recordInvocation("ListOpenPullRequests", []interface{}{}) - fake.listOpenPullRequestsMutex.Unlock() - if fake.ListOpenPullRequestsStub != nil { - return fake.ListOpenPullRequestsStub() +func (fake *FakeGithub) ListPullRequests(arg1 []githubv4.PullRequestState) ([]*resource.PullRequest, error) { + var arg1Copy []githubv4.PullRequestState + if arg1 != nil { + arg1Copy = make([]githubv4.PullRequestState, len(arg1)) + copy(arg1Copy, arg1) + } + fake.listPullRequestsMutex.Lock() + ret, specificReturn := fake.listPullRequestsReturnsOnCall[len(fake.listPullRequestsArgsForCall)] + fake.listPullRequestsArgsForCall = append(fake.listPullRequestsArgsForCall, struct { + arg1 []githubv4.PullRequestState + }{arg1Copy}) + fake.recordInvocation("ListPullRequests", []interface{}{arg1Copy}) + fake.listPullRequestsMutex.Unlock() + if fake.ListPullRequestsStub != nil { + return fake.ListPullRequestsStub(arg1) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.listOpenPullRequestsReturns + fakeReturns := fake.listPullRequestsReturns return fakeReturns.result1, fakeReturns.result2 } -func (fake *FakeGithub) ListOpenPullRequestsCallCount() int { - fake.listOpenPullRequestsMutex.RLock() - defer fake.listOpenPullRequestsMutex.RUnlock() - return len(fake.listOpenPullRequestsArgsForCall) +func (fake *FakeGithub) ListPullRequestsCallCount() int { + fake.listPullRequestsMutex.RLock() + defer fake.listPullRequestsMutex.RUnlock() + return len(fake.listPullRequestsArgsForCall) +} + +func (fake *FakeGithub) ListPullRequestsCalls(stub func([]githubv4.PullRequestState) ([]*resource.PullRequest, error)) { + fake.listPullRequestsMutex.Lock() + defer fake.listPullRequestsMutex.Unlock() + fake.ListPullRequestsStub = stub } -func (fake *FakeGithub) ListOpenPullRequestsCalls(stub func() ([]*resource.PullRequest, error)) { - fake.listOpenPullRequestsMutex.Lock() - defer fake.listOpenPullRequestsMutex.Unlock() - fake.ListOpenPullRequestsStub = stub +func (fake *FakeGithub) ListPullRequestsArgsForCall(i int) []githubv4.PullRequestState { + fake.listPullRequestsMutex.RLock() + defer fake.listPullRequestsMutex.RUnlock() + argsForCall := fake.listPullRequestsArgsForCall[i] + return argsForCall.arg1 } -func (fake *FakeGithub) ListOpenPullRequestsReturns(result1 []*resource.PullRequest, result2 error) { - fake.listOpenPullRequestsMutex.Lock() - defer fake.listOpenPullRequestsMutex.Unlock() - fake.ListOpenPullRequestsStub = nil - fake.listOpenPullRequestsReturns = struct { +func (fake *FakeGithub) ListPullRequestsReturns(result1 []*resource.PullRequest, result2 error) { + fake.listPullRequestsMutex.Lock() + defer fake.listPullRequestsMutex.Unlock() + fake.ListPullRequestsStub = nil + fake.listPullRequestsReturns = struct { result1 []*resource.PullRequest result2 error }{result1, result2} } -func (fake *FakeGithub) ListOpenPullRequestsReturnsOnCall(i int, result1 []*resource.PullRequest, result2 error) { - fake.listOpenPullRequestsMutex.Lock() - defer fake.listOpenPullRequestsMutex.Unlock() - fake.ListOpenPullRequestsStub = nil - if fake.listOpenPullRequestsReturnsOnCall == nil { - fake.listOpenPullRequestsReturnsOnCall = make(map[int]struct { +func (fake *FakeGithub) ListPullRequestsReturnsOnCall(i int, result1 []*resource.PullRequest, result2 error) { + fake.listPullRequestsMutex.Lock() + defer fake.listPullRequestsMutex.Unlock() + fake.ListPullRequestsStub = nil + if fake.listPullRequestsReturnsOnCall == nil { + fake.listPullRequestsReturnsOnCall = make(map[int]struct { result1 []*resource.PullRequest result2 error }) } - fake.listOpenPullRequestsReturnsOnCall[i] = struct { + fake.listPullRequestsReturnsOnCall[i] = struct { result1 []*resource.PullRequest result2 error }{result1, result2} @@ -547,8 +562,8 @@ func (fake *FakeGithub) Invocations() map[string][][]interface{} { defer fake.getPullRequestMutex.RUnlock() fake.listModifiedFilesMutex.RLock() defer fake.listModifiedFilesMutex.RUnlock() - fake.listOpenPullRequestsMutex.RLock() - defer fake.listOpenPullRequestsMutex.RUnlock() + fake.listPullRequestsMutex.RLock() + defer fake.listPullRequestsMutex.RUnlock() fake.postCommentMutex.RLock() defer fake.postCommentMutex.RUnlock() fake.updateCommitStatusMutex.RLock() diff --git a/github.go b/github.go index 33372ccc..ab10cbdc 100644 --- a/github.go +++ b/github.go @@ -20,7 +20,7 @@ import ( // Github for testing purposes. //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_github.go . Github type Github interface { - ListOpenPullRequests() ([]*PullRequest, error) + ListPullRequests([]githubv4.PullRequestState) ([]*PullRequest, error) ListModifiedFiles(int) ([]string, error) PostComment(string, string) error GetPullRequest(string, string) (*PullRequest, error) @@ -97,8 +97,8 @@ func NewGithubClient(s *Source) (*GithubClient, error) { }, nil } -// ListOpenPullRequests gets the last commit on all open pull requests. -func (m *GithubClient) ListOpenPullRequests() ([]*PullRequest, error) { +// ListPullRequests gets the last commit on all pull requests with the matching state. +func (m *GithubClient) ListPullRequests(prStates []githubv4.PullRequestState) ([]*PullRequest, error) { var query struct { Repository struct { PullRequests struct { @@ -136,7 +136,7 @@ func (m *GithubClient) ListOpenPullRequests() ([]*PullRequest, error) { "repositoryOwner": githubv4.String(m.Owner), "repositoryName": githubv4.String(m.Repository), "prFirst": githubv4.Int(100), - "prStates": []githubv4.PullRequestState{githubv4.PullRequestStateOpen, githubv4.PullRequestStateClosed, githubv4.PullRequestStateMerged}, + "prStates": prStates, "prCursor": (*githubv4.String)(nil), "commitsLast": githubv4.Int(1), "prReviewStates": []githubv4.PullRequestReviewState{githubv4.PullRequestReviewStateApproved},