X Tutup
Skip to content

Commit 22be13d

Browse files
committed
move resolveRemotesToRepos to context
1 parent f0d8c65 commit 22be13d

File tree

2 files changed

+97
-97
lines changed

2 files changed

+97
-97
lines changed

command/pr_create.go

Lines changed: 1 addition & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package command
22

33
import (
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-
}

context/context.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package context
22

33
import (
44
"errors"
5+
"fmt"
56
"path"
7+
"sort"
68

79
"github.com/cli/cli/api"
810
"github.com/cli/cli/git"
@@ -22,6 +24,100 @@ type Context interface {
2224
SetBaseRepo(string)
2325
}
2426

27+
// cap the number of git remotes looked up, since the user might have an
28+
// unusally large number of git remotes
29+
const maxRemotesForLookup = 5
30+
31+
func ResolveRemotesToRepos(remotes Remotes, client *api.Client, base string) (ResolvedRemotes, error) {
32+
sort.Stable(remotes)
33+
lenRemotesForLookup := len(remotes)
34+
if lenRemotesForLookup > maxRemotesForLookup {
35+
lenRemotesForLookup = maxRemotesForLookup
36+
}
37+
38+
hasBaseOverride := base != ""
39+
baseOverride := ghrepo.FromFullName(base)
40+
foundBaseOverride := false
41+
repos := []ghrepo.Interface{}
42+
for _, r := range remotes[:lenRemotesForLookup] {
43+
repos = append(repos, r)
44+
if ghrepo.IsSame(r, baseOverride) {
45+
foundBaseOverride = true
46+
}
47+
}
48+
if hasBaseOverride && !foundBaseOverride {
49+
// additionally, look up the explicitly specified base repo if it's not
50+
// already covered by git remotes
51+
repos = append(repos, baseOverride)
52+
}
53+
54+
result := ResolvedRemotes{remotes: remotes}
55+
if hasBaseOverride {
56+
result.baseOverride = baseOverride
57+
}
58+
networkResult, err := api.RepoNetwork(client, repos)
59+
if err != nil {
60+
return result, err
61+
}
62+
result.network = networkResult
63+
return result, nil
64+
}
65+
66+
type ResolvedRemotes struct {
67+
baseOverride ghrepo.Interface
68+
remotes Remotes
69+
network api.RepoNetworkResult
70+
}
71+
72+
// BaseRepo is the first found repository in the "upstream", "github", "origin"
73+
// git remote order, resolved to the parent repo if the git remote points to a fork
74+
func (r ResolvedRemotes) BaseRepo() (*api.Repository, error) {
75+
if r.baseOverride != nil {
76+
for _, repo := range r.network.Repositories {
77+
if repo != nil && ghrepo.IsSame(repo, r.baseOverride) {
78+
return repo, nil
79+
}
80+
}
81+
return nil, fmt.Errorf("failed looking up information about the '%s' repository",
82+
ghrepo.FullName(r.baseOverride))
83+
}
84+
85+
for _, repo := range r.network.Repositories {
86+
if repo == nil {
87+
continue
88+
}
89+
if repo.IsFork() {
90+
return repo.Parent, nil
91+
}
92+
return repo, nil
93+
}
94+
95+
return nil, errors.New("not found")
96+
}
97+
98+
// HeadRepo is the first found repository that has push access
99+
func (r ResolvedRemotes) HeadRepo() (*api.Repository, error) {
100+
for _, repo := range r.network.Repositories {
101+
if repo != nil && repo.ViewerCanPush() {
102+
return repo, nil
103+
}
104+
}
105+
return nil, errors.New("none of the repositories have push access")
106+
}
107+
108+
// RemoteForRepo finds the git remote that points to a repository
109+
func (r ResolvedRemotes) RemoteForRepo(repo ghrepo.Interface) (*Remote, error) {
110+
for i, remote := range r.remotes {
111+
if ghrepo.IsSame(remote, repo) ||
112+
// additionally, look up the resolved repository name in case this
113+
// git remote points to this repository via a redirect
114+
(r.network.Repositories[i] != nil && ghrepo.IsSame(r.network.Repositories[i], repo)) {
115+
return remote, nil
116+
}
117+
}
118+
return nil, errors.New("not found")
119+
}
120+
25121
type OnlineContext interface {
26122
Context
27123
ParentRepos() ([]ghrepo.Interface, error)

0 commit comments

Comments
 (0)
X Tutup