11package command
22
33import (
4- "errors"
54 "fmt"
65 "net/url"
7- "sort"
86 "time"
97
108 "github.com/cli/cli/api"
@@ -29,7 +27,7 @@ func prCreate(cmd *cobra.Command, _ []string) error {
2927 }
3028
3129 baseRepoOverride , _ := cmd .Flags ().GetString ("repo" )
32- repoContext , err := resolveRemotesToRepos (remotes , client , baseRepoOverride )
30+ repoContext , err := context . ResolveRemotesToRepos (remotes , client , baseRepoOverride )
3331 if err != nil {
3432 return err
3533 }
@@ -229,97 +227,3 @@ func init() {
229227 "The branch into which you want your code merged" )
230228 prCreateCmd .Flags ().BoolP ("web" , "w" , false , "Open the web browser to create a pull request" )
231229}
232-
233- // cap the number of git remotes looked up, since the user might have an
234- // unusally large number of git remotes
235- const maxRemotesForLookup = 5
236-
237- func resolveRemotesToRepos (remotes context.Remotes , client * api.Client , base string ) (resolvedRemotes , error ) {
238- sort .Stable (remotes )
239- lenRemotesForLookup := len (remotes )
240- if lenRemotesForLookup > maxRemotesForLookup {
241- lenRemotesForLookup = maxRemotesForLookup
242- }
243-
244- hasBaseOverride := base != ""
245- baseOverride := ghrepo .FromFullName (base )
246- foundBaseOverride := false
247- repos := []ghrepo.Interface {}
248- for _ , r := range remotes [:lenRemotesForLookup ] {
249- repos = append (repos , r )
250- if ghrepo .IsSame (r , baseOverride ) {
251- foundBaseOverride = true
252- }
253- }
254- if hasBaseOverride && ! foundBaseOverride {
255- // additionally, look up the explicitly specified base repo if it's not
256- // already covered by git remotes
257- repos = append (repos , baseOverride )
258- }
259-
260- result := resolvedRemotes {remotes : remotes }
261- if hasBaseOverride {
262- result .baseOverride = baseOverride
263- }
264- networkResult , err := api .RepoNetwork (client , repos )
265- if err != nil {
266- return result , err
267- }
268- result .network = networkResult
269- return result , nil
270- }
271-
272- type resolvedRemotes struct {
273- baseOverride ghrepo.Interface
274- remotes context.Remotes
275- network api.RepoNetworkResult
276- }
277-
278- // BaseRepo is the first found repository in the "upstream", "github", "origin"
279- // git remote order, resolved to the parent repo if the git remote points to a fork
280- func (r resolvedRemotes ) BaseRepo () (* api.Repository , error ) {
281- if r .baseOverride != nil {
282- for _ , repo := range r .network .Repositories {
283- if repo != nil && ghrepo .IsSame (repo , r .baseOverride ) {
284- return repo , nil
285- }
286- }
287- return nil , fmt .Errorf ("failed looking up information about the '%s' repository" ,
288- ghrepo .FullName (r .baseOverride ))
289- }
290-
291- for _ , repo := range r .network .Repositories {
292- if repo == nil {
293- continue
294- }
295- if repo .IsFork () {
296- return repo .Parent , nil
297- }
298- return repo , nil
299- }
300-
301- return nil , errors .New ("not found" )
302- }
303-
304- // HeadRepo is the first found repository that has push access
305- func (r resolvedRemotes ) HeadRepo () (* api.Repository , error ) {
306- for _ , repo := range r .network .Repositories {
307- if repo != nil && repo .ViewerCanPush () {
308- return repo , nil
309- }
310- }
311- return nil , errors .New ("none of the repositories have push access" )
312- }
313-
314- // RemoteForRepo finds the git remote that points to a repository
315- func (r resolvedRemotes ) RemoteForRepo (repo ghrepo.Interface ) (* context.Remote , error ) {
316- for i , remote := range r .remotes {
317- if ghrepo .IsSame (remote , repo ) ||
318- // additionally, look up the resolved repository name in case this
319- // git remote points to this repository via a redirect
320- (r .network .Repositories [i ] != nil && ghrepo .IsSame (r .network .Repositories [i ], repo )) {
321- return remote , nil
322- }
323- }
324- return nil , errors .New ("not found" )
325- }
0 commit comments