feat: delete local review comments from CLI

This commit is contained in:
2026-10-18 10:14:26 +02:00
parent a28444a9f2
commit 3c270ed7b5
8 changed files with 200 additions and 9 deletions
+33 -7
View File
@@ -12,6 +12,7 @@ use vamp::{
pub struct Request {
id: Option<i64>,
delete_comment: Option<u64>,
repo: Option<PathBuf>,
json: bool,
all: bool,
@@ -19,22 +20,37 @@ pub struct Request {
impl Request {
pub fn parse(args: &mut impl Iterator<Item = OsString>) -> Result<Self, String> {
let command = args.next().ok_or("--review requires list or show ID")?;
let usage = "--review requires list, show ID, or delete REVIEW_ID COMMENT_ID";
let command = args.next().ok_or(usage)?;
let id = if command == "list" {
None
} else if command == "show" {
let id = args.next().ok_or("show requires a positive review ID")?;
} else if command == "show" || command == "delete" {
let error = "show/delete requires a positive review ID";
let id = args.next().ok_or(error)?;
Some(
id.to_str()
.and_then(|id| id.parse::<i64>().ok())
.filter(|id| *id > 0)
.ok_or("show requires a positive review ID")?,
.ok_or(error)?,
)
} else {
return Err("--review requires list or show ID".into());
return Err(usage.into());
};
let delete_comment = if command == "delete" {
let error = "delete requires a positive comment ID";
let id = args.next().ok_or(error)?;
Some(
id.to_str()
.and_then(|id| id.parse::<u64>().ok())
.filter(|id| *id > 0)
.ok_or(error)?,
)
} else {
None
};
Ok(Self {
id,
delete_comment,
repo: None,
json: false,
all: false,
@@ -50,7 +66,8 @@ impl Request {
self.repo = Some(PathBuf::from(args.next().ok_or("--repo requires a path")?));
} else if arg == "--json" && !self.json {
self.json = true;
} else if arg == "--all" && self.id.is_some() && !self.all {
} else if arg == "--all" && self.id.is_some() && self.delete_comment.is_none() && !self.all
{
self.all = true;
} else {
return Err(format!(
@@ -115,10 +132,19 @@ pub fn run(request: &Request, config: Option<&Path>) -> Result<(), String> {
let root = repository::discover_root(request.repo.as_deref().unwrap_or(&cwd))?;
let store = Store::open_read_only(&directory)?;
let output = if let Some(id) = request.id {
let review = store
let mut review = store
.as_ref()
.ok_or("Review does not exist in this repository")?
.load(&root, id)?;
if let Some(comment_id) = request.delete_comment {
let index = review
.comments
.iter()
.position(|comment| comment.id == comment_id)
.ok_or_else(|| format!("Comment {comment_id} does not exist in review {id}"))?;
review.comments.remove(index);
Store::open(&directory)?.save(&mut review)?;
}
envelope(&review, request.all, true)
} else {
let reviews = match store {