paginate PRs
This commit is contained in:
parent
b494ce0c83
commit
6d76ff3be5
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user