diff --git a/internal/git/config.go b/internal/git/config.go index 852d8634e..b5a7f9bd6 100644 --- a/internal/git/config.go +++ b/internal/git/config.go @@ -21,10 +21,30 @@ func ExtractRepoFromConfig(ctx context.Context) (result config.Repo, err error) if err != nil { return result, fmt.Errorf("no remote configured to list refs from") } + // This is a relative remote URL and requires some additional processing + if out == "." { + return extractRelativeRepoFromConfig(ctx) + } log.WithField("rawurl", out).Debugf("got git url") return ExtractRepoFromURL(out) } +func extractRelativeRepoFromConfig(ctx context.Context) (result config.Repo, err error) { + out, err := Clean(Run(ctx, "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}")) + if err != nil || out == "" { + return result, fmt.Errorf("unable to get upstream while qualifying relative remote") + } + out, err = Clean(Run(ctx, "config", "--get", fmt.Sprintf("branch.%s.remote", out))) + if err != nil || out == "" { + return result, fmt.Errorf("unable to get upstream's remote while qualifying relative remote") + } + out, err = Clean(Run(ctx, "ls-remote", "--get-url", out)) + if err != nil { + return result, fmt.Errorf("unable to get upstream while qualifying relative remote") + } + return ExtractRepoFromURL(out) +} + func ExtractRepoFromURL(rawurl string) (config.Repo, error) { // removes the .git suffix and any new lines s := strings.TrimSuffix(strings.TrimSpace(rawurl), ".git") diff --git a/internal/git/config_test.go b/internal/git/config_test.go index 8de694ac3..2ffaf0747 100644 --- a/internal/git/config_test.go +++ b/internal/git/config_test.go @@ -2,6 +2,7 @@ package git_test import ( "context" + "strings" "testing" "github.com/goreleaser/goreleaser/internal/git" @@ -22,6 +23,25 @@ func TestNoRemote(t *testing.T) { require.EqualError(t, err, `no remote configured to list refs from`) } +func TestRelativeRemote(t *testing.T) { + ctx := context.Background() + testlib.Mktmp(t) + testlib.GitInit(t) + testlib.GitRemoteAddWithName(t, "upstream", "https://github.com/goreleaser/goreleaser.git") + _, err := git.Run(ctx, "pull", "upstream", "main") + require.NoError(t, err) + _, err = git.Run(ctx, "branch", "--set-upstream-to", "upstream/main") + require.NoError(t, err) + _, err = git.Run(ctx, "checkout", "--track", "-b", "relative_branch") + require.NoError(t, err) + gitCfg, err := git.Run(ctx, "config", "--local", "--list") + require.NoError(t, err) + require.True(t, strings.Contains(gitCfg, "branch.relative_branch.remote=.")) + repo, err := git.ExtractRepoFromConfig(ctx) + require.NoError(t, err) + require.Equal(t, "goreleaser/goreleaser", repo.String()) +} + func TestRepoName(t *testing.T) { testlib.Mktmp(t) testlib.GitInit(t)