From a470d49c6447336832b0cffd53ee22f10d1fb32a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Thu, 3 Sep 2020 16:06:28 +0200 Subject: [PATCH] Fix reporting release URL when creating with assets --- pkg/cmd/release/create/create.go | 3 +- pkg/cmd/release/create/create_test.go | 50 +++++++++++++++++++++++++++ pkg/cmd/release/create/http.go | 19 ++++++---- 3 files changed, 64 insertions(+), 8 deletions(-) diff --git a/pkg/cmd/release/create/create.go b/pkg/cmd/release/create/create.go index 4367b94ae..720eceade 100644 --- a/pkg/cmd/release/create/create.go +++ b/pkg/cmd/release/create/create.go @@ -279,10 +279,11 @@ func createRun(opts *CreateOptions) error { } if !opts.Draft { - err := publishRelease(httpClient, newRelease.APIURL) + rel, err := publishRelease(httpClient, newRelease.APIURL) if err != nil { return err } + newRelease = rel } } diff --git a/pkg/cmd/release/create/create_test.go b/pkg/cmd/release/create/create_test.go index 8316d5baa..806801ec2 100644 --- a/pkg/cmd/release/create/create_test.go +++ b/pkg/cmd/release/create/create_test.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "io" "io/ioutil" "net/http" "os" @@ -290,6 +291,36 @@ func Test_createRun(t *testing.T) { wantStdout: "https://github.com/OWNER/REPO/releases/tag/v1.2.3\n", wantStderr: ``, }, + { + name: "publish after uploading files", + isTTY: true, + opts: CreateOptions{ + TagName: "v1.2.3", + Name: "", + Body: "", + BodyProvided: true, + Draft: false, + Target: "", + Assets: []*shared.AssetForUpload{ + { + Name: "ball.tgz", + Open: func() (io.ReadCloser, error) { + return ioutil.NopCloser(bytes.NewBufferString(`TARBALL`)), nil + }, + }, + }, + Concurrency: 1, + }, + wantParams: map[string]interface{}{ + "tag_name": "v1.2.3", + "name": "", + "body": "", + "draft": true, + "prerelease": false, + }, + wantStdout: "https://github.com/OWNER/REPO/releases/tag/v1.2.3-final\n", + wantStderr: ``, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -300,8 +331,14 @@ func Test_createRun(t *testing.T) { fakeHTTP := &httpmock.Registry{} fakeHTTP.Register(httpmock.REST("POST", "repos/OWNER/REPO/releases"), httpmock.StatusStringResponse(201, `{ + "url": "https://api.github.com/releases/123", + "upload_url": "https://api.github.com/assets/upload", "html_url": "https://github.com/OWNER/REPO/releases/tag/v1.2.3" }`)) + fakeHTTP.Register(httpmock.REST("POST", "assets/upload"), httpmock.StatusStringResponse(201, `{}`)) + fakeHTTP.Register(httpmock.REST("PATCH", "releases/123"), httpmock.StatusStringResponse(201, `{ + "html_url": "https://github.com/OWNER/REPO/releases/tag/v1.2.3-final" + }`)) tt.opts.IO = io tt.opts.HttpClient = func() (*http.Client, error) { @@ -326,6 +363,19 @@ func Test_createRun(t *testing.T) { require.NoError(t, err) assert.Equal(t, tt.wantParams, params) + if len(tt.opts.Assets) > 0 { + q := fakeHTTP.Requests[1].URL.Query() + assert.Equal(t, tt.opts.Assets[0].Name, q.Get("name")) + assert.Equal(t, tt.opts.Assets[0].Label, q.Get("label")) + + bb, err := ioutil.ReadAll(fakeHTTP.Requests[2].Body) + require.NoError(t, err) + var updateParams interface{} + err = json.Unmarshal(bb, &updateParams) + require.NoError(t, err) + assert.Equal(t, map[string]interface{}{"draft": false}, updateParams) + } + assert.Equal(t, tt.wantStdout, stdout.String()) assert.Equal(t, tt.wantStderr, stderr.String()) }) diff --git a/pkg/cmd/release/create/http.go b/pkg/cmd/release/create/http.go index 684772c12..b8c838579 100644 --- a/pkg/cmd/release/create/http.go +++ b/pkg/cmd/release/create/http.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/json" "fmt" - "io" "io/ioutil" "net/http" @@ -50,24 +49,30 @@ func createRelease(httpClient *http.Client, repo ghrepo.Interface, params map[st return &newRelease, err } -func publishRelease(httpClient *http.Client, releaseURL string) error { +func publishRelease(httpClient *http.Client, releaseURL string) (*shared.Release, error) { req, err := http.NewRequest("PATCH", releaseURL, bytes.NewBufferString(`{"draft":false}`)) if err != nil { - return err + return nil, err } req.Header.Add("Content-Type", "application/json") resp, err := httpClient.Do(req) if err != nil { - return err + return nil, err } defer resp.Body.Close() if resp.StatusCode > 299 { - return api.HandleHTTPError(resp) + return nil, api.HandleHTTPError(resp) } - _, err = io.Copy(ioutil.Discard, resp.Body) - return err + b, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var release shared.Release + err = json.Unmarshal(b, &release) + return &release, err }