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  }