Source configuration uses owner instead of user

"Owner" is the name GitHub uses in its API to reference the owner of a
repository. "User" is not correct when the owner is an organization.

This removes some confusion I've encountered over how to configure the
resource while maintaining backwards compatibility.
This commit is contained in:
Kris Hicks
2017-04-10 08:52:27 -07:00
parent 7c5e8c7b3c
commit 3b050c148c
4 changed files with 50 additions and 21 deletions

View File

@@ -7,8 +7,8 @@ Fetches and creates versioned GitHub resources.
## Source Configuration ## Source Configuration
* `user`: *Required.* The GitHub username or organization name for the * `owner`: *Required.* The GitHub user or organization name for the repository
repository that the releases are in. that the releases are in.
* `repository`: *Required.* The repository name that contains the releases. * `repository`: *Required.* The repository name that contains the releases.
@@ -45,7 +45,7 @@ Fetches and creates versioned GitHub resources.
- name: gh-release - name: gh-release
type: github-release type: github-release
source: source:
user: concourse owner: concourse
repository: concourse repository: concourse
access_token: abcdef1234567890 access_token: abcdef1234567890
``` ```

View File

@@ -33,7 +33,7 @@ type GitHub interface {
type GitHubClient struct { type GitHubClient struct {
client *github.Client client *github.Client
user string owner string
repository string repository string
} }
@@ -71,15 +71,20 @@ func NewGitHubClient(source Source) (*GitHubClient, error) {
} }
} }
owner := source.Owner
if source.User != "" {
owner = source.User
}
return &GitHubClient{ return &GitHubClient{
client: client, client: client,
user: source.User, owner: owner,
repository: source.Repository, repository: source.Repository,
}, nil }, nil
} }
func (g *GitHubClient) ListReleases() ([]*github.RepositoryRelease, error) { func (g *GitHubClient) ListReleases() ([]*github.RepositoryRelease, error) {
releases, res, err := g.client.Repositories.ListReleases(g.user, g.repository, nil) releases, res, err := g.client.Repositories.ListReleases(g.owner, g.repository, nil)
if err != nil { if err != nil {
return []*github.RepositoryRelease{}, err return []*github.RepositoryRelease{}, err
} }
@@ -93,7 +98,7 @@ func (g *GitHubClient) ListReleases() ([]*github.RepositoryRelease, error) {
} }
func (g *GitHubClient) GetReleaseByTag(tag string) (*github.RepositoryRelease, error) { func (g *GitHubClient) GetReleaseByTag(tag string) (*github.RepositoryRelease, error) {
release, res, err := g.client.Repositories.GetReleaseByTag(g.user, g.repository, tag) release, res, err := g.client.Repositories.GetReleaseByTag(g.owner, g.repository, tag)
if err != nil { if err != nil {
return &github.RepositoryRelease{}, err return &github.RepositoryRelease{}, err
} }
@@ -107,7 +112,7 @@ func (g *GitHubClient) GetReleaseByTag(tag string) (*github.RepositoryRelease, e
} }
func (g *GitHubClient) GetRelease(id int) (*github.RepositoryRelease, error) { func (g *GitHubClient) GetRelease(id int) (*github.RepositoryRelease, error) {
release, res, err := g.client.Repositories.GetRelease(g.user, g.repository, id) release, res, err := g.client.Repositories.GetRelease(g.owner, g.repository, id)
if err != nil { if err != nil {
return &github.RepositoryRelease{}, err return &github.RepositoryRelease{}, err
} }
@@ -121,7 +126,7 @@ func (g *GitHubClient) GetRelease(id int) (*github.RepositoryRelease, error) {
} }
func (g *GitHubClient) CreateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error) { func (g *GitHubClient) CreateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error) {
createdRelease, res, err := g.client.Repositories.CreateRelease(g.user, g.repository, &release) createdRelease, res, err := g.client.Repositories.CreateRelease(g.owner, g.repository, &release)
if err != nil { if err != nil {
return &github.RepositoryRelease{}, err return &github.RepositoryRelease{}, err
} }
@@ -139,7 +144,7 @@ func (g *GitHubClient) UpdateRelease(release github.RepositoryRelease) (*github.
return nil, errors.New("release did not have an ID: has it been saved yet?") return nil, errors.New("release did not have an ID: has it been saved yet?")
} }
updatedRelease, res, err := g.client.Repositories.EditRelease(g.user, g.repository, *release.ID, &release) updatedRelease, res, err := g.client.Repositories.EditRelease(g.owner, g.repository, *release.ID, &release)
if err != nil { if err != nil {
return &github.RepositoryRelease{}, err return &github.RepositoryRelease{}, err
} }
@@ -153,7 +158,7 @@ func (g *GitHubClient) UpdateRelease(release github.RepositoryRelease) (*github.
} }
func (g *GitHubClient) ListReleaseAssets(release github.RepositoryRelease) ([]*github.ReleaseAsset, error) { func (g *GitHubClient) ListReleaseAssets(release github.RepositoryRelease) ([]*github.ReleaseAsset, error) {
assets, res, err := g.client.Repositories.ListReleaseAssets(g.user, g.repository, *release.ID, nil) assets, res, err := g.client.Repositories.ListReleaseAssets(g.owner, g.repository, *release.ID, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -168,7 +173,7 @@ func (g *GitHubClient) ListReleaseAssets(release github.RepositoryRelease) ([]*g
func (g *GitHubClient) UploadReleaseAsset(release github.RepositoryRelease, name string, file *os.File) error { func (g *GitHubClient) UploadReleaseAsset(release github.RepositoryRelease, name string, file *os.File) error {
_, res, err := g.client.Repositories.UploadReleaseAsset( _, res, err := g.client.Repositories.UploadReleaseAsset(
g.user, g.owner,
g.repository, g.repository,
*release.ID, *release.ID,
&github.UploadOptions{ &github.UploadOptions{
@@ -184,7 +189,7 @@ func (g *GitHubClient) UploadReleaseAsset(release github.RepositoryRelease, name
} }
func (g *GitHubClient) DeleteReleaseAsset(asset github.ReleaseAsset) error { func (g *GitHubClient) DeleteReleaseAsset(asset github.ReleaseAsset) error {
res, err := g.client.Repositories.DeleteReleaseAsset(g.user, g.repository, *asset.ID) res, err := g.client.Repositories.DeleteReleaseAsset(g.owner, g.repository, *asset.ID)
if err != nil { if err != nil {
return err return err
} }
@@ -193,7 +198,7 @@ func (g *GitHubClient) DeleteReleaseAsset(asset github.ReleaseAsset) error {
} }
func (g *GitHubClient) DownloadReleaseAsset(asset github.ReleaseAsset) (io.ReadCloser, error) { func (g *GitHubClient) DownloadReleaseAsset(asset github.ReleaseAsset) (io.ReadCloser, error) {
res, redir, err := g.client.Repositories.DownloadReleaseAsset(g.user, g.repository, *asset.ID) res, redir, err := g.client.Repositories.DownloadReleaseAsset(g.owner, g.repository, *asset.ID)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -212,7 +217,7 @@ func (g *GitHubClient) DownloadReleaseAsset(asset github.ReleaseAsset) (io.ReadC
func (g *GitHubClient) GetTarballLink(tag string) (*url.URL, error) { func (g *GitHubClient) GetTarballLink(tag string) (*url.URL, error) {
opt := &github.RepositoryContentGetOptions{Ref: tag} opt := &github.RepositoryContentGetOptions{Ref: tag}
u, res, err := g.client.Repositories.GetArchiveLink(g.user, g.repository, github.Tarball, opt) u, res, err := g.client.Repositories.GetArchiveLink(g.owner, g.repository, github.Tarball, opt)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -222,7 +227,7 @@ func (g *GitHubClient) GetTarballLink(tag string) (*url.URL, error) {
func (g *GitHubClient) GetZipballLink(tag string) (*url.URL, error) { func (g *GitHubClient) GetZipballLink(tag string) (*url.URL, error) {
opt := &github.RepositoryContentGetOptions{Ref: tag} opt := &github.RepositoryContentGetOptions{Ref: tag}
u, res, err := g.client.Repositories.GetArchiveLink(g.user, g.repository, github.Zipball, opt) u, res, err := g.client.Repositories.GetArchiveLink(g.owner, g.repository, github.Zipball, opt)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -55,7 +55,7 @@ var _ = Describe("GitHub Client", func() {
Context("with an OAuth Token", func() { Context("with an OAuth Token", func() {
BeforeEach(func() { BeforeEach(func() {
source = Source{ source = Source{
User: "concourse", Owner: "concourse",
Repository: "concourse", Repository: "concourse",
AccessToken: "abc123", AccessToken: "abc123",
} }
@@ -78,7 +78,7 @@ var _ = Describe("GitHub Client", func() {
Context("without an OAuth Token", func() { Context("without an OAuth Token", func() {
BeforeEach(func() { BeforeEach(func() {
source = Source{ source = Source{
User: "concourse", Owner: "concourse",
Repository: "concourse", Repository: "concourse",
} }
@@ -97,10 +97,31 @@ var _ = Describe("GitHub Client", func() {
}) })
}) })
Describe("when the source is configured with the deprecated user field", func() {
BeforeEach(func() {
source = Source{
User: "some-owner",
Repository: "some-repo",
}
server.AppendHandlers(
ghttp.CombineHandlers(
ghttp.VerifyRequest("GET", "/repos/some-owner/some-repo/releases"),
ghttp.RespondWith(200, "[]"),
),
)
})
It("uses the provided user as the owner", func() {
_, err := client.ListReleases()
Ω(err).ShouldNot(HaveOccurred())
})
})
Describe("GetRelease", func() { Describe("GetRelease", func() {
BeforeEach(func() { BeforeEach(func() {
source = Source{ source = Source{
User: "concourse", Owner: "concourse",
Repository: "concourse", Repository: "concourse",
} }
}) })
@@ -136,7 +157,7 @@ var _ = Describe("GitHub Client", func() {
Describe("GetReleaseByTag", func() { Describe("GetReleaseByTag", func() {
BeforeEach(func() { BeforeEach(func() {
source = Source{ source = Source{
User: "concourse", Owner: "concourse",
Repository: "concourse", Repository: "concourse",
} }
}) })

View File

@@ -1,9 +1,12 @@
package resource package resource
type Source struct { type Source struct {
User string `json:"user"` Owner string `json:"owner"`
Repository string `json:"repository"` Repository string `json:"repository"`
// Deprecated; use Owner instead
User string `json:"user"`
GitHubAPIURL string `json:"github_api_url"` GitHubAPIURL string `json:"github_api_url"`
GitHubUploadsURL string `json:"github_uploads_url"` GitHubUploadsURL string `json:"github_uploads_url"`
AccessToken string `json:"access_token"` AccessToken string `json:"access_token"`