gitee.com/mirrors_opencollective/goreleaser@v0.45.0/internal/client/github.go (about) 1 package client 2 3 import ( 4 "bytes" 5 "net/url" 6 "os" 7 8 "github.com/apex/log" 9 "github.com/google/go-github/github" 10 "github.com/goreleaser/goreleaser/context" 11 "golang.org/x/oauth2" 12 ) 13 14 type githubClient struct { 15 client *github.Client 16 } 17 18 // NewGitHub returns a github client implementation 19 func NewGitHub(ctx *context.Context) (Client, error) { 20 ts := oauth2.StaticTokenSource( 21 &oauth2.Token{AccessToken: ctx.Token}, 22 ) 23 client := github.NewClient(oauth2.NewClient(ctx, ts)) 24 if ctx.Config.GitHubURLs.API != "" { 25 api, err := url.Parse(ctx.Config.GitHubURLs.API) 26 if err != nil { 27 return &githubClient{}, err 28 } 29 upload, err := url.Parse(ctx.Config.GitHubURLs.Upload) 30 if err != nil { 31 return &githubClient{}, err 32 } 33 client.BaseURL = api 34 client.UploadURL = upload 35 } 36 37 return &githubClient{client}, nil 38 } 39 40 func (c *githubClient) CreateFile( 41 ctx *context.Context, 42 content bytes.Buffer, 43 path string, 44 ) (err error) { 45 options := &github.RepositoryContentFileOptions{ 46 Committer: &github.CommitAuthor{ 47 Name: github.String(ctx.Config.Brew.CommitAuthor.Name), 48 Email: github.String(ctx.Config.Brew.CommitAuthor.Email), 49 }, 50 Content: content.Bytes(), 51 Message: github.String( 52 ctx.Config.ProjectName + " version " + ctx.Git.CurrentTag, 53 ), 54 } 55 56 file, _, res, err := c.client.Repositories.GetContents( 57 ctx, 58 ctx.Config.Brew.GitHub.Owner, 59 ctx.Config.Brew.GitHub.Name, 60 path, 61 &github.RepositoryContentGetOptions{}, 62 ) 63 if err != nil && res.StatusCode == 404 { 64 _, _, err = c.client.Repositories.CreateFile( 65 ctx, 66 ctx.Config.Brew.GitHub.Owner, 67 ctx.Config.Brew.GitHub.Name, 68 path, 69 options, 70 ) 71 return 72 } 73 options.SHA = file.SHA 74 _, _, err = c.client.Repositories.UpdateFile( 75 ctx, 76 ctx.Config.Brew.GitHub.Owner, 77 ctx.Config.Brew.GitHub.Name, 78 path, 79 options, 80 ) 81 return 82 } 83 84 func (c *githubClient) CreateRelease(ctx *context.Context, body string) (releaseID int, err error) { 85 var release *github.RepositoryRelease 86 title, err := releaseTitle(ctx) 87 if err != nil { 88 return 0, err 89 } 90 var data = &github.RepositoryRelease{ 91 Name: github.String(title), 92 TagName: github.String(ctx.Git.CurrentTag), 93 Body: github.String(body), 94 Draft: github.Bool(ctx.Config.Release.Draft), 95 Prerelease: github.Bool(ctx.Config.Release.Prerelease), 96 } 97 release, _, err = c.client.Repositories.GetReleaseByTag( 98 ctx, 99 ctx.Config.Release.GitHub.Owner, 100 ctx.Config.Release.GitHub.Name, 101 ctx.Git.CurrentTag, 102 ) 103 if err != nil { 104 release, _, err = c.client.Repositories.CreateRelease( 105 ctx, 106 ctx.Config.Release.GitHub.Owner, 107 ctx.Config.Release.GitHub.Name, 108 data, 109 ) 110 } else { 111 release, _, err = c.client.Repositories.EditRelease( 112 ctx, 113 ctx.Config.Release.GitHub.Owner, 114 ctx.Config.Release.GitHub.Name, 115 release.GetID(), 116 data, 117 ) 118 } 119 log.WithField("url", release.GetHTMLURL()).Info("release updated") 120 return release.GetID(), err 121 } 122 123 func (c *githubClient) Upload( 124 ctx *context.Context, 125 releaseID int, 126 name string, 127 file *os.File, 128 ) (err error) { 129 _, _, err = c.client.Repositories.UploadReleaseAsset( 130 ctx, 131 ctx.Config.Release.GitHub.Owner, 132 ctx.Config.Release.GitHub.Name, 133 releaseID, 134 &github.UploadOptions{ 135 Name: name, 136 }, 137 file, 138 ) 139 return 140 }