From 2f72048e806664855d2960cdf943a5f2af14bf98 Mon Sep 17 00:00:00 2001 From: Carlos A Becker Date: Thu, 13 Oct 2022 23:59:20 -0300 Subject: [PATCH 1/3] refactor: making it easier to merge with pro --- internal/git/git.go | 16 +++++++++++++++ internal/git/git_test.go | 43 ++++++++++++++++++++++++++++++---------- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/internal/git/git.go b/internal/git/git.go index 3be4c43951c..db1710f9546 100644 --- a/internal/git/git.go +++ b/internal/git/git.go @@ -59,3 +59,19 @@ func Clean(output string, err error) (string, error) { } return output, err } + +// CleanAllLines returns all the non empty lines of the output, cleaned up. +func CleanAllLines(output string, err error) ([]string, error) { + var result []string + for _, line := range strings.Split(output, "\n") { + l := strings.TrimSpace(strings.ReplaceAll(line, "'", "")) + if l == "" { + continue + } + result = append(result, l) + } + if err != nil { + err = errors.New(strings.TrimSuffix(err.Error(), "\n")) + } + return result, err +} diff --git a/internal/git/git_test.go b/internal/git/git_test.go index 6aaf777a177..4d2aa52a092 100644 --- a/internal/git/git_test.go +++ b/internal/git/git_test.go @@ -36,10 +36,15 @@ func TestGitWarning(t *testing.T) { testlib.GitCommit(t, "foobar") testlib.GitBranch(t, "tags/1.2.3") testlib.GitTag(t, "1.2.3") + testlib.GitTag(t, "nightly") out, err := git.Run(ctx, "describe", "--tags", "--abbrev=0", "tags/1.2.3^") require.NoError(t, err) require.Equal(t, "1.2.2\n", out) + + tags, err := git.CleanAllLines(git.Run(ctx, "tag", "--points-at", "HEAD", "--sort", "-version:refname")) + require.NoError(t, err) + require.ElementsMatch(t, []string{"1.2.3", "nightly"}, tags) } func TestRepo(t *testing.T) { @@ -52,16 +57,32 @@ func TestRepo(t *testing.T) { func TestClean(t *testing.T) { ctx := context.Background() - out, err := git.Clean("asdasd 'ssadas'\nadasd", nil) - require.NoError(t, err) - require.Equal(t, "asdasd ssadas", out) - out, err = git.Clean(git.Run(ctx, "command-that-dont-exist")) - require.Error(t, err) - require.Empty(t, out) - require.Equal( - t, - "git: 'command-that-dont-exist' is not a git command. See 'git --help'.", - err.Error(), - ) + t.Run("success", func(t *testing.T) { + out, err := git.Clean("asdasd 'ssadas'\nadasd", nil) + require.NoError(t, err) + require.Equal(t, "asdasd ssadas", out) + }) + + t.Run("error", func(t *testing.T) { + out, err := git.Clean(git.Run(ctx, "command-that-dont-exist")) + require.Error(t, err) + require.Empty(t, out) + require.Equal( + t, + "git: 'command-that-dont-exist' is not a git command. See 'git --help'.", + err.Error(), + ) + }) + + t.Run("all lines error", func(t *testing.T) { + out, err := git.CleanAllLines(git.Run(ctx, "command-that-dont-exist")) + require.Error(t, err) + require.Empty(t, out) + require.Equal( + t, + "git: 'command-that-dont-exist' is not a git command. See 'git --help'.", + err.Error(), + ) + }) } From feaa6a19ba1f18e88246a00d3892b2913f41adca Mon Sep 17 00:00:00 2001 From: Carlos A Becker Date: Fri, 14 Oct 2022 00:04:19 -0300 Subject: [PATCH 2/3] refactor: improve merge with pro Signed-off-by: Carlos A Becker --- internal/pipe/git/git.go | 92 ++++++++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 17 deletions(-) diff --git a/internal/pipe/git/git.go b/internal/pipe/git/git.go index 412006982de..e2cfeb87404 100644 --- a/internal/pipe/git/git.go +++ b/internal/pipe/git/git.go @@ -221,35 +221,93 @@ func getTagWithFormat(ctx *context.Context, tag, format string) (string, error) return strings.TrimSpace(strings.TrimSuffix(strings.ReplaceAll(out, "'", ""), "\n\n")), err } +func getFromEnv(s string) func() ([]string, error) { + return func() ([]string, error) { + if tag := os.Getenv(s); tag != "" { + return []string{tag}, nil + } + return nil, nil + } +} + func getTag(ctx *context.Context) (string, error) { - var tag string - var err error - for _, fn := range []func() (string, error){ - func() (string, error) { - return os.Getenv("GORELEASER_CURRENT_TAG"), nil + for _, fn := range []func() ([]string, error){ + getFromEnv("GORELEASER_CURRENT_TAG"), + func() ([]string, error) { + return git.CleanAllLines(git.Run( + ctx, + "tag", + "--points-at", + "HEAD", + "--sort", + "-version:refname", + )) }, - func() (string, error) { - return git.Clean(git.Run(ctx, "tag", "--points-at", "HEAD", "--sort", "-version:refname")) - }, - func() (string, error) { - return git.Clean(git.Run(ctx, "describe", "--tags", "--abbrev=0")) + func() ([]string, error) { + // this will get the last tag, even if it wasn't made against the + // last commit... + return git.CleanAllLines(git.Run( + ctx, + "describe", + "--tags", + "--abbrev=0", + )) }, } { - tag, err = fn() - if tag != "" || err != nil { - return tag, err + tags, err := fn() + if len(tags) > 0 { + return tags[0], err + } + if err != nil { + return "", err } } - return tag, err + return "", nil } func getPreviousTag(ctx *context.Context, current string) (string, error) { - if tag := os.Getenv("GORELEASER_PREVIOUS_TAG"); tag != "" { - return tag, nil + for _, fn := range []func() ([]string, error){ + getFromEnv("GORELEASER_PREVIOUS_TAG"), + func() ([]string, error) { + sha, err := previousTagSha(ctx, current) + if err != nil { + return nil, err + } + return git.CleanAllLines(git.Run( + ctx, + "tag", + "--points-at", + sha, + "--sort", + "-version:refname", + )) + }, + } { + tags, err := fn() + if len(tags) > 0 { + return tags[0], err + } + if err != nil { + return "", err + } } - return git.Clean(git.Run(ctx, "describe", "--tags", "--abbrev=0", fmt.Sprintf("tags/%s^", current))) + return "", nil +} + +func previousTagSha(ctx *context.Context, current string) (string, error) { + tag, err := git.Clean(git.Run( + ctx, + "describe", + "--tags", + "--abbrev=0", + fmt.Sprintf("tags/%s^", current), + )) + if err != nil { + return "", err + } + return git.Clean(git.Run(ctx, "show", "--format='%h'", tag, "--quiet")) } func getURL(ctx *context.Context) (string, error) { From c142693f02edfe528dc6e395998c1c12e8fbeba8 Mon Sep 17 00:00:00 2001 From: Carlos A Becker Date: Fri, 14 Oct 2022 00:12:41 -0300 Subject: [PATCH 3/3] refactor: improve code a bit --- internal/pipe/git/git.go | 64 +++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/internal/pipe/git/git.go b/internal/pipe/git/git.go index e2cfeb87404..96450cff800 100644 --- a/internal/pipe/git/git.go +++ b/internal/pipe/git/git.go @@ -221,37 +221,16 @@ func getTagWithFormat(ctx *context.Context, tag, format string) (string, error) return strings.TrimSpace(strings.TrimSuffix(strings.ReplaceAll(out, "'", ""), "\n\n")), err } -func getFromEnv(s string) func() ([]string, error) { - return func() ([]string, error) { - if tag := os.Getenv(s); tag != "" { - return []string{tag}, nil - } - return nil, nil - } -} - func getTag(ctx *context.Context) (string, error) { for _, fn := range []func() ([]string, error){ getFromEnv("GORELEASER_CURRENT_TAG"), func() ([]string, error) { - return git.CleanAllLines(git.Run( - ctx, - "tag", - "--points-at", - "HEAD", - "--sort", - "-version:refname", - )) + return gitTagsPointingAt(ctx, "HEAD") }, func() ([]string, error) { // this will get the last tag, even if it wasn't made against the // last commit... - return git.CleanAllLines(git.Run( - ctx, - "describe", - "--tags", - "--abbrev=0", - )) + return git.CleanAllLines(gitDescribe(ctx, "HEAD")) }, } { tags, err := fn() @@ -274,14 +253,7 @@ func getPreviousTag(ctx *context.Context, current string) (string, error) { if err != nil { return nil, err } - return git.CleanAllLines(git.Run( - ctx, - "tag", - "--points-at", - sha, - "--sort", - "-version:refname", - )) + return gitTagsPointingAt(ctx, sha) }, } { tags, err := fn() @@ -296,14 +268,29 @@ func getPreviousTag(ctx *context.Context, current string) (string, error) { return "", nil } -func previousTagSha(ctx *context.Context, current string) (string, error) { - tag, err := git.Clean(git.Run( +func gitTagsPointingAt(ctx *context.Context, ref string) ([]string, error) { + return git.CleanAllLines(git.Run( + ctx, + "tag", + "--points-at", + ref, + "--sort", + "-version:refname", + )) +} + +func gitDescribe(ctx *context.Context, ref string) (string, error) { + return git.Clean(git.Run( ctx, "describe", "--tags", "--abbrev=0", - fmt.Sprintf("tags/%s^", current), + ref, )) +} + +func previousTagSha(ctx *context.Context, current string) (string, error) { + tag, err := gitDescribe(ctx, fmt.Sprintf("tags/%s^", current)) if err != nil { return "", err } @@ -313,3 +300,12 @@ func previousTagSha(ctx *context.Context, current string) (string, error) { func getURL(ctx *context.Context) (string, error) { return git.Clean(git.Run(ctx, "ls-remote", "--get-url")) } + +func getFromEnv(s string) func() ([]string, error) { + return func() ([]string, error) { + if tag := os.Getenv(s); tag != "" { + return []string{tag}, nil + } + return nil, nil + } +}