github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/client/client.go (about)

     1  // Package client contains the client implementations for several providers.
     2  package client
     3  
     4  import (
     5  	"errors"
     6  	"fmt"
     7  	"os"
     8  
     9  	"github.com/apex/log"
    10  	"github.com/goreleaser/goreleaser/internal/artifact"
    11  	"github.com/goreleaser/goreleaser/internal/tmpl"
    12  	"github.com/goreleaser/goreleaser/pkg/config"
    13  	"github.com/goreleaser/goreleaser/pkg/context"
    14  )
    15  
    16  // Info of the repository.
    17  type Info struct {
    18  	Description string
    19  	Homepage    string
    20  	URL         string
    21  }
    22  
    23  type Repo struct {
    24  	Owner string
    25  	Name  string
    26  }
    27  
    28  func (r Repo) String() string {
    29  	if r.Owner == "" && r.Name == "" {
    30  		return ""
    31  	}
    32  	return r.Owner + "/" + r.Name
    33  }
    34  
    35  // Client interface.
    36  type Client interface {
    37  	CloseMilestone(ctx *context.Context, repo Repo, title string) (err error)
    38  	CreateRelease(ctx *context.Context, body string) (releaseID string, err error)
    39  	ReleaseURLTemplate(ctx *context.Context) (string, error)
    40  	CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo Repo, content []byte, path, message string) (err error)
    41  	Upload(ctx *context.Context, releaseID string, artifact *artifact.Artifact, file *os.File) (err error)
    42  }
    43  
    44  // New creates a new client depending on the token type.
    45  func New(ctx *context.Context) (Client, error) {
    46  	return newWithToken(ctx, ctx.Token)
    47  }
    48  
    49  func newWithToken(ctx *context.Context, token string) (Client, error) {
    50  	log.WithField("type", ctx.TokenType).Debug("token type")
    51  	if ctx.TokenType == context.TokenTypeGitHub {
    52  		return NewGitHub(ctx, token)
    53  	}
    54  	if ctx.TokenType == context.TokenTypeGitLab {
    55  		return NewGitLab(ctx, token)
    56  	}
    57  	if ctx.TokenType == context.TokenTypeGitea {
    58  		return NewGitea(ctx, token)
    59  	}
    60  	return nil, fmt.Errorf("invalid client token type: %q", ctx.TokenType)
    61  }
    62  
    63  func NewIfToken(ctx *context.Context, cli Client, token string) (Client, error) {
    64  	if token == "" {
    65  		return cli, nil
    66  	}
    67  	token, err := tmpl.New(ctx).ApplySingleEnvOnly(token)
    68  	if err != nil {
    69  		return nil, err
    70  	}
    71  	log.Debug("using custom token")
    72  	return newWithToken(ctx, token)
    73  }
    74  
    75  // ErrNoMilestoneFound is an error when no milestone is found.
    76  type ErrNoMilestoneFound struct {
    77  	Title string
    78  }
    79  
    80  func (e ErrNoMilestoneFound) Error() string {
    81  	return fmt.Sprintf("no milestone found: %s", e.Title)
    82  }
    83  
    84  // RetriableError is an error that will cause the action to be retried.
    85  type RetriableError struct {
    86  	Err error
    87  }
    88  
    89  func (e RetriableError) Error() string {
    90  	return e.Err.Error()
    91  }
    92  
    93  // NotImplementedError happens when trying to use something a client does not
    94  // implement.
    95  type NotImplementedError struct {
    96  	TokenType context.TokenType
    97  }
    98  
    99  func (e NotImplementedError) Error() string {
   100  	return fmt.Sprintf("not implemented for %s", e.TokenType)
   101  }
   102  
   103  // IsNotImplementedErr returns true if given error is a NotImplementedError.
   104  func IsNotImplementedErr(err error) bool {
   105  	return errors.As(err, &NotImplementedError{})
   106  }