From 78583e2af57f33ad105ce022aa2888ad04489c2e Mon Sep 17 00:00:00 2001 From: ryux1 Date: Mon, 7 Sep 2026 16:18:56 +0200 Subject: [PATCH 1/3] fix(repository): honor resolved remote --- pkg/repository/repository.go | 6 ++++++ pkg/repository/repository_test.go | 32 +++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/pkg/repository/repository.go b/pkg/repository/repository.go index eb7f129f..999521f4 100644 --- a/pkg/repository/repository.go +++ b/pkg/repository/repository.go @@ -150,6 +150,12 @@ func Current() (Repository, error) { } rem := filteredRemotes[0] + for _, candidate := range filteredRemotes { + if candidate.Resolved != "" { + rem = candidate + break + } + } r.Host = rem.Host r.Owner = rem.Owner r.Name = rem.Repo diff --git a/pkg/repository/repository_test.go b/pkg/repository/repository_test.go index 0430eab3..7c76e20a 100644 --- a/pkg/repository/repository_test.go +++ b/pkg/repository/repository_test.go @@ -1,8 +1,10 @@ package repository import ( + "os" "testing" + "github.com/cli/go-gh/v2/internal/git" "github.com/cli/go-gh/v2/internal/testutils" "github.com/stretchr/testify/assert" ) @@ -189,3 +191,33 @@ func TestParseWithHost(t *testing.T) { }) } } + +func TestCurrentPrefersResolvedRemote(t *testing.T) { + testutils.StubConfig(t, ` +hosts: + github.com: + oauth_token: token +`) + + tempDir := t.TempDir() + oldWd, err := os.Getwd() + assert.NoError(t, err) + assert.NoError(t, os.Chdir(tempDir)) + t.Cleanup(func() { _ = os.Chdir(oldWd) }) + + _, _, err = git.Exec("init", "--quiet") + assert.NoError(t, err) + _, _, err = git.Exec("remote", "add", "origin", "git@github.com:parent-org/example.git") + assert.NoError(t, err) + _, _, err = git.Exec("remote", "add", "github", "git@github.com:my-user/example.git") + assert.NoError(t, err) + _, _, err = git.Exec("config", "remote.origin.gh-resolved", "base") + assert.NoError(t, err) + + repository, err := Current() + + assert.NoError(t, err) + assert.Equal(t, "github.com", repository.Host) + assert.Equal(t, "parent-org", repository.Owner) + assert.Equal(t, "example", repository.Name) +} From d672c573e72dd9ed54415558ed4c3c72c5d6c4df Mon Sep 17 00:00:00 2001 From: William Martin Date: Mon, 14 Sep 2026 17:01:43 +0200 Subject: [PATCH 2/3] Match gh repository resolution behavior Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- pkg/repository/repository.go | 9 ++++-- pkg/repository/repository_test.go | 54 ++++++++++++++++++++++--------- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/pkg/repository/repository.go b/pkg/repository/repository.go index 999521f4..19d0f730 100644 --- a/pkg/repository/repository.go +++ b/pkg/repository/repository.go @@ -151,10 +151,15 @@ func Current() (Repository, error) { rem := filteredRemotes[0] for _, candidate := range filteredRemotes { - if candidate.Resolved != "" { + if candidate.Resolved == "" { + continue + } + if candidate.Resolved == "base" { rem = candidate - break + } else { + return ParseWithHost(candidate.Resolved, candidate.Host) } + break } r.Host = rem.Host r.Owner = rem.Owner diff --git a/pkg/repository/repository_test.go b/pkg/repository/repository_test.go index 7c76e20a..a622074e 100644 --- a/pkg/repository/repository_test.go +++ b/pkg/repository/repository_test.go @@ -1,12 +1,12 @@ package repository import ( - "os" "testing" "github.com/cli/go-gh/v2/internal/git" "github.com/cli/go-gh/v2/internal/testutils" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestParse(t *testing.T) { @@ -192,31 +192,55 @@ func TestParseWithHost(t *testing.T) { } } -func TestCurrentPrefersResolvedRemote(t *testing.T) { +func TestCurrentUsesResolvedBaseRemote(t *testing.T) { + // Given a higher-ranked fork remote and a parent remote selected by gh + t.Setenv("GH_REPO", "") testutils.StubConfig(t, ` hosts: github.com: oauth_token: token `) - - tempDir := t.TempDir() - oldWd, err := os.Getwd() - assert.NoError(t, err) - assert.NoError(t, os.Chdir(tempDir)) - t.Cleanup(func() { _ = os.Chdir(oldWd) }) - - _, _, err = git.Exec("init", "--quiet") - assert.NoError(t, err) + t.Chdir(t.TempDir()) + _, _, err := git.Exec("init", "--quiet") + require.NoError(t, err) _, _, err = git.Exec("remote", "add", "origin", "git@github.com:parent-org/example.git") - assert.NoError(t, err) + require.NoError(t, err) _, _, err = git.Exec("remote", "add", "github", "git@github.com:my-user/example.git") - assert.NoError(t, err) + require.NoError(t, err) _, _, err = git.Exec("config", "remote.origin.gh-resolved", "base") - assert.NoError(t, err) + require.NoError(t, err) + // When the current repository is resolved repository, err := Current() - assert.NoError(t, err) + // Then the remote selected by gh is used instead of the name-based ranking + require.NoError(t, err) + assert.Equal(t, "github.com", repository.Host) + assert.Equal(t, "parent-org", repository.Owner) + assert.Equal(t, "example", repository.Name) +} + +func TestCurrentUsesExplicitResolvedRepository(t *testing.T) { + // Given a remote whose gh resolution names a different repository + t.Setenv("GH_REPO", "") + testutils.StubConfig(t, ` +hosts: + github.com: + oauth_token: token +`) + t.Chdir(t.TempDir()) + _, _, err := git.Exec("init", "--quiet") + require.NoError(t, err) + _, _, err = git.Exec("remote", "add", "origin", "git@github.com:my-user/example.git") + require.NoError(t, err) + _, _, err = git.Exec("config", "remote.origin.gh-resolved", "parent-org/example") + require.NoError(t, err) + + // When the current repository is resolved + repository, err := Current() + + // Then the explicit repository is returned on the remote's host + require.NoError(t, err) assert.Equal(t, "github.com", repository.Host) assert.Equal(t, "parent-org", repository.Owner) assert.Equal(t, "example", repository.Name) From b361698c96cb680f8d7571af879bbb8477fb4523 Mon Sep 17 00:00:00 2001 From: William Martin Date: Mon, 14 Sep 2026 17:11:01 +0200 Subject: [PATCH 3/3] Match resolved repository host behavior Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- pkg/repository/repository.go | 7 ++++++- pkg/repository/repository_test.go | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/pkg/repository/repository.go b/pkg/repository/repository.go index 19d0f730..008dd43f 100644 --- a/pkg/repository/repository.go +++ b/pkg/repository/repository.go @@ -157,7 +157,12 @@ func Current() (Repository, error) { if candidate.Resolved == "base" { rem = candidate } else { - return ParseWithHost(candidate.Resolved, candidate.Host) + resolved, err := ParseWithHost(candidate.Resolved, candidate.Host) + if err != nil { + return r, err + } + resolved.Host = candidate.Host + return resolved, nil } break } diff --git a/pkg/repository/repository_test.go b/pkg/repository/repository_test.go index a622074e..f441a198 100644 --- a/pkg/repository/repository_test.go +++ b/pkg/repository/repository_test.go @@ -221,7 +221,7 @@ hosts: } func TestCurrentUsesExplicitResolvedRepository(t *testing.T) { - // Given a remote whose gh resolution names a different repository + // Given a remote whose gh resolution names a repository on a different host t.Setenv("GH_REPO", "") testutils.StubConfig(t, ` hosts: @@ -233,13 +233,13 @@ hosts: require.NoError(t, err) _, _, err = git.Exec("remote", "add", "origin", "git@github.com:my-user/example.git") require.NoError(t, err) - _, _, err = git.Exec("config", "remote.origin.gh-resolved", "parent-org/example") + _, _, err = git.Exec("config", "remote.origin.gh-resolved", "ghe.example/parent-org/example") require.NoError(t, err) // When the current repository is resolved repository, err := Current() - // Then the explicit repository is returned on the remote's host + // Then the explicit repository is returned using the remote's host require.NoError(t, err) assert.Equal(t, "github.com", repository.Host) assert.Equal(t, "parent-org", repository.Owner)