Skip to content

Commit 22a5d2a

Browse files
committed
Refactor code to live inside default pkg
1 parent 9060b44 commit 22a5d2a

File tree

8 files changed

+598
-277
lines changed

8 files changed

+598
-277
lines changed

context/context.go

Lines changed: 44 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package context
44
import (
55
"errors"
66
"sort"
7+
"strings"
78

89
"github.com/AlecAivazis/survey/v2"
910
"github.com/cli/cli/v2/api"
@@ -59,93 +60,6 @@ type ResolvedRemotes struct {
5960
apiClient *api.Client
6061
}
6162

62-
func GetBaseRepo(remotes Remotes) (ghrepo.Interface, error) {
63-
for _, r := range remotes {
64-
if r.Resolved == "base" {
65-
return r, nil
66-
} else if r.Resolved != "" {
67-
repo, err := ghrepo.FromFullName(r.Resolved)
68-
if err != nil {
69-
return nil, err
70-
}
71-
return ghrepo.NewWithHost(repo.RepoOwner(), repo.RepoName(), r.RepoHost()), nil
72-
}
73-
}
74-
return nil, errors.New("a default repo has not been set, use `gh repo default` to set a default repo")
75-
}
76-
77-
func (r *ResolvedRemotes) SetBaseRepo(io *iostreams.IOStreams) error {
78-
resolution := "base"
79-
if !io.CanPrompt() {
80-
return git.SetRemoteResolution(r.remotes[0].Name, resolution)
81-
}
82-
83-
// from here on, consult the API
84-
if r.network == nil {
85-
err := resolveNetwork(r)
86-
if err != nil {
87-
return err
88-
}
89-
}
90-
91-
var repoNames []string
92-
repoMap := map[string]*api.Repository{}
93-
add := func(r *api.Repository) {
94-
fn := ghrepo.FullName(r)
95-
if _, ok := repoMap[fn]; !ok {
96-
repoMap[fn] = r
97-
repoNames = append(repoNames, fn)
98-
}
99-
}
100-
101-
for _, repo := range r.network.Repositories {
102-
if repo == nil {
103-
continue
104-
}
105-
if repo.Parent != nil {
106-
add(repo.Parent)
107-
}
108-
add(repo)
109-
}
110-
111-
if len(repoNames) == 0 {
112-
return git.SetRemoteResolution(r.remotes[0].Name, resolution)
113-
}
114-
115-
baseName := repoNames[0]
116-
if len(repoNames) > 1 {
117-
err := prompt.SurveyAskOne(&survey.Select{
118-
Message: "Which should be the base repository (used for e.g. querying issues) for this directory?",
119-
Options: repoNames,
120-
}, &baseName)
121-
if err != nil {
122-
return err
123-
}
124-
}
125-
126-
// determine corresponding git remote
127-
selectedRepo := repoMap[baseName]
128-
remote, _ := r.RemoteForRepo(selectedRepo)
129-
if remote == nil {
130-
remote = r.remotes[0]
131-
resolution = ghrepo.FullName(selectedRepo)
132-
}
133-
134-
// cache the result to git config
135-
return git.SetRemoteResolution(remote.Name, resolution)
136-
}
137-
138-
func RemoveBaseRepo(remotes Remotes) error {
139-
for _, remote := range remotes {
140-
if remote.Resolved == "base" {
141-
if err := git.UnsetRemoteResolution(remote.Remote.Name); err != nil {
142-
return err
143-
}
144-
}
145-
}
146-
return nil
147-
}
148-
14963
func (r *ResolvedRemotes) BaseRepo(io *iostreams.IOStreams) (ghrepo.Interface, error) {
15064
if r.baseOverride != nil {
15165
return r.baseOverride, nil
@@ -169,36 +83,18 @@ func (r *ResolvedRemotes) BaseRepo(io *iostreams.IOStreams) (ghrepo.Interface, e
16983
return r.remotes[0], nil
17084
}
17185

172-
// from here on, consult the API
173-
if r.network == nil {
174-
err := resolveNetwork(r)
175-
if err != nil {
176-
return nil, err
177-
}
86+
repos, err := r.NetworkRepos()
87+
if err != nil {
88+
return nil, err
17889
}
17990

180-
var repoNames []string
181-
repoMap := map[string]*api.Repository{}
182-
add := func(r *api.Repository) {
183-
fn := ghrepo.FullName(r)
184-
if _, ok := repoMap[fn]; !ok {
185-
repoMap[fn] = r
186-
repoNames = append(repoNames, fn)
187-
}
188-
}
189-
190-
for _, repo := range r.network.Repositories {
191-
if repo == nil {
192-
continue
193-
}
194-
if repo.Parent != nil {
195-
add(repo.Parent)
196-
}
197-
add(repo)
91+
if len(repos) == 0 {
92+
return r.remotes[0], nil
19893
}
19994

200-
if len(repoNames) == 0 {
201-
return r.remotes[0], nil
95+
var repoNames []string
96+
for _, r := range repos {
97+
repoNames = append(repoNames, ghrepo.FullName(r))
20298
}
20399

204100
baseName := repoNames[0]
@@ -216,7 +112,8 @@ func (r *ResolvedRemotes) BaseRepo(io *iostreams.IOStreams) (ghrepo.Interface, e
216112
}
217113

218114
// determine corresponding git remote
219-
selectedRepo := repoMap[baseName]
115+
owner, repo, _ := strings.Cut(baseName, "/")
116+
selectedRepo := ghrepo.New(owner, repo)
220117
resolution := "base"
221118
remote, _ := r.RemoteForRepo(selectedRepo)
222119
if remote == nil {
@@ -225,7 +122,7 @@ func (r *ResolvedRemotes) BaseRepo(io *iostreams.IOStreams) (ghrepo.Interface, e
225122
}
226123

227124
// cache the result to git config
228-
err := git.SetRemoteResolution(remote.Name, resolution)
125+
err = git.SetRemoteResolution(remote.Name, resolution)
229126
return selectedRepo, err
230127
}
231128

@@ -246,6 +143,38 @@ func (r *ResolvedRemotes) HeadRepos() ([]*api.Repository, error) {
246143
return results, nil
247144
}
248145

146+
func (r *ResolvedRemotes) NetworkRepos() ([]*api.Repository, error) {
147+
if r.network == nil {
148+
err := resolveNetwork(r)
149+
if err != nil {
150+
return nil, err
151+
}
152+
}
153+
154+
var repos []*api.Repository
155+
repoMap := map[string]bool{}
156+
157+
add := func(r *api.Repository) {
158+
fn := ghrepo.FullName(r)
159+
if _, ok := repoMap[fn]; !ok {
160+
repoMap[fn] = true
161+
repos = append(repos, r)
162+
}
163+
}
164+
165+
for _, repo := range r.network.Repositories {
166+
if repo == nil {
167+
continue
168+
}
169+
if repo.Parent != nil {
170+
add(repo.Parent)
171+
}
172+
add(repo)
173+
}
174+
175+
return repos, nil
176+
}
177+
249178
// RemoteForRepo finds the git remote that points to a repository
250179
func (r *ResolvedRemotes) RemoteForRepo(repo ghrepo.Interface) (*Remote, error) {
251180
for _, remote := range r.remotes {

context/remote.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func (r Remotes) FindByName(names ...string) (*Remote, error) {
2121
}
2222
}
2323
}
24-
return nil, fmt.Errorf("no GitHub remotes found")
24+
return nil, fmt.Errorf("no matching remote found")
2525
}
2626

2727
// FindByRepo returns the first Remote that points to a specific GitHub repository
@@ -34,6 +34,29 @@ func (r Remotes) FindByRepo(owner, name string) (*Remote, error) {
3434
return nil, fmt.Errorf("no matching remote found")
3535
}
3636

37+
// Filter remotes by given hostnames, maintains original order
38+
func (r Remotes) FilterByHosts(hosts []string) Remotes {
39+
filtered := make(Remotes, 0)
40+
for _, rr := range r {
41+
for _, host := range hosts {
42+
if strings.EqualFold(rr.RepoHost(), host) {
43+
filtered = append(filtered, rr)
44+
break
45+
}
46+
}
47+
}
48+
return filtered
49+
}
50+
51+
func (r Remotes) ResolvedRemote() (*Remote, error) {
52+
for _, rr := range r {
53+
if rr.Resolved != "" {
54+
return rr, nil
55+
}
56+
}
57+
return nil, fmt.Errorf("no resolved remote found")
58+
}
59+
3760
func remoteNameSortScore(name string) int {
3861
switch strings.ToLower(name) {
3962
case "upstream":
@@ -54,20 +77,6 @@ func (r Remotes) Less(i, j int) bool {
5477
return remoteNameSortScore(r[i].Name) > remoteNameSortScore(r[j].Name)
5578
}
5679

57-
// Filter remotes by given hostnames, maintains original order
58-
func (r Remotes) FilterByHosts(hosts []string) Remotes {
59-
filtered := make(Remotes, 0)
60-
for _, rr := range r {
61-
for _, host := range hosts {
62-
if strings.EqualFold(rr.RepoHost(), host) {
63-
filtered = append(filtered, rr)
64-
break
65-
}
66-
}
67-
}
68-
return filtered
69-
}
70-
7180
// Remote represents a git remote mapped to a GitHub repository
7281
type Remote struct {
7382
*git.Remote

git/fixtures/simple.git/config

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,3 @@
77
[user]
88
name = Mona the Cat
99
email = monalisa@github.com
10-
[remote "origin"]
11-
url = git@github.com:monathecat/cli.git
12-
fetch = +refs/heads/*:refs/remotes/origin/*
13-
[remote "upstream"]
14-
url = git@github.com:cli/cli.git
15-
fetch = +refs/heads/trunk:refs/remotes/upstream/trunk

git/git.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,6 @@ func ToplevelDir() (string, error) {
394394
}
395395
output, err := run.PrepareCmd(showCmd).Output()
396396
return firstLine(output), err
397-
398397
}
399398

400399
// ToplevelDirFromPath returns the top-level given path of the current repository
@@ -439,3 +438,16 @@ func getBranchShortName(output []byte) string {
439438
branch := firstLine(output)
440439
return strings.TrimPrefix(branch, "refs/heads/")
441440
}
441+
442+
func IsGitDirectory() bool {
443+
showCmd, err := GitCommand("rev-parse", "--is-inside-work-tree")
444+
if err != nil {
445+
return false
446+
}
447+
output, err := run.PrepareCmd(showCmd).Output()
448+
if err != nil {
449+
return false
450+
}
451+
out := firstLine(output)
452+
return out == "true"
453+
}

git/remote.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ func SetRemoteResolution(name, resolution string) error {
169169
}
170170

171171
func UnsetRemoteResolution(name string) error {
172-
unsetCmd, err := GitCommand("config", "--unset-all", fmt.Sprintf("remote.%s.gh-resolved", name))
172+
unsetCmd, err := GitCommand("config", "--unset", fmt.Sprintf("remote.%s.gh-resolved", name))
173173
if err != nil {
174174
return err
175175
}

0 commit comments

Comments
 (0)