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  }