gitea.tea/cmd/pulls/request_review.go
Ross Golder f4b549b538
feat(pulls): add reviewer-request subcommands and create-time flags (#571)
Closes #571. Adds three pieces:

- 'tea pulls create --reviewer <user>[,<user>...] [--team-reviewer <team>...]'
  to request reviews at PR-creation time (passes through to
  CreatePullRequestOption.Reviewers / TeamReviewers).
- 'tea pulls request-review <idx> [<idx>...]' / 'tea pulls cancel-review ...'
  subcommands wrapping POST/DELETE /requested_reviewers, with both
  --reviewer and --team-reviewer CSV flags.
- 'tea pulls reviewers' listing subcommand (GET /reviewers) so users can
  discover who can be requested before they invoke the above.

The WIP/draft toggle was deliberately deferred: upstream main already
exposes 'tea pulls create --draft' and 'tea pulls edit --draft/--ready'
(PR #1008), so this patch stays focused on reviewer support only.

Verification:
  make fmt fmt-check vet lint test docs docs-check build
  ./tea pulls create --help / request-review --help / cancel-review --help / reviewers --help

Signed-off-by: Ross Golder <ross@golder.org>
2026-09-05 09:53:32 +07:00

90 lines
2.3 KiB
Go

// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package pulls
import (
stdctx "context"
"errors"
"fmt"
gitea "gitea.dev/sdk"
"github.com/urfave/cli/v3"
"gitea.dev/tea/cmd/flags"
"gitea.dev/tea/modules/context"
"gitea.dev/tea/modules/utils"
)
// ReviewerFlag is a CSV flag listing usernames to request review from.
// Note: no short alias because 'R' is already taken by --remote (see
// flags.RemoteFlag) and 'r' by --repo (see flags.RepoFlag).
var ReviewerFlag = flags.NewCsvFlag(
"reviewer",
"usernames to request review from",
nil,
nil, nil,
)
// TeamReviewerFlag is a CSV flag listing team names to request review from
var TeamReviewerFlag = flags.NewCsvFlag(
"team-reviewer",
"team names to request review from",
[]string{"T"},
nil, nil,
)
// CmdPullsRequestReview requests reviews from users or teams on one or more PRs
var CmdPullsRequestReview = cli.Command{
Name: "request-review",
Aliases: []string{"rr"},
Usage: "Request reviews from users or teams on a pull request",
Description: `Calls POST /repos/{owner}/{repo}/pulls/{index}/requested_reviewers.
At least one of --reviewer or --team-reviewer is required.`,
ArgsUsage: "<pull index> [<pull index>...]",
Action: runRequestReview,
Flags: append([]cli.Flag{
ReviewerFlag,
TeamReviewerFlag,
}, flags.AllDefaultFlags...),
}
func runRequestReview(requestCtx stdctx.Context, cmd *cli.Command) error {
ctx, err := context.InitCommand(cmd)
if err != nil {
return err
}
if err := ctx.Ensure(context.CtxRequirement{RemoteRepo: true}); err != nil {
return err
}
reviewers, err := ReviewerFlag.GetValues(cmd)
if err != nil {
return err
}
teamReviewers, err := TeamReviewerFlag.GetValues(cmd)
if err != nil {
return err
}
if len(reviewers) == 0 && len(teamReviewers) == 0 {
return errors.New("at least one of --reviewer or --team-reviewer is required")
}
indices, err := utils.ArgsToIndices(cmd.Args().Slice())
if err != nil {
return err
}
client := ctx.Login.Client()
for _, idx := range indices {
if _, err := client.PullRequests.CreateReviewRequests(requestCtx, ctx.Owner, ctx.Repo, idx, gitea.PullReviewRequestOptions{
Reviewers: reviewers,
TeamReviewers: teamReviewers,
}); err != nil {
return err
}
fmt.Printf("PR#%d: requested reviewers %v, teams %v\n", idx, reviewers, teamReviewers)
}
return nil
}