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