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  }