@@ -4,6 +4,7 @@ package context
4
4
import (
5
5
"errors"
6
6
"sort"
7
+ "strings"
7
8
8
9
"github.com/AlecAivazis/survey/v2"
9
10
"github.com/cli/cli/v2/api"
@@ -59,93 +60,6 @@ type ResolvedRemotes struct {
59
60
apiClient * api.Client
60
61
}
61
62
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
-
149
63
func (r * ResolvedRemotes ) BaseRepo (io * iostreams.IOStreams ) (ghrepo.Interface , error ) {
150
64
if r .baseOverride != nil {
151
65
return r .baseOverride , nil
@@ -169,36 +83,18 @@ func (r *ResolvedRemotes) BaseRepo(io *iostreams.IOStreams) (ghrepo.Interface, e
169
83
return r .remotes [0 ], nil
170
84
}
171
85
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
178
89
}
179
90
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
198
93
}
199
94
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 ))
202
98
}
203
99
204
100
baseName := repoNames [0 ]
@@ -216,7 +112,8 @@ func (r *ResolvedRemotes) BaseRepo(io *iostreams.IOStreams) (ghrepo.Interface, e
216
112
}
217
113
218
114
// determine corresponding git remote
219
- selectedRepo := repoMap [baseName ]
115
+ owner , repo , _ := strings .Cut (baseName , "/" )
116
+ selectedRepo := ghrepo .New (owner , repo )
220
117
resolution := "base"
221
118
remote , _ := r .RemoteForRepo (selectedRepo )
222
119
if remote == nil {
@@ -225,7 +122,7 @@ func (r *ResolvedRemotes) BaseRepo(io *iostreams.IOStreams) (ghrepo.Interface, e
225
122
}
226
123
227
124
// cache the result to git config
228
- err : = git .SetRemoteResolution (remote .Name , resolution )
125
+ err = git .SetRemoteResolution (remote .Name , resolution )
229
126
return selectedRepo , err
230
127
}
231
128
@@ -246,6 +143,38 @@ func (r *ResolvedRemotes) HeadRepos() ([]*api.Repository, error) {
246
143
return results , nil
247
144
}
248
145
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
+
249
178
// RemoteForRepo finds the git remote that points to a repository
250
179
func (r * ResolvedRemotes ) RemoteForRepo (repo ghrepo.Interface ) (* Remote , error ) {
251
180
for _ , remote := range r .remotes {
0 commit comments