From 211c63ccbbff4c1883adb7f81fd1959deab79c8c Mon Sep 17 00:00:00 2001 From: qsliu Date: Thu, 9 Jun 2022 17:14:55 +0800 Subject: [PATCH 1/3] fix: duplicate draft release --- internal/client/github.go | 40 ++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/internal/client/github.go b/internal/client/github.go index d426f0e2fc0..84436ae79d9 100644 --- a/internal/client/github.go +++ b/internal/client/github.go @@ -221,13 +221,39 @@ func (c *githubClient) CreateRelease(ctx *context.Context, body string) (string, data.DiscussionCategoryName = github.String(ctx.Config.Release.DiscussionCategoryName) } - release, _, err = c.client.Repositories.GetReleaseByTag( - ctx, - ctx.Config.Release.GitHub.Owner, - ctx.Config.Release.GitHub.Name, - data.GetTagName(), - ) - if err != nil { + if *data.Draft { + opt := github.ListOptions{PerPage: 50} + for { + releases, resp, err := c.client.Repositories.ListReleases( + ctx, + ctx.Config.Release.GitHub.Owner, + ctx.Config.Release.GitHub.Name, + &opt, + ) + if err != nil { + return "", err + } + for _, r := range releases { + if *r.Draft && *r.Name == *data.Name { + release = r + break + } + } + if resp.NextPage == 0 { + break + } + opt.Page = resp.NextPage + } + } else { + release, _, err = c.client.Repositories.GetReleaseByTag( + ctx, + ctx.Config.Release.GitHub.Owner, + ctx.Config.Release.GitHub.Name, + data.GetTagName(), + ) + } + + if release == nil { release, _, err = c.client.Repositories.CreateRelease( ctx, ctx.Config.Release.GitHub.Owner, From 93da6c14ffe0adc3d534da43b9e5740933b1fef8 Mon Sep 17 00:00:00 2001 From: qsliu Date: Thu, 9 Jun 2022 17:24:12 +0800 Subject: [PATCH 2/3] golint --- internal/client/github.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/client/github.go b/internal/client/github.go index 84436ae79d9..e1bc7005a16 100644 --- a/internal/client/github.go +++ b/internal/client/github.go @@ -245,7 +245,7 @@ func (c *githubClient) CreateRelease(ctx *context.Context, body string) (string, opt.Page = resp.NextPage } } else { - release, _, err = c.client.Repositories.GetReleaseByTag( + release, _, _ = c.client.Repositories.GetReleaseByTag( ctx, ctx.Config.Release.GitHub.Owner, ctx.Config.Release.GitHub.Name, From 87c6dc27823db25070a12e4545b2af566bdd2aa1 Mon Sep 17 00:00:00 2001 From: qsliu Date: Sat, 11 Jun 2022 11:10:53 +0800 Subject: [PATCH 3/3] delete existed release assets before append draft --- internal/client/github.go | 79 ++++++++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 18 deletions(-) diff --git a/internal/client/github.go b/internal/client/github.go index e1bc7005a16..75ee05b4c55 100644 --- a/internal/client/github.go +++ b/internal/client/github.go @@ -222,27 +222,15 @@ func (c *githubClient) CreateRelease(ctx *context.Context, body string) (string, } if *data.Draft { - opt := github.ListOptions{PerPage: 50} - for { - releases, resp, err := c.client.Repositories.ListReleases( - ctx, - ctx.Config.Release.GitHub.Owner, - ctx.Config.Release.GitHub.Name, - &opt, - ) + release, err = c.getExistedDraftRelease(ctx, data) + if err != nil { + return "", err + } + if release != nil { + err = c.deleteExistedDraftReleaseAssets(ctx, release.GetID()) if err != nil { return "", err } - for _, r := range releases { - if *r.Draft && *r.Name == *data.Name { - release = r - break - } - } - if resp.NextPage == 0 { - break - } - opt.Page = resp.NextPage } } else { release, _, _ = c.client.Repositories.GetReleaseByTag( @@ -383,3 +371,58 @@ func overrideGitHubClientAPI(ctx *context.Context, client *github.Client) error return nil } + +func (c *githubClient) getExistedDraftRelease(ctx *context.Context, release *github.RepositoryRelease) (*github.RepositoryRelease, error) { + opt := github.ListOptions{PerPage: 50} + for { + releases, resp, err := c.client.Repositories.ListReleases( + ctx, + ctx.Config.Release.GitHub.Owner, + ctx.Config.Release.GitHub.Name, + &opt, + ) + if err != nil { + return nil, err + } + for _, r := range releases { + if *r.Draft && *r.Name == *release.Name { + return r, nil + } + } + if resp.NextPage == 0 { + return nil, nil + } + opt.Page = resp.NextPage + } +} + +func (c *githubClient) deleteExistedDraftReleaseAssets(ctx *context.Context, releaseID int64) error { + opt := github.ListOptions{PerPage: 50} + for { + assets, resp, err := c.client.Repositories.ListReleaseAssets( + ctx, + ctx.Config.Release.GitHub.Owner, + ctx.Config.Release.GitHub.Name, + releaseID, + &opt, + ) + if err != nil { + return err + } + for _, a := range assets { + _, err := c.client.Repositories.DeleteReleaseAsset( + ctx, + ctx.Config.Release.GitHub.Owner, + ctx.Config.Release.GitHub.Name, + a.GetID(), + ) + if err != nil { + return err + } + } + if resp.NextPage == 0 { + return nil + } + opt.Page = resp.NextPage + } +}