From 850c2e14f25eec8ccbbbe5929f0b3a402168fce0 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Mon, 16 Oct 2017 15:43:26 -0200 Subject: [PATCH] fix: detect if current folder is a subfolder of a parent git repo We were checking for a .git folder, which would break in cases where goreleaser is running from a subfolder of a monorepo, for example. Check 529af6f#commitcomment-25011738 Closes #402 #403 --- internal/git/git.go | 7 +++++++ internal/git/git_test.go | 8 ++++++++ pipeline/defaults/remote.go | 12 +++++------- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/internal/git/git.go b/internal/git/git.go index c91c2a105..0d8c0c6e7 100644 --- a/internal/git/git.go +++ b/internal/git/git.go @@ -4,8 +4,15 @@ package git import ( "errors" "os/exec" + "strings" ) +// IsRepo returns true if current folder is a git repository +func IsRepo() bool { + out, err := Run("rev-parse", "--is-inside-work-tree") + return err == nil && strings.TrimSpace(out) == "true" +} + // Run runs a git command and returns its output or errors func Run(args ...string) (output string, err error) { var cmd = exec.Command("git", args...) diff --git a/internal/git/git_test.go b/internal/git/git_test.go index 74ac791b2..c2c12ea78 100644 --- a/internal/git/git_test.go +++ b/internal/git/git_test.go @@ -1,6 +1,7 @@ package git import ( + "os" "testing" "github.com/stretchr/testify/assert" @@ -20,3 +21,10 @@ func TestGit(t *testing.T) { err.Error(), ) } + +func TestRepo(t *testing.T) { + assert.True(t, IsRepo(), "goreleaser folder should be a git repo") + + assert.NoError(t, os.Chdir(os.TempDir())) + assert.False(t, IsRepo(), os.TempDir()+" folder should be a git repo") +} diff --git a/pipeline/defaults/remote.go b/pipeline/defaults/remote.go index b5fb7488d..194f32920 100644 --- a/pipeline/defaults/remote.go +++ b/pipeline/defaults/remote.go @@ -1,25 +1,23 @@ package defaults import ( - "os" - "os/exec" "strings" "github.com/goreleaser/goreleaser/config" + "github.com/goreleaser/goreleaser/internal/git" "github.com/pkg/errors" ) // remoteRepo gets the repo name from the Git config. func remoteRepo() (result config.Repo, err error) { - if _, err = os.Stat(".git"); os.IsNotExist(err) { - return result, errors.Wrap(err, "current folder is not a git repository") + if !git.IsRepo() { + return result, errors.New("current folder is not a git repository") } - cmd := exec.Command("git", "config", "--get", "remote.origin.url") - bts, err := cmd.CombinedOutput() + out, err := git.Run("config", "--get", "remote.origin.url") if err != nil { return result, errors.Wrap(err, "repository doesn't have an `origin` remote") } - return extractRepoFromURL(string(bts)), nil + return extractRepoFromURL(out), nil } func extractRepoFromURL(s string) config.Repo {