50 lines
1.6 KiB
Rust
50 lines
1.6 KiB
Rust
//! `pr assign-reviewer <number> <user> [--remove]` — add or remove a
|
|
//! requested reviewer on a PR. Unlike `pr assign-committer` (assignees,
|
|
//! mutate + PATCH the issue) Forgejo has a dedicated endpoint pair for review
|
|
//! requests: `POST /repos/{repo}/pulls/{index}/requested_reviewers`
|
|
//! adds, `DELETE` (same path + body) removes. Requesting a review from
|
|
//! a user who is already requested is a Forgejo-side no-op, so the verb
|
|
//! is idempotent in both directions.
|
|
|
|
use anyhow::Result;
|
|
use clap::Args as ClapArgs;
|
|
use forgejo_api::structs::PullReviewRequestOptions;
|
|
|
|
use crate::client::{Client, index};
|
|
|
|
#[derive(ClapArgs)]
|
|
pub struct Args {
|
|
/// PR number.
|
|
number: u64,
|
|
/// User login to request a review from (or withdraw with `--remove`).
|
|
user: String,
|
|
/// Withdraw the review request instead of adding it.
|
|
#[arg(long)]
|
|
remove: bool,
|
|
}
|
|
|
|
pub fn run(client: &Client, args: Args) -> Result<()> {
|
|
let (owner, name) = client.owner_repo()?;
|
|
let idx = index(args.number)?;
|
|
let body = PullReviewRequestOptions {
|
|
reviewers: Some(vec![args.user.clone()]),
|
|
team_reviewers: None,
|
|
};
|
|
if args.remove {
|
|
client
|
|
.api()
|
|
.repo_delete_pull_review_requests(owner, name, idx, body)
|
|
.send()?;
|
|
println!(
|
|
"review request withdrawn: {} on #{}",
|
|
args.user, args.number
|
|
);
|
|
} else {
|
|
client
|
|
.api()
|
|
.repo_create_pull_review_requests(owner, name, idx, body)
|
|
.send()?;
|
|
println!("review requested: {} on #{}", args.user, args.number);
|
|
}
|
|
Ok(())
|
|
}
|