mirror of
https://gitea.com/gitea/tea.git
synced 2026-09-10 07:26:33 -04:00
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>
90 lines
2.3 KiB
Go
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
|
|
}
|