diff --git a/modules/interact/pull_merge.go b/modules/interact/pull_merge.go index a16bf29..c994274 100644 --- a/modules/interact/pull_merge.go +++ b/modules/interact/pull_merge.go @@ -11,6 +11,7 @@ import ( "code.gitea.io/tea/modules/context" "code.gitea.io/tea/modules/task" "code.gitea.io/tea/modules/utils" + "github.com/AlecAivazis/survey/v2" ) @@ -39,44 +40,54 @@ func MergePull(ctx *context.TeaContext) error { // getPullIndex interactively determines the PR index func getPullIndex(ctx *context.TeaContext, branch string) (int64, error) { - // FIXME: pagination to loop over all PRs. Currently only the first page is shown - // note: for repos with many PRs, this may cause latency - prs, _, err := ctx.Login.Client().ListRepoPullRequests(ctx.Owner, ctx.Repo, gitea.ListPullRequestsOptions{ - State: gitea.StateOpen, - }) - if err != nil { - return 0, err + c := ctx.Login.Client() + opts := gitea.ListPullRequestsOptions{ + State: gitea.StateOpen, + ListOptions: ctx.GetListOptions(), } - if len(prs) == 0 { - return 0, fmt.Errorf("No open PRs found") - } - - prOptions := make([]string, 0) - - // get the PR indexes where head branch is the current branch - for _, pr := range prs { - if pr.Head.Ref == branch { - prOptions = append(prOptions, fmt.Sprintf("#%d: %s", pr.Index, pr.Title)) - } - } - - // then get the PR indexes where base branch is the current branch - for _, pr := range prs { - // don't add the same PR twice, so `pr.Head.Ref != branch` - if pr.Base.Ref == branch && pr.Head.Ref != branch { - prOptions = append(prOptions, fmt.Sprintf("#%d: %s", pr.Index, pr.Title)) - } - } - selected := "" - q := &survey.Select{ - Message: "Select a PR to merge", - Options: prOptions, - PageSize: 10, - } - err = survey.AskOne(q, &selected) - if err != nil { - return 0, err + loadMoreOption := "PR not found? Load more PRs..." + + // paginated fetch + var prs []*gitea.PullRequest + var err error + for { + prs, _, err = c.ListRepoPullRequests(ctx.Owner, ctx.Repo, opts) + if len(prs) == 0 { + return 0, fmt.Errorf("No open PRs found") + } + opts.ListOptions.Page++ + prOptions := make([]string, 0) + + // get the PR indexes where head branch is the current branch + for _, pr := range prs { + if pr.Head.Ref == branch { + prOptions = append(prOptions, fmt.Sprintf("#%d: %s", pr.Index, pr.Title)) + } + } + + // then get the PR indexes where base branch is the current branch + for _, pr := range prs { + // don't add the same PR twice, so `pr.Head.Ref != branch` + if pr.Base.Ref == branch && pr.Head.Ref != branch { + prOptions = append(prOptions, fmt.Sprintf("#%d: %s", pr.Index, pr.Title)) + } + } + + prOptions = append(prOptions, loadMoreOption) + + q := &survey.Select{ + Message: "Select a PR to merge", + Options: prOptions, + PageSize: 10, + } + err = survey.AskOne(q, &selected) + if err != nil { + return 0, err + } + if selected != loadMoreOption { + break + } } // get the index from the selected option