Support auto detecting branch for PRs #525

Open
harryzcy wants to merge 17 commits from harryzcy/tea:fix-524 into main
3 changed files with 120 additions and 12 deletions

View File

@ -4,11 +4,11 @@
package pulls
import (
"fmt"
"code.gitea.io/sdk/gitea"
"code.gitea.io/tea/cmd/flags"
"code.gitea.io/tea/modules/context"
"code.gitea.io/tea/modules/interact"
"code.gitea.io/tea/modules/task"
"code.gitea.io/tea/modules/utils"
"github.com/urfave/cli/v2"
@ -44,7 +44,8 @@ var CmdPullsMerge = cli.Command{
ctx.Ensure(context.CtxRequirement{RemoteRepo: true})
if ctx.Args().Len() != 1 {
return fmt.Errorf("Must specify a PR index")
// If no PR index is provided, try interactive mode
return interact.MergePull(ctx)
}
idx, err := utils.ArgToIndex(ctx.Args().First())
@ -52,18 +53,10 @@ var CmdPullsMerge = cli.Command{
return err
}
success, _, err := ctx.Login.Client().MergePullRequest(ctx.Owner, ctx.Repo, idx, gitea.MergePullRequestOption{
return task.PullMerge(ctx.Login, ctx.Owner, ctx.Repo, idx, gitea.MergePullRequestOption{
Style: gitea.MergeStyle(ctx.String("style")),
Title: ctx.String("title"),
lunny marked this conversation as resolved
Review
if ctx.Args().Len() != 1 {
  return interact.MergePull(ctx)
}

for more readable.

```go if ctx.Args().Len() != 1 { return interact.MergePull(ctx) } ``` for more readable.
Review

Fixed in 9fdfb1

Fixed in [9fdfb1](https://gitea.com/gitea/tea/commit/9fdfb1debca52f14bffeb68290a99e1ceadd202a)
Message: ctx.String("message"),
})
if err != nil {
return err
}
if !success {
return fmt.Errorf("Failed to merge PR. Is it still open?")
}
return nil
},
}

View File

@ -0,0 +1,90 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
lunny marked this conversation as resolved Outdated

change to 2023?

change to 2023?

Fixed in 96ccce

Fixed in [96ccce](https://gitea.com/gitea/tea/commit/96cccedd3767ff5caa231edb1458d7652b3d6807)
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package interact
import (
"fmt"
"strings"
"code.gitea.io/sdk/gitea"
"code.gitea.io/tea/modules/context"
"code.gitea.io/tea/modules/task"
"code.gitea.io/tea/modules/utils"
"github.com/AlecAivazis/survey/v2"
)
// MergePull interactively creates a PR
func MergePull(ctx *context.TeaContext) error {
if ctx.LocalRepo == nil {
return fmt.Errorf("Must specify a PR index")
}
branch, _, err := ctx.LocalRepo.TeaGetCurrentBranchNameAndSHA()
if err != nil {
return err
}
idx, err := getPullIndex(ctx, branch)
if err != nil {
return err
}
return task.PullMerge(ctx.Login, ctx.Owner, ctx.Repo, idx, gitea.MergePullRequestOption{
Style: gitea.MergeStyle(ctx.String("style")),
Title: ctx.String("title"),
Message: ctx.String("message"),
})
}
// getPullIndex interactively determines the PR index
func getPullIndex(ctx *context.TeaContext, branch string) (int64, error) {
prs, _, err := ctx.Login.Client().ListRepoPullRequests(ctx.Owner, ctx.Repo, gitea.ListPullRequestsOptions{
Review

paginate over api ...

paginate over api ...
State: gitea.StateOpen,
})
if err != nil {
return 0, err
}
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
}
// get the index from the selected option
before, _, _ := strings.Cut(selected, ":")
before = strings.TrimPrefix(before, "#")
idx, err := utils.ArgToIndex(before)
if err != nil {
return 0, err
}
return idx, nil
}

View File

@ -0,0 +1,25 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
lunny marked this conversation as resolved Outdated

change to 2023

change to 2023

Fixed in 96ccce

Fixed in [96ccce](https://gitea.com/gitea/tea/commit/96cccedd3767ff5caa231edb1458d7652b3d6807)
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package task
import (
"fmt"
"code.gitea.io/sdk/gitea"
"code.gitea.io/tea/modules/config"
)
// PullMerge merges a PR
func PullMerge(login *config.Login, repoOwner, repoName string, index int64, opt gitea.MergePullRequestOption) error {
client := login.Client()
success, _, err := client.MergePullRequest(repoOwner, repoName, index, opt)
if err != nil {
return err
}
if !success {
return fmt.Errorf("Failed to merge PR. Is it still open?")
}
return nil
}