cli: add comment edit for rad issue

Add the ability to edit an issue comment to the `rad issue` command.

This is achieved by adding an `--edit` option to `rad issue
comment`. Note that if `--reply-to` and `--edit` are both specified,
then this results in an error.
This commit is contained in:
Fintan Halpenny 2024-09-17 12:44:30 +01:00 committed by cloudhead
parent 985987468d
commit ffbdabe432
No known key found for this signature in database
2 changed files with 62 additions and 8 deletions

View File

@ -104,3 +104,13 @@ $ rad issue show d87dcfe8c2b3200e78b128d9b959cfdf7063fefe
│ More power! │
╰─────────────────────────────────────────────────────────╯
```
We can also edit a comment:
```
$ rad issue comment d87dcfe --edit 880fdcd -m "Even more power!"
╭─────────────────────────╮
│ alice (you) now 880fdcd │
│ Even more power! │
╰─────────────────────────╯
```

View File

@ -43,7 +43,7 @@ Usage
rad issue react <issue-id> [--emoji <char>] [--to <comment>] [<option>...]
rad issue assign <issue-id> [--add <did>] [--delete <did>] [<option>...]
rad issue label <issue-id> [--add <label>] [--delete <label>] [<option>...]
rad issue comment <issue-id> [--message <message>] [--reply-to <comment-id>] [<option>...]
rad issue comment <issue-id> [--message <message>] [--reply-to <comment-id>] [--edit <comment-id>] [<option>...]
rad issue show <issue-id> [<option>...]
rad issue state <issue-id> [--closed | --open | --solved] [<option>...]
rad issue cache [<issue-id>] [--storage] [<option>...]
@ -118,6 +118,11 @@ pub enum Operation {
format: Format,
debug: bool,
},
CommentEdit {
id: Rev,
comment_id: Rev,
message: Message,
},
Comment {
id: Rev,
message: Message,
@ -191,6 +196,7 @@ impl Args for Options {
let mut format = Format::default();
let mut message = Message::default();
let mut reply_to = None;
let mut edit_comment = None;
let mut announce = true;
let mut quiet = false;
let mut debug = false;
@ -299,6 +305,12 @@ impl Args for Options {
reply_to = Some(rev);
}
Long("edit") if op == Some(OperationName::Comment) => {
let val = parser.value()?;
let rev = term::args::rev(&val)?;
edit_comment = Some(rev);
}
// Assign options
Short('a') | Long("add") if op == Some(OperationName::Assign) => {
@ -390,10 +402,23 @@ impl Args for Options {
labels,
assignees,
},
OperationName::Comment => Operation::Comment {
id: id.ok_or_else(|| anyhow!("an issue must be provided"))?,
message,
reply_to,
OperationName::Comment => match (reply_to, edit_comment) {
(None, None) => Operation::Comment {
id: id.ok_or_else(|| anyhow!("an issue must be provided"))?,
message,
reply_to: None,
},
(None, Some(comment_id)) => Operation::CommentEdit {
id: id.ok_or_else(|| anyhow!("an issue must be provided"))?,
comment_id,
message,
},
(reply_to @ Some(_), None) => Operation::Comment {
id: id.ok_or_else(|| anyhow!("an issue must be provided"))?,
message,
reply_to,
},
(Some(_), Some(_)) => anyhow::bail!("you cannot use --reply-to with --edit"),
},
OperationName::Show => Operation::Show {
id: id.ok_or_else(|| anyhow!("an issue must be provided"))?,
@ -503,6 +528,25 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
term::comment::widget(&comment_id, comment, &profile).print();
}
}
Operation::CommentEdit {
id,
comment_id,
message,
} => {
let signer = term::signer(&profile)?;
let issue_id = id.resolve::<cob::ObjectId>(&repo.backend)?;
let comment_id = comment_id.resolve(&repo.backend)?;
let mut issue = issues.get_mut(&issue_id)?;
let (body, _) = prompt_comment(message, None, &issue, &repo)?;
issue.edit_comment(comment_id, body, vec![], &signer)?;
if options.quiet {
term::print(comment_id);
} else {
let comment = issue.thread().comment(&comment_id).unwrap();
term::comment::widget(&comment_id, comment, &profile).print();
}
}
Operation::Show { id, format, debug } => {
let id = id.resolve(&repo.backend)?;
let issue = issues
@ -790,7 +834,7 @@ where
let id = id.resolve(&repo.backend)?;
let mut issue = issues.get_mut(&id)?;
let (root, _) = issue.root();
let root = *root;
let comment_id = *root;
if title.is_some() || description.is_some() {
// Editing by command line arguments.
@ -799,7 +843,7 @@ where
tx.edit(t)?;
}
if let Some(d) = description {
tx.edit_comment(root, d, vec![])?;
tx.edit_comment(comment_id, d, vec![])?;
}
Ok(())
})?;
@ -817,7 +861,7 @@ where
issue.transaction("Edit", signer, |tx| {
tx.edit(title)?;
tx.edit_comment(root, description, vec![])?;
tx.edit_comment(comment_id, description, vec![])?;
Ok(())
})?;