ref:98e86538f9746622e65b81855182e950bd93a63a

feat(cli): add 'anvil pr merge' command

SHA: 98e86538f9746622e65b81855182e950bd93a63a
Author: Cole Christensen <cole.christensen@macmillan.com>
Date: 2026-03-15 22:02
Parents: af91990
1 files changed +43 -0
Type
src/commands/pr.rs +43 −0
@@ -49,6 +49,17 @@
#[arg(long)]
head: Option<String>,
},
/// Merge a pull request
Merge {
/// PR number
number: u32,
/// Repository (org/repo)
#[arg(long)]
repo: Option<String>,
/// Merge strategy: merge_commit, squash, rebase
#[arg(long, default_value = "merge_commit")]
strategy: String,
},
}
#[derive(Debug, Deserialize)]
@@ -86,5 +97,10 @@
base,
head,
} => create(repo.as_deref(), &title, &body, &base, head.as_deref()).await,
PrCommand::Merge {
number,
repo,
strategy,
} => merge(repo.as_deref(), number, &strategy).await,
}
}
@@ -188,5 +204,32 @@
}
}
Ok(())
}
async fn merge(
repo: Option<&str>,
number: u32,
strategy: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let client = Client::from_config()?;
let (org, name) = config::resolve_repo(repo)?;
let resp: serde_json::Value = client
.post(
&format!("/{org}/{name}/pulls/{number}/merge"),
&serde_json::json!({
"strategy": strategy,
}),
)
.await?;
let merge_sha = resp
.get("merge_sha")
.and_then(|v| v.as_str())
.unwrap_or("unknown");
output::success(&format!("Merged PR #{number} via {strategy}"));
output::detail("Merge SHA", merge_sha);
Ok(())
}