github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/milestone/milestone.go (about) 1 // Package milestone implements Pipe and manages VCS milestones. 2 package milestone 3 4 import ( 5 "github.com/caarlos0/log" 6 "github.com/goreleaser/goreleaser/internal/client" 7 "github.com/goreleaser/goreleaser/internal/git" 8 "github.com/goreleaser/goreleaser/internal/pipe" 9 "github.com/goreleaser/goreleaser/internal/tmpl" 10 "github.com/goreleaser/goreleaser/pkg/context" 11 ) 12 13 const defaultNameTemplate = "{{ .Tag }}" 14 15 // Pipe for milestone. 16 type Pipe struct{} 17 18 func (Pipe) String() string { return "milestones" } 19 func (Pipe) ContinueOnError() bool { return true } 20 func (Pipe) Skip(ctx *context.Context) bool { return len(ctx.Config.Milestones) == 0 } 21 22 // Default sets the pipe defaults. 23 func (Pipe) Default(ctx *context.Context) error { 24 for i := range ctx.Config.Milestones { 25 milestone := &ctx.Config.Milestones[i] 26 27 if milestone.NameTemplate == "" { 28 milestone.NameTemplate = defaultNameTemplate 29 } 30 31 if milestone.Repo.Name == "" { 32 repo, err := git.ExtractRepoFromConfig(ctx) 33 if err != nil && !ctx.Snapshot { 34 return err 35 } 36 if err := repo.CheckSCM(); err != nil && !ctx.Snapshot { 37 return err 38 } 39 40 milestone.Repo = repo 41 } 42 } 43 44 return nil 45 } 46 47 // Publish the release. 48 func (Pipe) Publish(ctx *context.Context) error { 49 c, err := client.New(ctx) 50 if err != nil { 51 return err 52 } 53 return doPublish(ctx, c) 54 } 55 56 func doPublish(ctx *context.Context, vcsClient client.Client) error { 57 for i := range ctx.Config.Milestones { 58 milestone := &ctx.Config.Milestones[i] 59 60 if !milestone.Close { 61 return pipe.Skip("closing not enabled") 62 } 63 64 name, err := tmpl.New(ctx).Apply(milestone.NameTemplate) 65 if err != nil { 66 return err 67 } 68 69 repo := client.Repo{ 70 Name: milestone.Repo.Name, 71 Owner: milestone.Repo.Owner, 72 } 73 74 log.WithField("milestone", name). 75 WithField("repo", repo.String()). 76 Info("closing milestone") 77 78 err = vcsClient.CloseMilestone(ctx, repo, name) 79 if err != nil { 80 if milestone.FailOnError { 81 return err 82 } 83 84 log.WithField("milestone", name). 85 WithField("repo", repo.String()). 86 Warnf("error closing milestone: %s", err) 87 } 88 } 89 90 return nil 91 }