ref:04c8e1b9608b36adefe03ee9359dfb0235be4fac

feat(pr): add `anvil pr edit` for updating title and body

Mirrors `anvil issue edit` — PATCHes /pulls/{number} with any of --title / --body that were provided. Server-side update_changeset only accepts those two fields today, so scope matches server capability. Closes #3
SHA: 04c8e1b9608b36adefe03ee9359dfb0235be4fac
Author: Cole Christensen <cole.christensen@macmillan.com>
Date: 2026-04-19 02:30
Parents: 0309aab
1 files changed +53 -0
Type
src/commands/pr.rs +53 −0
@@ -65,6 +65,20 @@
#[arg(long)]
repo: Option<String>,
},
/// Edit a pull request's title or body
Edit {
/// PR number
number: u32,
/// Repository (org/repo)
#[arg(long)]
repo: Option<String>,
/// New title
#[arg(long)]
title: Option<String>,
/// New body
#[arg(long)]
body: Option<String>,
},
/// Merge a pull request
Merge {
/// PR number
@@ -153,6 +167,12 @@
base,
head,
} => create(repo.as_deref(), &title, &body, &base, head.as_deref()).await,
PrCommand::Edit {
number,
repo,
title,
body,
} => edit(repo.as_deref(), number, title.as_deref(), body.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 {
@@ -276,5 +296,38 @@
}
}
Ok(())
}
async fn edit(
repo: Option<&str>,
number: u32,
title: Option<&str>,
body: Option<&str>,
) -> Result<(), Box<dyn std::error::Error>> {
let client = Client::from_config()?;
let (org, name) = config::resolve_repo(repo)?;
let mut payload = serde_json::Map::new();
if let Some(t) = title {
payload.insert("title".into(), serde_json::json!(t));
}
if let Some(b) = body {
payload.insert("body".into(), serde_json::json!(b));
}
if payload.is_empty() {
output::warn("Nothing to update — specify --title or --body");
return Ok(());
}
let _resp: serde_json::Value = client
.patch(
&format!("/{org}/{name}/pulls/{number}"),
&serde_json::Value::Object(payload),
)
.await?;
output::success(&format!("Updated PR #{number}"));
Ok(())
}