From 5913edb64c778de7a8ce9b695813660926a81c75 Mon Sep 17 00:00:00 2001 From: Peter Matseykanets Date: Sun, 10 Jan 2021 23:23:57 -0500 Subject: [PATCH] gh-pr: Output PR url when the remote branch exists (#15) Additionally: - `RepoFinder`: fetch max possible repos per request --- cmd/gh-pr/main.go | 37 +++++++++++++++++++++++++++++++++++-- github/repo.go | 18 +++++++++--------- version/version.go | 2 +- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/cmd/gh-pr/main.go b/cmd/gh-pr/main.go index dc98eb9..ab2f77a 100644 --- a/cmd/gh-pr/main.go +++ b/cmd/gh-pr/main.go @@ -312,7 +312,12 @@ func (p *prmaker) create(ctx context.Context) error { _, resp, err := p.gh.Repositories.GetBranch(ctx, p.config.owner, repo.GetName(), p.config.branch) switch err { case nil: - fmt.Fprintln(p.stderr, repo.GetFullName(), "The remote branch already exists") + pullURL := "" + pull, err := p.getPullForBranch(ctx, repo, p.config.branch) + if err == nil { + pullURL = pull.GetHTMLURL() + } + fmt.Fprintln(p.stderr, repo.GetFullName(), "The remote branch already exists", pullURL) continue default: if resp != nil && resp.StatusCode != http.StatusNotFound { @@ -368,7 +373,35 @@ func (p *prmaker) create(ctx context.Context) error { return nil } -var errNoChanges = fmt.Errorf("no changes") +func (p *prmaker) getPullForBranch(ctx context.Context, repo *github.Repository, branch string) (*github.PullRequest, error) { + var ( + pulls []*github.PullRequest + resp *github.Response + err error + opts = &github.PullRequestListOptions{ListOptions: github.ListOptions{PerPage: 100}} + ) + for { + pulls, resp, err = p.gh.PullRequests.List(ctx, p.config.owner, repo.GetName(), opts) + if err != nil { + return nil, fmt.Errorf("%s: can't read pull requests: %s", repo.GetName(), err) + } + + for _, pull := range pulls { + if pull.GetHead().GetRef() == branch { + return pull, nil + } + } + + if resp.NextPage == 0 { + break + } + opts.Page = resp.NextPage + } + + return nil, nil +} + +var errNoChanges = fmt.Errorf("no changes were made") func (p *prmaker) apply(ctx context.Context, repo *github.Repository, scriptPath string) error { dir, err := ioutil.TempDir("", "gh-pr") diff --git a/github/repo.go b/github/repo.go index 213a5b3..67df7fb 100644 --- a/github/repo.go +++ b/github/repo.go @@ -62,9 +62,11 @@ func (f *RepoFinder) Find(ctx context.Context, filter RepoFilter) ([]*github.Rep return repos, err } +var listOptions = github.ListOptions{PerPage: 100} + func (f *RepoFinder) userRepos(ctx context.Context, filter RepoFilter) ([]*github.Repository, error) { - opt := &github.RepositoryListOptions{ - ListOptions: github.ListOptions{PerPage: 30}, + opts := &github.RepositoryListOptions{ + ListOptions: listOptions, Affiliation: "owner", } var ( @@ -73,7 +75,7 @@ func (f *RepoFinder) userRepos(ctx context.Context, filter RepoFilter) ([]*githu err error ) for { - repos, resp, err = f.Client.Repositories.List(ctx, filter.Owner, opt) + repos, resp, err = f.Client.Repositories.List(ctx, filter.Owner, opts) if err != nil { return nil, fmt.Errorf("can't read repositories: %s", err) } @@ -83,23 +85,21 @@ func (f *RepoFinder) userRepos(ctx context.Context, filter RepoFilter) ([]*githu if resp.NextPage == 0 { break } - opt.Page = resp.NextPage + opts.Page = resp.NextPage } return filtered, nil } func (f *RepoFinder) orgRepos(ctx context.Context, filter RepoFilter) ([]*github.Repository, error) { - opt := &github.RepositoryListByOrgOptions{ - ListOptions: github.ListOptions{PerPage: 30}, - } + opts := &github.RepositoryListByOrgOptions{ListOptions: listOptions} var ( filtered, repos []*github.Repository resp *github.Response err error ) for { - repos, resp, err = f.Client.Repositories.ListByOrg(ctx, filter.Owner, opt) + repos, resp, err = f.Client.Repositories.ListByOrg(ctx, filter.Owner, opts) if err != nil { return nil, fmt.Errorf("can't read repositories: %s", err) } @@ -109,7 +109,7 @@ func (f *RepoFinder) orgRepos(ctx context.Context, filter RepoFilter) ([]*github if resp.NextPage == 0 { break } - opt.Page = resp.NextPage + opts.Page = resp.NextPage } return filtered, nil diff --git a/version/version.go b/version/version.go index 867e8ab..4f53505 100644 --- a/version/version.go +++ b/version/version.go @@ -1,3 +1,3 @@ package version -var Version = "0.6.1" +var Version = "0.6.2"