clear out any existing release assets

[#76848252]

Signed-off-by: Chris Brown <cbrown@pivotal.io>
This commit is contained in:
Alex Suraci
2015-02-20 11:06:13 -08:00
committed by Chris Brown
parent 125bd204e4
commit 330d632d62
4 changed files with 103 additions and 7 deletions

View File

@@ -54,6 +54,14 @@ type FakeGitHub struct {
uploadReleaseAssetReturns struct { uploadReleaseAssetReturns struct {
result1 error result1 error
} }
DeleteReleaseAssetStub func(asset github.ReleaseAsset) error
deleteReleaseAssetMutex sync.RWMutex
deleteReleaseAssetArgsForCall []struct {
asset github.ReleaseAsset
}
deleteReleaseAssetReturns struct {
result1 error
}
} }
func (fake *FakeGitHub) ListReleases() ([]github.RepositoryRelease, error) { func (fake *FakeGitHub) ListReleases() ([]github.RepositoryRelease, error) {
@@ -214,4 +222,36 @@ func (fake *FakeGitHub) UploadReleaseAssetReturns(result1 error) {
}{result1} }{result1}
} }
func (fake *FakeGitHub) DeleteReleaseAsset(asset github.ReleaseAsset) error {
fake.deleteReleaseAssetMutex.Lock()
fake.deleteReleaseAssetArgsForCall = append(fake.deleteReleaseAssetArgsForCall, struct {
asset github.ReleaseAsset
}{asset})
fake.deleteReleaseAssetMutex.Unlock()
if fake.DeleteReleaseAssetStub != nil {
return fake.DeleteReleaseAssetStub(asset)
} else {
return fake.deleteReleaseAssetReturns.result1
}
}
func (fake *FakeGitHub) DeleteReleaseAssetCallCount() int {
fake.deleteReleaseAssetMutex.RLock()
defer fake.deleteReleaseAssetMutex.RUnlock()
return len(fake.deleteReleaseAssetArgsForCall)
}
func (fake *FakeGitHub) DeleteReleaseAssetArgsForCall(i int) github.ReleaseAsset {
fake.deleteReleaseAssetMutex.RLock()
defer fake.deleteReleaseAssetMutex.RUnlock()
return fake.deleteReleaseAssetArgsForCall[i].asset
}
func (fake *FakeGitHub) DeleteReleaseAssetReturns(result1 error) {
fake.DeleteReleaseAssetStub = nil
fake.deleteReleaseAssetReturns = struct {
result1 error
}{result1}
}
var _ resource.GitHub = new(FakeGitHub) var _ resource.GitHub = new(FakeGitHub)

View File

@@ -18,6 +18,7 @@ type GitHub interface {
ListReleaseAssets(release *github.RepositoryRelease) ([]github.ReleaseAsset, error) ListReleaseAssets(release *github.RepositoryRelease) ([]github.ReleaseAsset, error)
UploadReleaseAsset(release *github.RepositoryRelease, name string, file *os.File) error UploadReleaseAsset(release *github.RepositoryRelease, name string, file *os.File) error
DeleteReleaseAsset(asset github.ReleaseAsset) error
} }
type GitHubClient struct { type GitHubClient struct {
@@ -44,20 +45,30 @@ func NewGitHubClient(source Source) *GitHubClient {
} }
func (g *GitHubClient) ListReleases() ([]github.RepositoryRelease, error) { func (g *GitHubClient) ListReleases() ([]github.RepositoryRelease, error) {
releases, _, err := g.client.Repositories.ListReleases(g.user, g.repository, nil) releases, res, err := g.client.Repositories.ListReleases(g.user, g.repository, nil)
if err != nil { if err != nil {
return []github.RepositoryRelease{}, err return []github.RepositoryRelease{}, err
} }
err = res.Body.Close()
if err != nil {
return nil, err
}
return releases, nil return releases, nil
} }
func (g *GitHubClient) CreateRelease(release *github.RepositoryRelease) (*github.RepositoryRelease, error) { func (g *GitHubClient) CreateRelease(release *github.RepositoryRelease) (*github.RepositoryRelease, error) {
createdRelease, _, err := g.client.Repositories.CreateRelease(g.user, g.repository, release) createdRelease, res, err := g.client.Repositories.CreateRelease(g.user, g.repository, release)
if err != nil { if err != nil {
return &github.RepositoryRelease{}, err return &github.RepositoryRelease{}, err
} }
err = res.Body.Close()
if err != nil {
return nil, err
}
return createdRelease, nil return createdRelease, nil
} }
@@ -66,25 +77,35 @@ 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, _, err := g.client.Repositories.EditRelease(g.user, g.repository, *release.ID, release) updatedRelease, res, err := g.client.Repositories.EditRelease(g.user, g.repository, *release.ID, release)
if err != nil { if err != nil {
return &github.RepositoryRelease{}, err return &github.RepositoryRelease{}, err
} }
err = res.Body.Close()
if err != nil {
return nil, err
}
return updatedRelease, nil return updatedRelease, nil
} }
func (g *GitHubClient) ListReleaseAssets(release *github.RepositoryRelease) ([]github.ReleaseAsset, error) { func (g *GitHubClient) ListReleaseAssets(release *github.RepositoryRelease) ([]github.ReleaseAsset, error) {
assets, _, err := g.client.Repositories.ListReleaseAssets(g.user, g.repository, *release.ID, nil) assets, res, err := g.client.Repositories.ListReleaseAssets(g.user, g.repository, *release.ID, nil)
if err != nil { if err != nil {
return []github.ReleaseAsset{}, nil return []github.ReleaseAsset{}, nil
} }
err = res.Body.Close()
if err != nil {
return nil, err
}
return assets, nil return assets, nil
} }
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 {
_, _, err := g.client.Repositories.UploadReleaseAsset( _, res, err := g.client.Repositories.UploadReleaseAsset(
g.user, g.user,
g.repository, g.repository,
*release.ID, *release.ID,
@@ -93,6 +114,18 @@ func (g *GitHubClient) UploadReleaseAsset(release *github.RepositoryRelease, nam
}, },
file, file,
) )
if err != nil {
return err return err
} }
return res.Body.Close()
}
func (g *GitHubClient) DeleteReleaseAsset(asset github.ReleaseAsset) error {
res, err := g.client.Repositories.DeleteReleaseAsset(g.user, g.repository, *asset.ID)
if err != nil {
return err
}
return res.Body.Close()
}

View File

@@ -63,6 +63,13 @@ func (c *OutCommand) Run(sourceDir string, request OutRequest) (OutResponse, err
existingRelease.Name = github.String(name) existingRelease.Name = github.String(name)
existingRelease.Body = github.String(body) existingRelease.Body = github.String(body)
for _, asset := range existingRelease.Assets {
err := c.github.DeleteReleaseAsset(asset)
if err != nil {
return OutResponse{}, err
}
}
release, err = c.github.UpdateRelease(existingRelease) release, err = c.github.UpdateRelease(existingRelease)
} else { } else {
release, err = c.github.CreateRelease(release) release, err = c.github.CreateRelease(release)

View File

@@ -63,9 +63,18 @@ var _ = Describe("Out Command", func() {
}) })
Context("when the release has already been created", func() { Context("when the release has already been created", func() {
existingAssets := []github.ReleaseAsset{
{ID: github.Int(456789)},
{ID: github.Int(3450798)},
}
BeforeEach(func() { BeforeEach(func() {
githubClient.ListReleasesReturns([]github.RepositoryRelease{ githubClient.ListReleasesReturns([]github.RepositoryRelease{
{ID: github.Int(112), TagName: github.String("some-tag-name")}, {
ID: github.Int(112),
TagName: github.String("some-tag-name"),
Assets: existingAssets,
},
}, nil) }, nil)
namePath := filepath.Join(sourcesDir, "name") namePath := filepath.Join(sourcesDir, "name")
@@ -92,6 +101,13 @@ var _ = Describe("Out Command", func() {
Ω(*updatedRelease.Name).Should(Equal("v0.3.12")) Ω(*updatedRelease.Name).Should(Equal("v0.3.12"))
Ω(*updatedRelease.Body).Should(Equal("this is a great release")) Ω(*updatedRelease.Body).Should(Equal("this is a great release"))
}) })
It("deletes the existing assets", func() {
Ω(githubClient.DeleteReleaseAssetCallCount()).Should(Equal(2))
Ω(githubClient.DeleteReleaseAssetArgsForCall(0)).Should(Equal(existingAssets[0]))
Ω(githubClient.DeleteReleaseAssetArgsForCall(1)).Should(Equal(existingAssets[1]))
})
}) })
Context("when the release has not already been created", func() { Context("when the release has not already been created", func() {