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 }