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