Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ Fetches and creates versioned GitHub resources.

* `github_api_url`: *Optional.* If you use a non-public GitHub deployment then
you can set your API URL here.

* `github_v4_api_url`: *Optional.* If you use a non-public GitHub deployment then
you can set your API URL for graphql calls here.

* `github_uploads_url`: *Optional.* Some GitHub instances have a separate URL
for uploading. If `github_api_url` is set, this value defaults to the same
Expand Down Expand Up @@ -176,11 +179,10 @@ prepended with this string. This is useful for adding v in front of version numb

### Prerequisites

* golang is *required* - version 1.9.x is tested; earlier versions may also
* golang is *required* - version 1.15.x is tested; earlier versions may also
work.
* docker is *required* - version 17.06.x is tested; earlier versions may also
work.
* godep is used for dependency management of the golang packages.
Comment thread
kirillbilchenko marked this conversation as resolved.

### Running the tests

Expand Down
2 changes: 1 addition & 1 deletion check_command.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package resource

import (
"github.com/cppforlife/go-semi-semantic/version"
"github.com/google/go-github/github"
"github.com/google/go-github/v32/github"
"sort"
)

Expand Down
2 changes: 1 addition & 1 deletion check_command_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"

"github.com/google/go-github/github"
"github.com/google/go-github/v32/github"

"github.com/concourse/github-release-resource"
"github.com/concourse/github-release-resource/fakes"
Expand Down
2 changes: 1 addition & 1 deletion fakes/fake_git_hub.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 25 additions & 8 deletions github.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ import (
"net/http"
"net/url"
"os"
"strings"

"github.com/google/go-github/v32/github"
"github.com/shurcooL/githubv4"
"golang.org/x/oauth2"

"github.com/google/go-github/github"
)

// Last run with counterfeiter v6
Expand All @@ -36,7 +37,8 @@ type GitHub interface {
}

type GitHubClient struct {
client *github.Client
client *github.Client
clientV4 *githubv4.Client

owner string
repository string
Expand Down Expand Up @@ -65,8 +67,13 @@ func NewGitHubClient(source Source) (*GitHubClient, error) {

client := github.NewClient(httpClient)

clientV4 := githubv4.NewClient(httpClient)

if source.GitHubAPIURL != "" {
var err error
if !strings.HasSuffix(source.GitHubAPIURL, "/") {
source.GitHubAPIURL += "/"
}
client.BaseURL, err = url.Parse(source.GitHubAPIURL)
if err != nil {
return nil, err
Expand All @@ -76,6 +83,12 @@ func NewGitHubClient(source Source) (*GitHubClient, error) {
if err != nil {
return nil, err
}

clientV4 = githubv4.NewEnterpriseClient(source.GitHubAPIURL+"graphql", httpClient)
}

if source.GitHubV4APIURL != "" {
Comment thread
kirillbilchenko marked this conversation as resolved.
clientV4 = githubv4.NewEnterpriseClient(source.GitHubV4APIURL, httpClient)
}

if source.GitHubUploadsURL != "" {
Expand All @@ -93,13 +106,17 @@ func NewGitHubClient(source Source) (*GitHubClient, error) {

return &GitHubClient{
client: client,
clientV4: clientV4,
owner: owner,
repository: source.Repository,
accessToken: source.AccessToken,
}, nil
}

func (g *GitHubClient) ListReleases() ([]*github.RepositoryRelease, error) {
Comment thread
kirillbilchenko marked this conversation as resolved.
if g.accessToken != "" {
return g.listReleasesV4()
}
opt := &github.ListOptions{PerPage: 100}
var allReleases []*github.RepositoryRelease
for {
Expand Down Expand Up @@ -136,7 +153,7 @@ func (g *GitHubClient) GetReleaseByTag(tag string) (*github.RepositoryRelease, e
}

func (g *GitHubClient) GetRelease(id int) (*github.RepositoryRelease, error) {
release, res, err := g.client.Repositories.GetRelease(context.TODO(), g.owner, g.repository, id)
release, res, err := g.client.Repositories.GetRelease(context.TODO(), g.owner, g.repository, int64(id))
if err != nil {
return &github.RepositoryRelease{}, err
}
Expand Down Expand Up @@ -224,7 +241,7 @@ func (g *GitHubClient) DeleteReleaseAsset(asset github.ReleaseAsset) error {
}

func (g *GitHubClient) DownloadReleaseAsset(asset github.ReleaseAsset) (io.ReadCloser, error) {
bodyReader, redirectURL, err := g.client.Repositories.DownloadReleaseAsset(context.TODO(), g.owner, g.repository, *asset.ID)
bodyReader, redirectURL, err := g.client.Repositories.DownloadReleaseAsset(context.TODO(), g.owner, g.repository, *asset.ID, nil)
if err != nil {
return nil, err
}
Expand All @@ -239,7 +256,7 @@ func (g *GitHubClient) DownloadReleaseAsset(asset github.ReleaseAsset) (io.ReadC
}
req.Header.Set("Accept", "application/octet-stream")
if g.accessToken != "" && req.URL.Host == g.client.BaseURL.Host {
req.Header.Set("Authorization", "Bearer " + g.accessToken)
req.Header.Set("Authorization", "Bearer "+g.accessToken)
}

httpClient := &http.Client{}
Expand All @@ -258,7 +275,7 @@ func (g *GitHubClient) DownloadReleaseAsset(asset github.ReleaseAsset) (io.ReadC

func (g *GitHubClient) GetTarballLink(tag string) (*url.URL, error) {
opt := &github.RepositoryContentGetOptions{Ref: tag}
u, res, err := g.client.Repositories.GetArchiveLink(context.TODO(), g.owner, g.repository, github.Tarball, opt)
u, res, err := g.client.Repositories.GetArchiveLink(context.TODO(), g.owner, g.repository, github.Tarball, opt, true)
if err != nil {
return nil, err
}
Expand All @@ -268,7 +285,7 @@ func (g *GitHubClient) GetTarballLink(tag string) (*url.URL, error) {

func (g *GitHubClient) GetZipballLink(tag string) (*url.URL, error) {
opt := &github.RepositoryContentGetOptions{Ref: tag}
u, res, err := g.client.Repositories.GetArchiveLink(context.TODO(), g.owner, g.repository, github.Zipball, opt)
u, res, err := g.client.Repositories.GetArchiveLink(context.TODO(), g.owner, g.repository, github.Zipball, opt, true)
if err != nil {
return nil, err
}
Expand Down
85 changes: 85 additions & 0 deletions github_graphql.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package resource

import (
"context"
"encoding/base64"
"errors"
"regexp"
"strconv"
"time"

"github.com/google/go-github/v32/github"
"github.com/shurcooL/githubv4"
)

func (g *GitHubClient) listReleasesV4() ([]*github.RepositoryRelease, error) {
if g.clientV4 == nil {
Comment thread
kirillbilchenko marked this conversation as resolved.
return nil, errors.New("github graphql is not been initialised")
}
var listReleases struct {
Repository struct {
Releases struct {
Edges []struct {
Node struct {
ReleaseObject
}
} `graphql:"edges"`
PageInfo struct {
EndCursor githubv4.String
HasNextPage bool
} `graphql:"pageInfo"`
} `graphql:"releases(first:$releasesCount, after: $releaseCursor, orderBy: {field: CREATED_AT, direction: DESC})"`
} `graphql:"repository(owner:$repositoryOwner,name:$repositoryName)"`
}

vars := map[string]interface{}{
"repositoryOwner": githubv4.String(g.owner),
"repositoryName": githubv4.String(g.repository),
"releaseCursor": (*githubv4.String)(nil),
"releasesCount": githubv4.Int(100),
}

var allReleases []*github.RepositoryRelease
for {
if err := g.clientV4.Query(context.TODO(), &listReleases, vars); err != nil {
return nil, err
}

for _, r := range listReleases.Repository.Releases.Edges {
r := r
publishedAt, _ := time.ParseInLocation(time.RFC3339, r.Node.PublishedAt.Time.Format(time.RFC3339), time.UTC)
createdAt, _ := time.ParseInLocation(time.RFC3339, r.Node.CreatedAt.Time.Format(time.RFC3339), time.UTC)
var releaseID int64
decodedID, err := base64.StdEncoding.DecodeString(r.Node.ID)
if err != nil {
return nil, err
}
re := regexp.MustCompile(`.*[^\d]`)
decodedID = re.ReplaceAll(decodedID, []byte(""))
if string(decodedID) == "" {
return nil, errors.New("bad release id from graph ql api")
}
releaseID, err = strconv.ParseInt(string(decodedID), 10, 64)
if err != nil {
return nil, err
}
allReleases = append(allReleases, &github.RepositoryRelease{
ID: &releaseID,
TagName: &r.Node.TagName,
Name: &r.Node.Name,
Prerelease: &r.Node.IsPrerelease,
Draft: &r.Node.IsDraft,
URL: &r.Node.URL,
PublishedAt: &github.Timestamp{Time: publishedAt},
CreatedAt: &github.Timestamp{Time: createdAt},
})
}

if !listReleases.Repository.Releases.PageInfo.HasNextPage {
break
}
vars["releaseCursor"] = listReleases.Repository.Releases.PageInfo.EndCursor
}

return allReleases, nil
}
Loading