1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-01-24 04:16:27 +02:00

187 lines
4.2 KiB
Go
Raw Normal View History

2017-01-14 12:34:22 -02:00
package git
2017-01-29 21:55:32 -02:00
import (
"fmt"
"os"
"os/exec"
"strconv"
2017-01-29 21:55:32 -02:00
"strings"
"time"
2017-01-29 21:55:32 -02:00
2017-06-22 00:09:14 -03:00
"github.com/apex/log"
2017-08-19 12:47:04 -03:00
"github.com/goreleaser/goreleaser/internal/git"
2018-09-12 14:18:01 -03:00
"github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/pkg/context"
2017-01-29 21:55:32 -02:00
)
2017-01-14 12:34:22 -02:00
// Pipe that sets up git state.
2017-01-14 12:34:22 -02:00
type Pipe struct{}
func (Pipe) String() string {
return "getting and validating git state"
2017-01-14 12:34:22 -02:00
}
// Run the pipe.
func (Pipe) Run(ctx *context.Context) error {
if _, err := exec.LookPath("git"); err != nil {
return ErrNoGit
}
info, err := getInfo(ctx)
2017-01-14 12:34:22 -02:00
if err != nil {
return err
2017-01-14 12:34:22 -02:00
}
ctx.Git = info
log.Infof("releasing %s, commit %s", info.CurrentTag, info.Commit)
2018-12-13 10:09:36 -02:00
ctx.Version = strings.TrimPrefix(ctx.Git.CurrentTag, "v")
return validate(ctx)
}
2018-11-07 22:04:49 -02:00
// nolint: gochecknoglobals
var fakeInfo = context.GitInfo{
Branch: "none",
2018-10-03 17:44:31 -03:00
CurrentTag: "v0.0.0",
Commit: "none",
ShortCommit: "none",
FullCommit: "none",
}
func getInfo(ctx *context.Context) (context.GitInfo, error) {
if !git.IsRepo() && ctx.Snapshot {
log.Warn("accepting to run without a git repo because this is a snapshot")
return fakeInfo, nil
}
if !git.IsRepo() {
return context.GitInfo{}, ErrNotRepository
}
2019-01-19 18:05:15 -02:00
info, err := getGitInfo()
if err != nil && ctx.Snapshot {
log.WithError(err).Warn("ignoring errors because this is a snapshot")
if info.Commit == "" {
info = fakeInfo
}
return info, nil
}
return info, err
}
2019-01-19 18:05:15 -02:00
func getGitInfo() (context.GitInfo, error) {
branch, err := getBranch()
if err != nil {
return context.GitInfo{}, fmt.Errorf("couldn't get current branch: %w", err)
}
2018-10-03 17:44:31 -03:00
short, err := getShortCommit()
if err != nil {
return context.GitInfo{}, fmt.Errorf("couldn't get current commit: %w", err)
2018-10-03 17:44:31 -03:00
}
full, err := getFullCommit()
if err != nil {
return context.GitInfo{}, fmt.Errorf("couldn't get current commit: %w", err)
2017-01-14 14:06:57 -02:00
}
date, err := getCommitDate()
if err != nil {
return context.GitInfo{}, fmt.Errorf("couldn't get commit date: %w", err)
}
url, err := getURL()
if err != nil {
return context.GitInfo{}, fmt.Errorf("couldn't get remote URL: %w", err)
}
tag, err := getTag()
if err != nil {
return context.GitInfo{
Branch: branch,
Commit: full,
2018-10-03 17:44:31 -03:00
FullCommit: full,
ShortCommit: short,
CommitDate: date,
URL: url,
2018-10-03 17:44:31 -03:00
CurrentTag: "v0.0.0",
}, ErrNoTag
2017-05-01 10:39:57 -03:00
}
return context.GitInfo{
Branch: branch,
2018-10-03 17:44:31 -03:00
CurrentTag: tag,
Commit: full,
2018-10-03 17:44:31 -03:00
FullCommit: full,
ShortCommit: short,
CommitDate: date,
URL: url,
}, nil
2017-05-01 10:39:57 -03:00
}
func validate(ctx *context.Context) error {
if ctx.Snapshot {
2018-09-12 14:18:01 -03:00
return pipe.ErrSnapshotEnabled
2018-03-08 08:42:33 -03:00
}
if ctx.SkipValidate {
2018-09-12 14:18:01 -03:00
return pipe.ErrSkipValidateEnabled
}
out, err := git.Run("status", "--porcelain")
if strings.TrimSpace(out) != "" || err != nil {
return ErrDirty{status: out}
2017-04-15 16:11:47 -03:00
}
_, err = git.Clean(git.Run("describe", "--exact-match", "--tags", "--match", ctx.Git.CurrentTag))
2017-05-01 10:57:37 -03:00
if err != nil {
2018-06-19 15:53:14 -03:00
return ErrWrongRef{
commit: ctx.Git.Commit,
tag: ctx.Git.CurrentTag,
}
2017-04-15 16:11:47 -03:00
}
return nil
2017-01-14 12:34:22 -02:00
}
func getBranch() (string, error) {
return git.Clean(git.Run("rev-parse", "--abbrev-ref", "HEAD", "--quiet"))
}
func getCommitDate() (time.Time, error) {
ct, err := git.Clean(git.Run("show", "--format='%ct'", "HEAD", "--quiet"))
if err != nil {
return time.Time{}, err
}
if ct == "" {
return time.Time{}, nil
}
i, err := strconv.ParseInt(ct, 10, 64)
if err != nil {
return time.Time{}, err
}
t := time.Unix(i, 0).UTC()
return t, nil
}
2018-10-03 17:44:31 -03:00
func getShortCommit() (string, error) {
return git.Clean(git.Run("show", "--format='%h'", "HEAD", "--quiet"))
2018-10-03 17:44:31 -03:00
}
func getFullCommit() (string, error) {
return git.Clean(git.Run("show", "--format='%H'", "HEAD", "--quiet"))
}
func getTag() (string, error) {
var tag string
var err error
for _, fn := range []func() (string, error){
func() (string, error) {
return os.Getenv("GORELEASER_CURRENT_TAG"), nil
},
func() (string, error) {
return git.Clean(git.Run("tag", "--points-at", "HEAD", "--sort", "-version:creatordate"))
},
func() (string, error) {
return git.Clean(git.Run("describe", "--tags", "--abbrev=0"))
},
} {
tag, err = fn()
if tag != "" || err != nil {
return tag, err
}
}
return tag, err
2017-04-23 16:33:44 -03:00
}
func getURL() (string, error) {
return git.Clean(git.Run("ls-remote", "--get-url"))
}