ref:852e5dcbc70e91dbd6953b7a8c05bc1e550f1982

feat(cli): add pr close and reopen commands

Adds `anvil pr close <number>` and `anvil pr reopen <number>` subcommands that PATCH /:org/:repo/pulls/:number with the appropriate state value. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SHA: 852e5dcbc70e91dbd6953b7a8c05bc1e550f1982
Author: Cole Christensen <cole.christensen@macmillan.com>
Date: 2026-03-15 22:04
Parents: 648ceee
1 files changed +44 -0
Type
src/commands/pr.rs +44 −0
@@ -49,6 +49,22 @@
#[arg(long)]
head: Option<String>,
},
/// Close a pull request
Close {
/// PR number
number: u32,
/// Repository (org/repo)
#[arg(long)]
repo: Option<String>,
},
/// Reopen a closed pull request
Reopen {
/// PR number
number: u32,
/// Repository (org/repo)
#[arg(long)]
repo: Option<String>,
},
/// Merge a pull request
Merge {
/// PR number
@@ -97,6 +113,8 @@
base,
head,
} => create(repo.as_deref(), &title, &body, &base, head.as_deref()).await,
PrCommand::Close { number, repo } => close(repo.as_deref(), number).await,
PrCommand::Reopen { number, repo } => reopen(repo.as_deref(), number).await,
PrCommand::Merge {
number,
repo,
@@ -204,5 +222,31 @@
}
}
Ok(())
}
async fn close(repo: Option<&str>, number: u32) -> Result<(), Box<dyn std::error::Error>> {
let client = Client::from_config()?;
let (org, name) = config::resolve_repo(repo)?;
let _resp: serde_json::Value = client
.patch(
&format!("/{org}/{name}/pulls/{number}"),
&serde_json::json!({"state": "closed"}),
)
.await?;
output::success(&format!("Closed PR #{number}"));
Ok(())
}
async fn reopen(repo: Option<&str>, number: u32) -> Result<(), Box<dyn std::error::Error>> {
let client = Client::from_config()?;
let (org, name) = config::resolve_repo(repo)?;
let _resp: serde_json::Value = client
.patch(
&format!("/{org}/{name}/pulls/{number}"),
&serde_json::json!({"state": "open"}),
)
.await?;
output::success(&format!("Reopened PR #{number}"));
Ok(())
}