1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-01-10 03:47:03 +02:00
goreleaser/pipeline/git/git.go

132 lines
2.9 KiB
Go
Raw Normal View History

2017-01-14 16:34:22 +02:00
package git
2017-01-30 01:55:32 +02:00
import (
2017-04-29 12:49:22 +02:00
"bytes"
2017-01-30 12:08:42 +02:00
"regexp"
2017-01-30 01:55:32 +02:00
"strings"
2017-04-29 12:49:22 +02:00
"text/template"
2017-06-22 05:09:14 +02:00
"time"
2017-01-30 01:55:32 +02:00
2017-06-22 05:09:14 +02:00
"github.com/apex/log"
2017-01-30 01:55:32 +02:00
"github.com/goreleaser/goreleaser/context"
2017-08-19 17:47:04 +02:00
"github.com/goreleaser/goreleaser/internal/git"
"github.com/pkg/errors"
2017-01-30 01:55:32 +02:00
)
2017-01-14 16:34:22 +02:00
// Pipe for brew deployment
type Pipe struct{}
func (Pipe) String() string {
return "getting and validating git state"
2017-01-14 16:34:22 +02:00
}
// Run the pipe
func (Pipe) Run(ctx *context.Context) error {
info, err := getInfo(ctx)
2017-01-14 16:34:22 +02:00
if err != nil {
return err
2017-01-14 16:34:22 +02:00
}
ctx.Git = info
log.Infof("releasing %s, commit %s", info.CurrentTag, info.Commit)
if err := setVersion(ctx); err != nil {
return err
2017-04-29 12:49:22 +02:00
}
return validate(ctx)
}
func getInfo(ctx *context.Context) (context.GitInfo, error) {
if !git.IsRepo() && ctx.Snapshot {
log.Warn("running against a folder that is not a git repo")
return context.GitInfo{
CurrentTag: "v0.0.0",
Commit: "none",
}, nil
}
if !git.IsRepo() {
return context.GitInfo{}, ErrNotRepository
}
info, err := getGitInfo(ctx)
if err != nil && ctx.Snapshot {
return info, nil
}
return info, err
}
func getGitInfo(ctx *context.Context) (context.GitInfo, error) {
commit, err := getCommit()
if err != nil {
return context.GitInfo{}, errors.Wrap(err, "couldn't get current commit")
2017-01-14 18:06:57 +02:00
}
tag, err := getTag()
if err != nil {
return context.GitInfo{
Commit: commit,
}, ErrNoTag
2017-05-01 15:39:57 +02:00
}
return context.GitInfo{
CurrentTag: tag,
Commit: commit,
}, nil
2017-05-01 15:39:57 +02:00
}
func setVersion(ctx *context.Context) error {
2017-05-01 15:39:57 +02:00
if ctx.Snapshot {
snapshotName, err := getSnapshotName(ctx)
2017-04-29 12:49:22 +02:00
if err != nil {
return errors.Wrap(err, "failed to generate snapshot name")
2017-04-29 12:49:22 +02:00
}
ctx.Version = snapshotName
2017-05-01 15:39:57 +02:00
return nil
}
// removes usual `v` prefix
ctx.Version = strings.TrimPrefix(ctx.Git.CurrentTag, "v")
return nil
2017-05-01 15:39:57 +02:00
}
2017-04-29 12:49:22 +02:00
type snapshotNameData struct {
Commit string
Tag string
Timestamp int64
}
func getSnapshotName(ctx *context.Context) (string, error) {
2017-04-29 12:49:22 +02:00
tmpl, err := template.New("snapshot").Parse(ctx.Config.Snapshot.NameTemplate)
var out bytes.Buffer
if err != nil {
return "", err
}
2017-05-01 15:39:57 +02:00
var data = snapshotNameData{
Commit: ctx.Git.Commit,
Tag: ctx.Git.CurrentTag,
2017-05-01 15:39:57 +02:00
Timestamp: time.Now().Unix(),
2017-04-29 12:49:22 +02:00
}
2017-05-01 15:39:57 +02:00
err = tmpl.Execute(&out, data)
return out.String(), err
2017-04-15 22:04:26 +02:00
}
func validate(ctx *context.Context) error {
if ctx.Snapshot {
return nil
}
2017-08-19 17:47:04 +02:00
out, err := git.Run("status", "--porcelain")
2017-04-15 21:11:47 +02:00
if strings.TrimSpace(out) != "" || err != nil {
return ErrDirty{out}
}
2017-05-01 15:57:37 +02:00
if !regexp.MustCompile("^[0-9.]+").MatchString(ctx.Version) {
return ErrInvalidVersionFormat{ctx.Version}
}
_, err = git.Clean(git.Run("describe", "--exact-match", "--tags", "--match", ctx.Git.CurrentTag))
2017-05-01 15:57:37 +02:00
if err != nil {
return ErrWrongRef{ctx.Git.Commit, ctx.Git.CurrentTag}
2017-04-15 21:11:47 +02:00
}
return nil
2017-01-14 16:34:22 +02:00
}
func getCommit() (string, error) {
return git.Clean(git.Run("show", "--format='%H'", "HEAD"))
}
func getTag() (string, error) {
return git.Clean(git.Run("describe", "--tags", "--abbrev=0"))
2017-04-23 21:33:44 +02:00
}