rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwoodd1e19a87b019803cfcac75e2678c15531be34404
{
"request": "trigger",
"version": 1,
"event_type": "push",
"repository": {
"id": "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5",
"name": "heartwood",
"description": "Radicle Heartwood Protocol & Stack",
"private": false,
"default_branch": "master",
"delegates": [
"did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT",
"did:key:z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW",
"did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"did:key:z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz",
"did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
]
},
"pusher": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"before": "d1e19a87b019803cfcac75e2678c15531be34404",
"after": "d1e19a87b019803cfcac75e2678c15531be34404",
"branch": "master",
"commits": [
"d1e19a87b019803cfcac75e2678c15531be34404",
"3ea61f0f98a00df1402e489c4be70b7a31af87f7",
"e404f1038f461264f9395742ef74f5b710bef54a",
"9bcdd353c90f42a159b19045d02671198670a05a"
]
}
{
"response": "triggered",
"run_id": {
"id": "cebf607e-fc00-4ba7-8257-042e5bfd9cf6"
},
"info_url": "https://cci.rad.levitte.org//cebf607e-fc00-4ba7-8257-042e5bfd9cf6.html"
}
Started at: 2025-11-01 10:20:12.592012+01:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW added
✓ Remote-tracking branch cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW/master created for z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ Remote erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz added
✓ Remote-tracking branch erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz/master created for z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz
✓ Remote lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz added
✓ Remote-tracking branch lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz/master created for z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz
✓ Repository successfully cloned under /opt/radcis/ci.rad.levitte.org/cci/state/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 126 issues · 15 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout d1e19a87b019803cfcac75e2678c15531be34404
HEAD is now at d1e19a87 cli/patch: migrate patch CLI parsing to clap
Exit code: 0
$ git show d1e19a87b019803cfcac75e2678c15531be34404
commit d1e19a87b019803cfcac75e2678c15531be34404
Author: Matthias Beyer <mail@beyermatthias.de>
Date: Fri Sep 5 16:19:07 2025 +0200
cli/patch: migrate patch CLI parsing to clap
Co-authored-by: Fintan Halpenny <fintan.halpenny@gmail.com>
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
diff --git a/crates/radicle-cli/src/commands/help.rs b/crates/radicle-cli/src/commands/help.rs
index 4f806c2f..6b3cc0db 100644
--- a/crates/radicle-cli/src/commands/help.rs
+++ b/crates/radicle-cli/src/commands/help.rs
@@ -94,7 +94,10 @@ const COMMANDS: &[CommandItem] = &[
name: "node",
about: crate::commands::node::ABOUT,
},
- CommandItem::Lexopt(crate::commands::patch::HELP),
+ CommandItem::Clap {
+ name: "patch",
+ about: crate::commands::patch::ABOUT,
+ },
CommandItem::Clap {
name: "path",
about: crate::commands::path::ABOUT,
diff --git a/crates/radicle-cli/src/commands/patch.rs b/crates/radicle-cli/src/commands/patch.rs
index e367efc6..20a3f77f 100644
--- a/crates/radicle-cli/src/commands/patch.rs
+++ b/crates/radicle-cli/src/commands/patch.rs
@@ -1,4 +1,5 @@
mod archive;
+mod args;
mod assign;
mod cache;
mod checkout;
@@ -17,14 +18,11 @@ mod show;
mod update;
use std::collections::BTreeSet;
-use std::ffi::OsString;
-use std::str::FromStr as _;
use anyhow::anyhow;
use radicle::cob::patch::PatchId;
-use radicle::cob::{patch, Label, Reaction};
-use radicle::git::fmt::RefString;
+use radicle::cob::{patch, Label};
use radicle::patch::cache::Patches as _;
use radicle::storage::git::transport;
use radicle::{prelude::*, Node};
@@ -32,811 +30,15 @@ use radicle::{prelude::*, Node};
use crate::git::Rev;
use crate::node;
use crate::terminal as term;
-use crate::terminal::args::{string, Args, Error, Help};
use crate::terminal::patch::Message;
-pub const HELP: Help = Help {
- name: "patch",
- description: "Manage patches",
- version: env!("RADICLE_VERSION"),
- usage: r#"
-Usage
+pub use args::Args;
+pub(crate) use args::ABOUT;
- rad patch [<option>...]
- rad patch list [--all|--merged|--open|--archived|--draft|--authored] [--author <did>]... [<option>...]
- rad patch show <patch-id> [<option>...]
- rad patch diff <patch-id> [<option>...]
- rad patch archive <patch-id> [--undo] [<option>...]
- rad patch update <patch-id> [<option>...]
- rad patch checkout <patch-id> [<option>...]
- rad patch review <patch-id> [--accept | --reject] [-m [<string>]] [-d | --delete] [<option>...]
- rad patch resolve <patch-id> [--review <review-id>] [--comment <comment-id>] [--unresolve] [<option>...]
- rad patch delete <patch-id> [<option>...]
- rad patch redact <revision-id> [<option>...]
- rad patch react <patch-id | revision-id> [--react <emoji>] [<option>...]
- rad patch assign <revision-id> [--add <did>] [--delete <did>] [<option>...]
- rad patch label <revision-id> [--add <label>] [--delete <label>] [<option>...]
- rad patch ready <patch-id> [--undo] [<option>...]
- rad patch edit <patch-id> [<option>...]
- rad patch set <patch-id> [<option>...]
- rad patch comment <patch-id | revision-id> [<option>...]
- rad patch cache [<patch-id>] [--storage] [<option>...]
+use args::{AssignArgs, Command, CommentAction, LabelArgs};
-Show options
-
- -p, --patch Show the actual patch diff
- -v, --verbose Show additional information about the patch
-
-Diff options
-
- -r, --revision <id> The revision to diff (default: latest)
-
-Comment options
-
- -m, --message <string> Provide a comment message via the command-line
- --reply-to <comment> The comment to reply to
- --edit <comment> The comment to edit (use --message to edit with the provided message)
- --react <comment> The comment to react to
- --emoji <char> The emoji to react with when --react is used
- --redact <comment> The comment to redact
-
-Edit options
-
- -m, --message [<string>] Provide a comment message to the patch or revision (default: prompt)
-
-Review options
-
- -r, --revision <id> Review the given revision of the patch
- -p, --patch Review by patch hunks
- --hunk <index> Only review a specific hunk
- --accept Accept a patch or set of hunks
- --reject Reject a patch or set of hunks
- -U, --unified <n> Generate diffs with <n> lines of context instead of the usual three
- -d, --delete Delete a review draft
- -m, --message [<string>] Provide a comment with the review (default: prompt)
-
-Resolve options
-
- --review <id> The review id which the comment is under
- --comment <id> The comment to (un)resolve
- --undo Unresolve the comment
-
-Assign options
-
- -a, --add <did> Add an assignee to the patch (may be specified multiple times).
- Note: --add will take precedence over --delete
-
- -d, --delete <did> Delete an assignee from the patch (may be specified multiple times).
- Note: --add will take precedence over --delete
-
-Archive options
-
- --undo Unarchive a patch
-
-Label options
-
- -a, --add <label> Add a label to the patch (may be specified multiple times).
- Note: --add will take precedence over --delete
-
- -d, --delete <label> Delete a label from the patch (may be specified multiple times).
- Note: --add will take precedence over --delete
-
-Update options
-
- -b, --base <revspec> Provide a Git revision as the base commit
- -m, --message [<string>] Provide a comment message to the patch or revision (default: prompt)
- --no-message Leave the patch or revision comment message blank
-
-List options
-
- --all Show all patches, including merged and archived patches
- --archived Show only archived patches
- --merged Show only merged patches
- --open Show only open patches (default)
- --draft Show only draft patches
- --authored Show only patches that you have authored
- --author <did> Show only patched where the given user is an author
- (may be specified multiple times)
-
-Ready options
-
- --undo Convert a patch back to a draft
-
-Checkout options
-
- --revision <id> Checkout the given revision of the patch
- --name <string> Provide a name for the branch to checkout
- --remote <string> Provide the git remote to use as the upstream
- -f, --force Checkout the head of the revision, even if the branch already exists
-
-Set options
-
- --remote <string> Provide the git remote to use as the upstream
-
-React options
-
- --emoji <char> The emoji to react to the patch or revision with
-
-Other options
-
- --repo <rid> Operate on the given repository (default: cwd)
- --[no-]announce Announce changes made to the network
- -q, --quiet Quiet output
- --help Print help
-"#,
-};
-
-#[derive(Debug, Default, PartialEq, Eq)]
-pub enum OperationName {
- Assign,
- Show,
- Diff,
- Update,
- Archive,
- Delete,
- Checkout,
- Comment,
- React,
- Ready,
- Review,
- Resolve,
- Label,
- #[default]
- List,
- Edit,
- Redact,
- Set,
- Cache,
-}
-
-#[derive(Debug, PartialEq, Eq)]
-pub enum CommentOperation {
- Edit,
- React,
- Redact,
-}
-
-#[derive(Debug, Default, PartialEq, Eq)]
-pub struct AssignOptions {
- pub add: BTreeSet<Did>,
- pub delete: BTreeSet<Did>,
-}
-
-#[derive(Debug, Default, PartialEq, Eq)]
-pub struct LabelOptions {
- pub add: BTreeSet<Label>,
- pub delete: BTreeSet<Label>,
-}
-
-#[derive(Debug)]
-pub enum Operation {
- Show {
- patch_id: Rev,
- diff: bool,
- verbose: bool,
- },
- Diff {
- patch_id: Rev,
- revision_id: Option<Rev>,
- },
- Update {
- patch_id: Rev,
- base_id: Option<Rev>,
- message: Message,
- },
- Archive {
- patch_id: Rev,
- undo: bool,
- },
- Ready {
- patch_id: Rev,
- undo: bool,
- },
- Delete {
- patch_id: Rev,
- },
- Checkout {
- patch_id: Rev,
- revision_id: Option<Rev>,
- opts: checkout::Options,
- },
- Comment {
- revision_id: Rev,
- message: Message,
- reply_to: Option<Rev>,
- },
- CommentEdit {
- revision_id: Rev,
- comment_id: Rev,
- message: Message,
- },
- CommentRedact {
- revision_id: Rev,
- comment_id: Rev,
- },
- CommentReact {
- revision_id: Rev,
- comment_id: Rev,
- reaction: Reaction,
- undo: bool,
- },
- React {
- revision_id: Rev,
- reaction: Reaction,
- undo: bool,
- },
- Review {
- patch_id: Rev,
- revision_id: Option<Rev>,
- opts: review::Options,
- },
- Resolve {
- patch_id: Rev,
- review_id: Rev,
- comment_id: Rev,
- undo: bool,
- },
- Assign {
- patch_id: Rev,
- opts: AssignOptions,
- },
- Label {
- patch_id: Rev,
- opts: LabelOptions,
- },
- List {
- filter: Option<patch::Status>,
- },
- Edit {
- patch_id: Rev,
- revision_id: Option<Rev>,
- message: Message,
- },
- Redact {
- revision_id: Rev,
- },
- Set {
- patch_id: Rev,
- remote: Option<RefString>,
- },
- Cache {
- patch_id: Option<Rev>,
- storage: bool,
- },
-}
-
-impl Operation {
- fn is_announce(&self) -> bool {
- match self {
- Operation::Update { .. }
- | Operation::Archive { .. }
- | Operation::Ready { .. }
- | Operation::Delete { .. }
- | Operation::Comment { .. }
- | Operation::CommentEdit { .. }
- | Operation::CommentRedact { .. }
- | Operation::CommentReact { .. }
- | Operation::Review { .. }
- | Operation::Resolve { .. }
- | Operation::Assign { .. }
- | Operation::Label { .. }
- | Operation::Edit { .. }
- | Operation::Redact { .. }
- | Operation::React { .. }
- | Operation::Set { .. } => true,
- Operation::Show { .. }
- | Operation::Diff { .. }
- | Operation::Checkout { .. }
- | Operation::List { .. }
- | Operation::Cache { .. } => false,
- }
- }
-}
-
-#[derive(Debug)]
-pub struct Options {
- pub op: Operation,
- pub repo: Option<RepoId>,
- pub announce: bool,
- pub quiet: bool,
- pub authored: bool,
- pub authors: Vec<Did>,
-}
-
-impl Args for Options {
- fn from_args(args: Vec<OsString>) -> anyhow::Result<(Self, Vec<OsString>)> {
- use lexopt::prelude::*;
-
- let mut parser = lexopt::Parser::from_args(args);
- let mut op: Option<OperationName> = None;
- let mut verbose = false;
- let mut quiet = false;
- let mut authored = false;
- let mut authors = vec![];
- let mut announce = true;
- let mut patch_id = None;
- let mut revision_id = None;
- let mut review_id = None;
- let mut comment_id = None;
- let mut message = Message::default();
- let mut filter = Some(patch::Status::Open);
- let mut diff = false;
- let mut undo = false;
- let mut reaction: Option<Reaction> = None;
- let mut reply_to: Option<Rev> = None;
- let mut comment_op: Option<(CommentOperation, Rev)> = None;
- let mut checkout_opts = checkout::Options::default();
- let mut remote: Option<RefString> = None;
- let mut assign_opts = AssignOptions::default();
- let mut label_opts = LabelOptions::default();
- let mut review_op = review::Operation::default();
- let mut base_id = None;
- let mut repo = None;
- let mut cache_storage = false;
-
- while let Some(arg) = parser.next()? {
- match arg {
- // Options.
- Long("message") | Short('m') => {
- if message != Message::Blank {
- // We skip this code when `no-message` is specified.
- let txt: String = term::args::string(&parser.value()?);
- message.append(&txt);
- }
- }
- Long("no-message") => {
- message = Message::Blank;
- }
- Long("announce") => {
- announce = true;
- }
- Long("no-announce") => {
- announce = false;
- }
-
- // Show options.
- Long("patch") | Short('p') if op == Some(OperationName::Show) => {
- diff = true;
- }
- Long("verbose") | Short('v') if op == Some(OperationName::Show) => {
- verbose = true;
- }
-
- // Ready options.
- Long("undo") if op == Some(OperationName::Ready) => {
- undo = true;
- }
-
- // Archive options.
- Long("undo") if op == Some(OperationName::Archive) => {
- undo = true;
- }
-
- // Update options.
- Short('b') | Long("base") if op == Some(OperationName::Update) => {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- base_id = Some(rev);
- }
-
- // React options.
- Long("emoji") if op == Some(OperationName::React) => {
- if let Some(emoji) = parser.value()?.to_str() {
- reaction =
- Some(Reaction::from_str(emoji).map_err(|_| anyhow!("invalid emoji"))?);
- }
- }
- Long("undo") if op == Some(OperationName::React) => {
- undo = true;
- }
-
- // Comment options.
- Long("reply-to") if op == Some(OperationName::Comment) => {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- reply_to = Some(rev);
- }
-
- Long("edit") if op == Some(OperationName::Comment) => {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- comment_op = Some((CommentOperation::Edit, rev));
- }
-
- Long("react") if op == Some(OperationName::Comment) => {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- comment_op = Some((CommentOperation::React, rev));
- }
- Long("emoji")
- if op == Some(OperationName::Comment)
- && matches!(comment_op, Some((CommentOperation::React, _))) =>
- {
- if let Some(emoji) = parser.value()?.to_str() {
- reaction =
- Some(Reaction::from_str(emoji).map_err(|_| anyhow!("invalid emoji"))?);
- }
- }
- Long("undo")
- if op == Some(OperationName::Comment)
- && matches!(comment_op, Some((CommentOperation::React, _))) =>
- {
- undo = true;
- }
-
- Long("redact") if op == Some(OperationName::Comment) => {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- comment_op = Some((CommentOperation::Redact, rev));
- }
-
- // Edit options.
- Long("revision") | Short('r') if op == Some(OperationName::Edit) => {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- revision_id = Some(rev);
- }
-
- // Review/diff options.
- Long("revision") | Short('r')
- if op == Some(OperationName::Review) || op == Some(OperationName::Diff) =>
- {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- revision_id = Some(rev);
- }
- Long("patch") | Short('p') if op == Some(OperationName::Review) => {
- if let review::Operation::Review { by_hunk, .. } = &mut review_op {
- *by_hunk = true;
- } else {
- return Err(arg.unexpected().into());
- }
- }
- Long("unified") | Short('U') if op == Some(OperationName::Review) => {
- if let review::Operation::Review { unified, .. } = &mut review_op {
- let val = parser.value()?;
- *unified = term::args::number(&val)?;
- } else {
- return Err(arg.unexpected().into());
- }
- }
- Long("hunk") if op == Some(OperationName::Review) => {
- if let review::Operation::Review { hunk, .. } = &mut review_op {
- let val = parser.value()?;
- let val = term::args::number(&val)
- .map_err(|e| anyhow!("invalid hunk value: {e}"))?;
-
- *hunk = Some(val);
- } else {
- return Err(arg.unexpected().into());
- }
- }
- Long("delete") | Short('d') if op == Some(OperationName::Review) => {
- review_op = review::Operation::Delete;
- }
- Long("accept") if op == Some(OperationName::Review) => {
- if let review::Operation::Review {
- verdict: verdict @ None,
- ..
- } = &mut review_op
- {
- *verdict = Some(patch::Verdict::Accept);
- } else {
- return Err(arg.unexpected().into());
- }
- }
- Long("reject") if op == Some(OperationName::Review) => {
- if let review::Operation::Review {
- verdict: verdict @ None,
- ..
- } = &mut review_op
- {
- *verdict = Some(patch::Verdict::Reject);
- } else {
- return Err(arg.unexpected().into());
- }
- }
-
- // Resolve options
- Long("undo") if op == Some(OperationName::Resolve) => {
- undo = true;
- }
- Long("review") if op == Some(OperationName::Resolve) => {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- review_id = Some(rev);
- }
- Long("comment") if op == Some(OperationName::Resolve) => {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- comment_id = Some(rev);
- }
-
- // Checkout options
- Long("revision") if op == Some(OperationName::Checkout) => {
- let val = parser.value()?;
- let rev = term::args::rev(&val)?;
-
- revision_id = Some(rev);
- }
-
- Long("force") | Short('f') if op == Some(OperationName::Checkout) => {
- checkout_opts.force = true;
- }
-
- Long("name") if op == Some(OperationName::Checkout) => {
- let val = parser.value()?;
- checkout_opts.name = Some(term::args::refstring("name", val)?);
- }
-
- Long("remote") if op == Some(OperationName::Checkout) => {
- let val = parser.value()?;
- checkout_opts.remote = Some(term::args::refstring("remote", val)?);
- }
-
- // Assign options.
- Short('a') | Long("add") if matches!(op, Some(OperationName::Assign)) => {
- assign_opts.add.insert(term::args::did(&parser.value()?)?);
- }
-
- Short('d') | Long("delete") if matches!(op, Some(OperationName::Assign)) => {
- assign_opts
- .delete
- .insert(term::args::did(&parser.value()?)?);
- }
-
- // Label options.
- Short('a') | Long("add") if matches!(op, Some(OperationName::Label)) => {
- let val = parser.value()?;
- let name = term::args::string(&val);
- let label = Label::new(name)?;
-
- label_opts.add.insert(label);
- }
-
- Short('d') | Long("delete") if matches!(op, Some(OperationName::Label)) => {
- let val = parser.value()?;
- let name = term::args::string(&val);
- let label = Label::new(name)?;
-
- label_opts.delete.insert(label);
- }
-
- // Set options.
- Long("remote") if op == Some(OperationName::Set) => {
- let val = parser.value()?;
- remote = Some(term::args::refstring("remote", val)?);
- }
-
- // List options.
- Long("all") => {
- filter = None;
- }
- Long("draft") => {
- filter = Some(patch::Status::Draft);
- }
- Long("archived") => {
- filter = Some(patch::Status::Archived);
- }
- Long("merged") => {
- filter = Some(patch::Status::Merged);
- }
- Long("open") => {
- filter = Some(patch::Status::Open);
- }
- Long("authored") => {
- authored = true;
- }
- Long("author") if op == Some(OperationName::List) => {
- authors.push(term::args::did(&parser.value()?)?);
- }
-
- // Cache options.
- Long("storage") if op == Some(OperationName::Cache) => {
- cache_storage = true;
- }
-
- // Common.
- Long("quiet") | Short('q') => {
- quiet = true;
- }
- Long("repo") => {
- let val = parser.value()?;
- let rid = term::args::rid(&val)?;
-
- repo = Some(rid);
- }
- Long("help") => {
- return Err(Error::HelpManual { name: "rad-patch" }.into());
- }
- Short('h') => {
- return Err(Error::Help.into());
- }
-
- Value(val) if op.is_none() => match val.to_string_lossy().as_ref() {
- "l" | "list" => op = Some(OperationName::List),
- "s" | "show" => op = Some(OperationName::Show),
- "u" | "update" => op = Some(OperationName::Update),
- "d" | "delete" => op = Some(OperationName::Delete),
- "c" | "checkout" => op = Some(OperationName::Checkout),
- "a" | "archive" => op = Some(OperationName::Archive),
- "y" | "ready" => op = Some(OperationName::Ready),
- "e" | "edit" => op = Some(OperationName::Edit),
- "r" | "redact" => op = Some(OperationName::Redact),
- "diff" => op = Some(OperationName::Diff),
- "assign" => op = Some(OperationName::Assign),
- "label" => op = Some(OperationName::Label),
- "comment" => op = Some(OperationName::Comment),
- "review" => op = Some(OperationName::Review),
- "resolve" => op = Some(OperationName::Resolve),
- "set" => op = Some(OperationName::Set),
- "cache" => op = Some(OperationName::Cache),
- unknown => anyhow::bail!("unknown operation '{}'", unknown),
- },
- Value(val) if op == Some(OperationName::Redact) => {
- let rev = term::args::rev(&val)?;
- revision_id = Some(rev);
- }
- Value(val)
- if patch_id.is_none()
- && [
- Some(OperationName::Show),
- Some(OperationName::Diff),
- Some(OperationName::Update),
- Some(OperationName::Delete),
- Some(OperationName::Archive),
- Some(OperationName::Ready),
- Some(OperationName::Checkout),
- Some(OperationName::Comment),
- Some(OperationName::Review),
- Some(OperationName::Resolve),
- Some(OperationName::Edit),
- Some(OperationName::Set),
- Some(OperationName::Assign),
- Some(OperationName::Label),
- Some(OperationName::Cache),
- ]
- .contains(&op) =>
- {
- let val = string(&val);
- patch_id = Some(Rev::from(val));
- }
- _ => anyhow::bail!(arg.unexpected()),
- }
- }
-
- let op = match op.unwrap_or_default() {
- OperationName::List => Operation::List { filter },
- OperationName::Show => Operation::Show {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- diff,
- verbose,
- },
- OperationName::Diff => Operation::Diff {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- revision_id,
- },
- OperationName::Delete => Operation::Delete {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- },
- OperationName::Update => Operation::Update {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- base_id,
- message,
- },
- OperationName::Archive => Operation::Archive {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch id must be provided"))?,
- undo,
- },
- OperationName::Checkout => Operation::Checkout {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- revision_id,
- opts: checkout_opts,
- },
- OperationName::Comment => match comment_op {
- Some((CommentOperation::Edit, comment)) => Operation::CommentEdit {
- revision_id: patch_id
- .ok_or_else(|| anyhow!("a patch or revision must be provided"))?,
- comment_id: comment,
- message,
- },
- Some((CommentOperation::React, comment)) => Operation::CommentReact {
- revision_id: patch_id
- .ok_or_else(|| anyhow!("a patch or revision must be provided"))?,
- comment_id: comment,
- reaction: reaction
- .ok_or_else(|| anyhow!("a reaction emoji must be provided"))?,
- undo,
- },
- Some((CommentOperation::Redact, comment)) => Operation::CommentRedact {
- revision_id: patch_id
- .ok_or_else(|| anyhow!("a patch or revision must be provided"))?,
- comment_id: comment,
- },
- None => Operation::Comment {
- revision_id: patch_id
- .ok_or_else(|| anyhow!("a patch or revision must be provided"))?,
- message,
- reply_to,
- },
- },
- OperationName::React => Operation::React {
- revision_id: patch_id
- .ok_or_else(|| anyhow!("a patch or revision must be provided"))?,
- reaction: reaction.ok_or_else(|| anyhow!("a reaction emoji must be provided"))?,
- undo,
- },
- OperationName::Review => Operation::Review {
- patch_id: patch_id
- .ok_or_else(|| anyhow!("a patch or revision must be provided"))?,
- revision_id,
- opts: review::Options {
- message,
- op: review_op,
- },
- },
- OperationName::Resolve => Operation::Resolve {
- patch_id: patch_id
- .ok_or_else(|| anyhow!("a patch or revision must be provided"))?,
- review_id: review_id.ok_or_else(|| anyhow!("a review must be provided"))?,
- comment_id: comment_id.ok_or_else(|| anyhow!("a comment must be provided"))?,
- undo,
- },
- OperationName::Ready => Operation::Ready {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- undo,
- },
- OperationName::Edit => Operation::Edit {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- revision_id,
- message,
- },
- OperationName::Redact => Operation::Redact {
- revision_id: revision_id.ok_or_else(|| anyhow!("a revision must be provided"))?,
- },
- OperationName::Assign => Operation::Assign {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- opts: assign_opts,
- },
- OperationName::Label => Operation::Label {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- opts: label_opts,
- },
- OperationName::Set => Operation::Set {
- patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
- remote,
- },
- OperationName::Cache => Operation::Cache {
- patch_id,
- storage: cache_storage,
- },
- };
-
- Ok((
- Options {
- op,
- repo,
- quiet,
- announce,
- authored,
- authors,
- },
- vec![],
- ))
- }
-}
-
-pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
- let (workdir, rid) = if let Some(rid) = options.repo {
+pub fn run(args: Args, ctx: impl term::Context) -> anyhow::Result<()> {
+ let (workdir, rid) = if let Some(rid) = args.repo {
(None, rid)
} else {
radicle::rad::cwd()
@@ -846,51 +48,51 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
let profile = ctx.profile()?;
let repository = profile.storage.repository(rid)?;
- let announce = options.announce && options.op.is_announce();
+
+ // Fallback to [`Command::List`] if no subcommand is provided.
+ // Construct it using the [`EmptyArgs`] in `args.empty`.
+ let mut announce = args.should_announce();
+ let command = args
+ .command
+ .unwrap_or_else(|| Command::List(args.empty.into()));
+ announce &= command.should_announce();
transport::local::register(profile.storage.clone());
- match options.op {
- Operation::List { filter } => {
- let mut authors: BTreeSet<Did> = options.authors.iter().cloned().collect();
- if options.authored {
+ match command {
+ Command::List(args) => {
+ let mut authors: BTreeSet<Did> = args.authors.iter().cloned().collect();
+ if args.authored {
authors.insert(profile.did());
}
- list::run(filter.as_ref(), authors, &repository, &profile)?;
+ list::run((&args.state).into(), authors, &repository, &profile)?;
}
- Operation::Show {
- patch_id,
- diff,
- verbose,
- } => {
- let patch_id = patch_id.resolve(&repository.backend)?;
+
+ Command::Show { id, patch, verbose } => {
+ let patch_id = id.resolve(&repository.backend)?;
show::run(
&patch_id,
- diff,
+ patch,
verbose,
&profile,
&repository,
workdir.as_ref(),
)?;
}
- Operation::Diff {
- patch_id,
- revision_id,
- } => {
- let patch_id = patch_id.resolve(&repository.backend)?;
- let revision_id = revision_id
+
+ Command::Diff { id, revision } => {
+ let patch_id = id.resolve(&repository.backend)?;
+ let revision_id = revision
.map(|rev| rev.resolve::<radicle::git::Oid>(&repository.backend))
.transpose()?
.map(patch::RevisionId::from);
diff::run(&patch_id, revision_id, &repository, &profile)?;
}
- Operation::Update {
- ref patch_id,
- ref base_id,
- ref message,
- } => {
- let patch_id = patch_id.resolve(&repository.backend)?;
- let base_id = base_id
+
+ Command::Update { id, base, message } => {
+ let message = Message::from(message);
+ let patch_id = id.resolve(&repository.backend)?;
+ let base_id = base
.as_ref()
.map(|base| base.resolve(&repository.backend))
.transpose()?;
@@ -898,21 +100,16 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
"this command must be run from a repository checkout"
))?;
- update::run(
- patch_id,
- base_id,
- message.clone(),
- &profile,
- &repository,
- &workdir,
- )?;
+ update::run(patch_id, base_id, message, &profile, &repository, &workdir)?;
}
- Operation::Archive { ref patch_id, undo } => {
- let patch_id = patch_id.resolve::<PatchId>(&repository.backend)?;
+
+ Command::Archive { id, undo } => {
+ let patch_id = id.resolve::<PatchId>(&repository.backend)?;
archive::run(&patch_id, undo, &profile, &repository)?;
}
- Operation::Ready { ref patch_id, undo } => {
- let patch_id = patch_id.resolve::<PatchId>(&repository.backend)?;
+
+ Command::Ready { id, undo } => {
+ let patch_id = id.resolve::<PatchId>(&repository.backend)?;
if !ready::run(&patch_id, undo, &profile, &repository)? {
if undo {
@@ -922,17 +119,15 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
}
}
}
- Operation::Delete { patch_id } => {
- let patch_id = patch_id.resolve::<PatchId>(&repository.backend)?;
+
+ Command::Delete { id } => {
+ let patch_id = id.resolve::<PatchId>(&repository.backend)?;
delete::run(&patch_id, &profile, &repository)?;
}
- Operation::Checkout {
- patch_id,
- revision_id,
- opts,
- } => {
- let patch_id = patch_id.resolve::<radicle::git::Oid>(&repository.backend)?;
- let revision_id = revision_id
+
+ Command::Checkout { id, revision, opts } => {
+ let patch_id = id.resolve::<radicle::git::Oid>(&repository.backend)?;
+ let revision_id = revision
.map(|rev| rev.resolve::<radicle::git::Oid>(&repository.backend))
.transpose()?
.map(patch::RevisionId::from);
@@ -945,121 +140,136 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
&repository,
&workdir,
&profile,
- opts,
+ opts.into(),
)?;
}
- Operation::Comment {
- revision_id,
- message,
- reply_to,
- } => {
- comment::run(
- revision_id,
+
+ Command::Comment(c) => match CommentAction::from(c) {
+ CommentAction::Comment {
+ revision,
message,
reply_to,
- options.quiet,
- &repository,
- &profile,
- )?;
- }
- Operation::CommentEdit {
- revision_id,
- comment_id,
- message,
- } => {
- let comment = comment_id.resolve(&repository.backend)?;
- comment::edit::run(
- revision_id,
+ } => {
+ comment::run(
+ revision,
+ message,
+ reply_to,
+ args.quiet,
+ &repository,
+ &profile,
+ )?;
+ }
+ CommentAction::Edit {
+ revision,
comment,
message,
- options.quiet,
- &repository,
- &profile,
- )?;
- }
- Operation::CommentRedact {
- revision_id,
- comment_id,
- } => {
- let comment = comment_id.resolve(&repository.backend)?;
- comment::redact::run(revision_id, comment, &repository, &profile)?;
- }
- Operation::CommentReact {
- revision_id,
- comment_id,
- reaction,
- undo,
- } => {
- let comment = comment_id.resolve(&repository.backend)?;
- if undo {
- comment::react::run(revision_id, comment, reaction, false, &repository, &profile)?;
- } else {
- comment::react::run(revision_id, comment, reaction, true, &repository, &profile)?;
+ } => {
+ let comment = comment.resolve(&repository.backend)?;
+ comment::edit::run(
+ revision,
+ comment,
+ message,
+ args.quiet,
+ &repository,
+ &profile,
+ )?;
}
- }
- Operation::Review {
- patch_id,
- revision_id,
- opts,
+ CommentAction::Redact { revision, comment } => {
+ let comment = comment.resolve(&repository.backend)?;
+ comment::redact::run(revision, comment, &repository, &profile)?;
+ }
+ CommentAction::React {
+ revision,
+ comment,
+ emoji,
+ undo,
+ } => {
+ let comment = comment.resolve(&repository.backend)?;
+ if undo {
+ comment::react::run(revision, comment, emoji, false, &repository, &profile)?;
+ } else {
+ comment::react::run(revision, comment, emoji, true, &repository, &profile)?;
+ }
+ }
+ },
+
+ Command::Review {
+ id,
+ revision,
+ options,
} => {
- let patch_id = patch_id.resolve(&repository.backend)?;
- let revision_id = revision_id
+ let patch_id = id.resolve(&repository.backend)?;
+ let revision_id = revision
.map(|rev| rev.resolve::<radicle::git::Oid>(&repository.backend))
.transpose()?
.map(patch::RevisionId::from);
- review::run(patch_id, revision_id, opts, &profile, &repository)?;
+ review::run(patch_id, revision_id, options.into(), &profile, &repository)?;
}
- Operation::Resolve {
- ref patch_id,
- ref review_id,
- ref comment_id,
- undo,
+
+ Command::Resolve {
+ id,
+ review,
+ comment,
+ unresolve,
} => {
- let patch = patch_id.resolve(&repository.backend)?;
+ let patch = id.resolve(&repository.backend)?;
let review = patch::ReviewId::from(
- review_id.resolve::<radicle::cob::EntryId>(&repository.backend)?,
+ review.resolve::<radicle::cob::EntryId>(&repository.backend)?,
);
- let comment = comment_id.resolve(&repository.backend)?;
- if undo {
+ let comment = comment.resolve(&repository.backend)?;
+ if unresolve {
resolve::unresolve(patch, review, comment, &repository, &profile)?;
- term::success!("Unresolved comment {comment_id}");
+ term::success!("Unresolved comment {comment}");
} else {
resolve::resolve(patch, review, comment, &repository, &profile)?;
- term::success!("Resolved comment {comment_id}");
+ term::success!("Resolved comment {comment}");
}
}
- Operation::Edit {
- patch_id,
- revision_id,
+ Command::Edit {
+ id,
+ revision,
message,
} => {
- let patch_id = patch_id.resolve(&repository.backend)?;
- let revision_id = revision_id
+ let message = Message::from(message);
+ let patch_id = id.resolve(&repository.backend)?;
+ let revision_id = revision
.map(|id| id.resolve::<radicle::git::Oid>(&repository.backend))
.transpose()?
.map(patch::RevisionId::from);
edit::run(&patch_id, revision_id, message, &profile, &repository)?;
}
- Operation::Redact { revision_id } => {
- redact::run(&revision_id, &profile, &repository)?;
+ Command::Redact { id } => {
+ redact::run(&id, &profile, &repository)?;
}
- Operation::Assign {
- patch_id,
- opts: AssignOptions { add, delete },
+ Command::Assign {
+ id,
+ args: AssignArgs { add, delete },
} => {
- let patch_id = patch_id.resolve(&repository.backend)?;
- assign::run(&patch_id, add, delete, &profile, &repository)?;
+ let patch_id = id.resolve(&repository.backend)?;
+ assign::run(
+ &patch_id,
+ add.into_iter().collect(),
+ delete.into_iter().collect(),
+ &profile,
+ &repository,
+ )?;
}
- Operation::Label {
- patch_id,
- opts: LabelOptions { add, delete },
+ Command::Label {
+ id,
+ args: LabelArgs { add, delete },
} => {
- let patch_id = patch_id.resolve(&repository.backend)?;
- label::run(&patch_id, add, delete, &profile, &repository)?;
+ let patch_id = id.resolve(&repository.backend)?;
+ label::run(
+ &patch_id,
+ add.into_iter().collect(),
+ delete.into_iter().collect(),
+ &profile,
+ &repository,
+ )?;
}
- Operation::Set { patch_id, remote } => {
+ Command::Set { id, remote } => {
let patches = term::cob::patches(&profile, &repository)?;
- let patch_id = patch_id.resolve(&repository.backend)?;
+ let patch_id = id.resolve(&repository.backend)?;
let patch = patches
.get(&patch_id)?
.ok_or_else(|| anyhow!("patch {patch_id} not found"))?;
@@ -1074,13 +284,11 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
true,
)?;
}
- Operation::Cache { patch_id, storage } => {
+ Command::Cache { id, storage } => {
let mode = if storage {
cache::CacheMode::Storage
} else {
- let patch_id = patch_id
- .map(|id| id.resolve(&repository.backend))
- .transpose()?;
+ let patch_id = id.map(|id| id.resolve(&repository.backend)).transpose()?;
patch_id.map_or(
cache::CacheMode::Repository {
repository: &repository,
@@ -1093,15 +301,15 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
};
cache::run(mode, &profile)?;
}
- Operation::React {
- revision_id,
- reaction,
+ Command::React {
+ id,
+ emoji: react,
undo,
} => {
if undo {
- react::run(&revision_id, reaction, false, &repository, &profile)?;
+ react::run(&id, react, false, &repository, &profile)?;
} else {
- react::run(&revision_id, reaction, true, &repository, &profile)?;
+ react::run(&id, react, true, &repository, &profile)?;
}
}
}
diff --git a/crates/radicle-cli/src/commands/patch/args.rs b/crates/radicle-cli/src/commands/patch/args.rs
new file mode 100644
index 00000000..5125740e
--- /dev/null
+++ b/crates/radicle-cli/src/commands/patch/args.rs
@@ -0,0 +1,755 @@
+use clap::{Parser, Subcommand};
+
+use radicle::cob::Label;
+use radicle::git;
+use radicle::git::fmt::RefString;
+use radicle::patch::Status;
+use radicle::patch::Verdict;
+use radicle::prelude::Did;
+use radicle::prelude::RepoId;
+
+use crate::commands::patch::checkout;
+use crate::commands::patch::review;
+
+use crate::git::Rev;
+use crate::terminal::patch::Message;
+
+pub(crate) const ABOUT: &str = "Manage patches";
+
+#[derive(Debug, Parser)]
+#[command(about = ABOUT, disable_version_flag = true)]
+pub struct Args {
+ #[command(subcommand)]
+ pub(super) command: Option<Command>,
+
+ /// Quiet output
+ #[arg(short, long, global = true)]
+ pub(super) quiet: bool,
+
+ /// Announce changes made to the network
+ #[arg(long, global = true, conflicts_with = "no_announce")]
+ announce: bool,
+
+ /// Do not announce changes made to the network
+ #[arg(long, global = true, conflicts_with = "announce")]
+ no_announce: bool,
+
+ /// Operate on the given repository [default: cwd]
+ #[arg(long, global = true, value_name = "RID")]
+ pub(super) repo: Option<RepoId>,
+
+ /// Verbose output
+ #[arg(long, short, global = true)]
+ pub(super) verbose: bool,
+
+ /// Arguments for the empty subcommand.
+ /// Will fall back to [`Command::List`].
+ #[clap(flatten)]
+ pub(super) empty: EmptyArgs,
+}
+
+impl Args {
+ pub(super) fn should_announce(&self) -> bool {
+ self.announce || !self.no_announce
+ }
+}
+
+/// Commands to create, view, and edit Radicle patches
+#[derive(Subcommand, Debug)]
+pub(super) enum Command {
+ /// List the patches of a repository
+ #[command(alias = "l")]
+ List(ListArgs),
+
+ /// Show a specific patch
+ #[command(alias = "s")]
+ Show {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// Show the diff of the changes in the patch
+ #[arg(long, short)]
+ patch: bool,
+
+ /// Verbose output
+ #[arg(long, short)]
+ verbose: bool,
+ },
+
+ /// Show the diff of a specific patch
+ ///
+ /// The `git diff` of the revision's base and head will be shown
+ Diff {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// The revision to diff
+ ///
+ /// If not specified, the latest revision of the original author
+ /// will be used
+ #[arg(long, short)]
+ revision: Option<Rev>,
+ },
+
+ /// Mark a patch as archived
+ #[command(alias = "a")]
+ Archive {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// Unarchive a patch
+ ///
+ /// The patch will be marked as open
+ #[arg(long)]
+ undo: bool,
+ },
+
+ /// Update the metadata of a patch
+ #[command(alias = "u")]
+ Update {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// Provide a Git revision as the base commit
+ #[arg(long, short, value_name = "REVSPEC")]
+ base: Option<Rev>,
+
+ /// Change the message of the original revision of the patch
+ #[clap(flatten)]
+ message: MessageArgs,
+ },
+
+ /// Checkout a Git branch pointing to the head of a patch revision
+ ///
+ /// If no revision is specified, the latest revision of the original author
+ /// is chosen
+ #[command(alias = "c")]
+ Checkout {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// Checkout the given revision of the patch
+ #[arg(long)]
+ revision: Option<Rev>,
+
+ #[clap(flatten)]
+ opts: CheckoutArgs,
+ },
+
+ /// Create a review of a patch revision
+ Review {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// The particular revision to review
+ ///
+ /// If none is specified, the initial revision will be reviewed
+ #[arg(long, short)]
+ revision: Option<Rev>,
+
+ #[clap(flatten)]
+ options: ReviewArgs,
+ },
+
+ /// Mark a comment of a review as resolved or unresolved
+ Resolve {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// The review id which the comment is under
+ #[arg(long, value_name = "REVIEW_ID")]
+ review: Rev,
+
+ /// The comment to (un)resolve
+ #[arg(long, value_name = "COMMENT_ID")]
+ comment: Rev,
+
+ /// Unresolve the comment
+ #[arg(long)]
+ unresolve: bool,
+ },
+
+ /// Delete a patch
+ ///
+ /// This will delete any patch data associated with this user. Note that
+ /// other user's data will remain, meaning the patch will remain until all
+ /// other data is also deleted.
+ #[command(alias = "d")]
+ Delete {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+ },
+
+ /// Redact a patch revision
+ #[command(alias = "r")]
+ Redact {
+ /// ID of the patch revision
+ #[arg(value_name = "REVISION_ID")]
+ id: Rev,
+ },
+
+ /// React to a patch or patch revision
+ React {
+ /// ID of the patch or patch revision
+ #[arg(value_name = "PATCH_ID|REVISION_ID")]
+ id: Rev,
+
+ /// The reaction being used
+ #[arg(long, value_name = "CHAR")]
+ emoji: radicle::cob::Reaction,
+
+ /// Remove the reaction
+ #[arg(long)]
+ undo: bool,
+ },
+
+ /// Add or remove assignees to/from a patch
+ Assign {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ #[clap(flatten)]
+ args: AssignArgs,
+ },
+
+ /// Add or remove labels to/from a patch
+ Label {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ #[clap(flatten)]
+ args: LabelArgs,
+ },
+
+ /// If the patch is marked as a draft, then mark it as open
+ #[command(alias = "y")]
+ Ready {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// Convert a patch back to a draft
+ #[arg(long)]
+ undo: bool,
+ },
+
+ #[command(alias = "e")]
+ Edit {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// ID of the patch revision
+ #[arg(long, value_name = "REVISION_ID")]
+ revision: Option<Rev>,
+
+ #[clap(flatten)]
+ message: MessageArgs,
+ },
+
+ /// Set an upstream branch for a patch
+ Set {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Rev,
+
+ /// Provide the git remote to use as the upstream
+ #[arg(long, value_name = "REF", value_parser = parse_refstr)]
+ remote: Option<RefString>,
+ },
+
+ /// Comment on, reply to, edit, or react to a comment
+ Comment(CommentArgs),
+
+ /// Re-cache the patches
+ Cache {
+ /// ID of the patch
+ #[arg(value_name = "PATCH_ID")]
+ id: Option<Rev>,
+
+ /// Re-cache all patches in storage, as opposed to the current repository
+ #[arg(long)]
+ storage: bool,
+ },
+}
+
+impl Command {
+ pub(super) fn should_announce(&self) -> bool {
+ match self {
+ Self::Update { .. }
+ | Self::Archive { .. }
+ | Self::Ready { .. }
+ | Self::Delete { .. }
+ | Self::Comment { .. }
+ | Self::Review { .. }
+ | Self::Resolve { .. }
+ | Self::Assign { .. }
+ | Self::Label { .. }
+ | Self::Edit { .. }
+ | Self::Redact { .. }
+ | Self::React { .. }
+ | Self::Set { .. } => true,
+ Self::Show { .. }
+ | Self::Diff { .. }
+ | Self::Checkout { .. }
+ | Self::List { .. }
+ | Self::Cache { .. } => false,
+ }
+ }
+}
+
+#[derive(Parser, Debug)]
+pub(super) struct CommentArgs {
+ /// ID of the revision to comment on
+ #[arg(value_name = "REVISION_ID")]
+ revision: Rev,
+
+ #[clap(flatten)]
+ message: MessageArgs,
+
+ /// The comment to edit
+ ///
+ /// Use `--message` to edit with the provided message
+ #[arg(
+ long,
+ value_name = "COMMENT_ID",
+ conflicts_with = "react",
+ conflicts_with = "redact"
+ )]
+ edit: Option<Rev>,
+
+ /// The comment to react to
+ ///
+ /// Use `--emoji` for the character to react with
+ ///
+ /// Use `--undo` with `--emoji` to remove the reaction
+ #[arg(
+ long,
+ value_name = "COMMENT_ID",
+ conflicts_with = "edit",
+ conflicts_with = "redact",
+ requires = "emoji",
+ group = "reaction"
+ )]
+ react: Option<Rev>,
+
+ /// The comment to redact
+ #[arg(
+ long,
+ value_name = "COMMENT_ID",
+ conflicts_with = "react",
+ conflicts_with = "edit"
+ )]
+ redact: Option<Rev>,
+
+ /// The emoji to react with
+ ///
+ /// Requires using `--react <COMMENT_ID>`
+ #[arg(long, requires = "reaction")]
+ emoji: Option<radicle::cob::Reaction>,
+
+ /// The comment to reply to
+ #[arg(long, value_name = "COMMENT_ID")]
+ reply_to: Option<Rev>,
+
+ /// Remove the reaction
+ ///
+ /// Requires using `--react <COMMENT_ID> --emoji <EMOJI>`
+ #[arg(long, requires = "reaction")]
+ undo: bool,
+}
+
+#[derive(Debug)]
+pub(super) enum CommentAction {
+ Comment {
+ revision: Rev,
+ message: Message,
+ reply_to: Option<Rev>,
+ },
+ Edit {
+ revision: Rev,
+ comment: Rev,
+ message: Message,
+ },
+ Redact {
+ revision: Rev,
+ comment: Rev,
+ },
+ React {
+ revision: Rev,
+ comment: Rev,
+ emoji: radicle::cob::Reaction,
+ undo: bool,
+ },
+}
+
+impl From<CommentArgs> for CommentAction {
+ fn from(
+ CommentArgs {
+ revision,
+ message,
+ edit,
+ react,
+ redact,
+ reply_to,
+ emoji,
+ undo,
+ }: CommentArgs,
+ ) -> Self {
+ match (edit, react, redact) {
+ (Some(edit), None, None) => CommentAction::Edit {
+ revision,
+ comment: edit,
+ message: Message::from(message),
+ },
+ (None, Some(react), None) => CommentAction::React {
+ revision,
+ comment: react,
+ emoji: emoji.unwrap(),
+ undo,
+ },
+ (None, None, Some(redact)) => CommentAction::Redact {
+ revision,
+ comment: redact,
+ },
+ (None, None, None) => Self::Comment {
+ revision,
+ message: Message::from(message),
+ reply_to,
+ },
+ _ => unreachable!("`--edit`, `--react`, and `--redact` cannot be used together"),
+ }
+ }
+}
+
+#[derive(Parser, Debug, Default)]
+pub(super) struct EmptyArgs {
+ #[arg(long, hide = true, value_name = "DID", num_args = 1.., action = clap::ArgAction::Append)]
+ authors: Vec<Did>,
+
+ #[arg(long, hide = true)]
+ authored: bool,
+
+ #[clap(flatten)]
+ state: EmptyStateArgs,
+}
+
+#[derive(Parser, Debug, Default)]
+#[group(multiple = false)]
+pub(super) struct EmptyStateArgs {
+ #[arg(long, hide = true)]
+ all: bool,
+
+ #[arg(long, hide = true)]
+ draft: bool,
+
+ #[arg(long, hide = true)]
+ open: bool,
+
+ #[arg(long, hide = true)]
+ merged: bool,
+
+ #[arg(long, hide = true)]
+ archived: bool,
+}
+
+#[derive(Parser, Debug, Default)]
+pub(super) struct ListArgs {
+ /// Show only patched where the given user is an author (may be specified
+ /// multiple times)
+ #[arg(
+ long = "author",
+ value_name = "DID",
+ num_args = 1..,
+ action = clap::ArgAction::Append,
+ )]
+ pub(super) authors: Vec<Did>,
+
+ /// Show only patches that you have authored
+ #[arg(long)]
+ pub(super) authored: bool,
+
+ #[clap(flatten)]
+ pub(super) state: ListStateArgs,
+}
+
+impl From<EmptyArgs> for ListArgs {
+ fn from(args: EmptyArgs) -> Self {
+ Self {
+ authors: args.authors,
+ authored: args.authored,
+ state: ListStateArgs::from(args.state),
+ }
+ }
+}
+
+#[derive(Parser, Debug, Default)]
+#[group(multiple = false)]
+pub(crate) struct ListStateArgs {
+ /// Show all patches, including draft, merged, and archived patches
+ #[arg(long)]
+ pub(crate) all: bool,
+
+ /// Show only draft patches
+ #[arg(long)]
+ pub(crate) draft: bool,
+
+ /// Show only open patches (default)
+ #[arg(long)]
+ pub(crate) open: bool,
+
+ /// Show only merged patches
+ #[arg(long)]
+ pub(crate) merged: bool,
+
+ /// Show only archived patches
+ #[arg(long)]
+ pub(crate) archived: bool,
+}
+
+impl From<EmptyStateArgs> for ListStateArgs {
+ fn from(args: EmptyStateArgs) -> Self {
+ Self {
+ all: args.all,
+ draft: args.draft,
+ open: args.open,
+ merged: args.merged,
+ archived: args.archived,
+ }
+ }
+}
+
+impl From<&ListStateArgs> for Option<&Status> {
+ fn from(args: &ListStateArgs) -> Self {
+ match (args.all, args.draft, args.open, args.merged, args.archived) {
+ (true, false, false, false, false) => None,
+ (false, true, false, false, false) => Some(&Status::Draft),
+ (false, false, true, false, false) | (false, false, false, false, false) => {
+ Some(&Status::Open)
+ }
+ (false, false, false, true, false) => Some(&Status::Merged),
+ (false, false, false, false, true) => Some(&Status::Archived),
+ _ => unreachable!(),
+ }
+ }
+}
+
+#[derive(Debug, Parser)]
+pub(super) struct ReviewArgs {
+ /// Review by patch hunks
+ ///
+ /// This operation is obsolete
+ #[arg(long, short, group = "by-hunk", conflicts_with = "delete")]
+ patch: bool,
+
+ /// Generate diffs with <N> lines of context
+ ///
+ /// This operation is obsolete
+ #[arg(
+ long,
+ short = 'U',
+ value_name = "N",
+ requires = "by-hunk",
+ default_value_t = 3
+ )]
+ unified: usize,
+
+ /// Only review a specific hunk
+ ///
+ /// This operation is obsolete
+ #[arg(long, value_name = "INDEX", requires = "by-hunk")]
+ hunk: Option<usize>,
+
+ /// Accept a patch revision
+ #[arg(long, conflicts_with = "reject", conflicts_with = "delete")]
+ accept: bool,
+
+ /// Reject a patch revision
+ #[arg(long, conflicts_with = "delete")]
+ reject: bool,
+
+ /// Delete a review draft
+ ///
+ /// This operation is obsolete
+ #[arg(long, short)]
+ delete: bool,
+
+ #[clap(flatten)]
+ message_args: MessageArgs,
+}
+
+impl ReviewArgs {
+ fn as_operation(&self) -> review::Operation {
+ let Self {
+ patch,
+ accept,
+ reject,
+ delete,
+ ..
+ } = self;
+
+ if *patch {
+ let verdict = if *accept {
+ Some(Verdict::Accept)
+ } else if *reject {
+ Some(Verdict::Reject)
+ } else {
+ None
+ };
+ return review::Operation::Review(review::ReviewOptions {
+ by_hunk: true,
+ unified: self.unified,
+ hunk: self.hunk,
+ verdict,
+ });
+ }
+
+ if *delete {
+ return review::Operation::Delete;
+ }
+
+ if *accept {
+ return review::Operation::Review(review::ReviewOptions {
+ by_hunk: false,
+ unified: 3,
+ hunk: None,
+ verdict: Some(Verdict::Accept),
+ });
+ }
+
+ if *reject {
+ return review::Operation::Review(review::ReviewOptions {
+ by_hunk: false,
+ unified: 3,
+ hunk: None,
+ verdict: Some(Verdict::Reject),
+ });
+ }
+
+ panic!("expected one of `--patch`, `--delete`, `--accept`, or `--reject`");
+ }
+}
+
+impl From<ReviewArgs> for review::Options {
+ fn from(args: ReviewArgs) -> Self {
+ let op = args.as_operation();
+ Self {
+ message: Message::from(args.message_args),
+ op,
+ }
+ }
+}
+
+#[derive(Debug, clap::Args)]
+#[group(required = false, multiple = false)]
+pub(super) struct MessageArgs {
+ /// Provide a message (default: prompt)
+ ///
+ /// This can be specified multiple times. This will result in newlines
+ /// between the specified messages.
+ #[clap(
+ long,
+ short,
+ value_name = "MESSAGE",
+ num_args = 1..,
+ action = clap::ArgAction::Append
+ )]
+ pub(super) message: Option<Vec<String>>,
+
+ /// Do not provide a message
+ #[arg(long, conflicts_with = "message")]
+ pub(super) no_message: bool,
+}
+
+impl From<MessageArgs> for Message {
+ fn from(
+ MessageArgs {
+ message,
+ no_message,
+ }: MessageArgs,
+ ) -> Self {
+ if no_message {
+ assert!(message.is_none());
+ return Self::Blank;
+ }
+
+ match message {
+ Some(messages) => messages.into_iter().fold(Self::Blank, |mut result, m| {
+ result.append(&m);
+ result
+ }),
+ None => Self::Edit,
+ }
+ }
+}
+
+#[derive(Debug, clap::Args)]
+pub(super) struct CheckoutArgs {
+ /// Provide a name for the branch to checkout
+ #[arg(long, value_name = "BRANCH", value_parser = parse_refstr)]
+ pub(super) name: Option<RefString>,
+
+ /// Provide the git remote to use as the upstream
+ #[arg(long, value_parser = parse_refstr)]
+ pub(super) remote: Option<RefString>,
+
+ /// Checkout the head of the revision, even if the branch already exists
+ #[arg(long, short)]
+ pub(super) force: bool,
+}
+
+impl From<CheckoutArgs> for checkout::Options {
+ fn from(value: CheckoutArgs) -> Self {
+ Self {
+ name: value.name,
+ remote: value.remote,
+ force: value.force,
+ }
+ }
+}
+
+#[derive(Parser, Debug)]
+#[group(required = true)]
+pub(super) struct AssignArgs {
+ /// Add an assignee to the patch (may be specified multiple times).
+ ///
+ /// Note: `--add` takes precedence over `--delete`
+ #[arg(long, short, value_name = "DID", num_args = 1.., action = clap::ArgAction::Append)]
+ pub(super) add: Vec<Did>,
+
+ /// Remove an assignee from the patch (may be specified multiple times).
+ ///
+ /// Note: `--add` takes precedence over `--delete`
+ #[clap(long, short, value_name = "DID", num_args = 1.., action = clap::ArgAction::Append)]
+ pub(super) delete: Vec<Did>,
+}
+
+#[derive(Parser, Debug)]
+#[group(required = true)]
+pub(super) struct LabelArgs {
+ /// Add a label to the patch (may be specified multiple times).
+ ///
+ /// Note: `--add` takes precedence over `--delete`
+ #[arg(long, short, value_name = "LABEL", num_args = 1.., action = clap::ArgAction::Append)]
+ pub(super) add: Vec<Label>,
+
+ /// Remove a label from the patch (may be specified multiple times).
+ ///
+ /// Note: `--add` takes precedence over `--delete`
+ #[clap(long, short, value_name = "LABEL", num_args = 1.., action = clap::ArgAction::Append)]
+ pub(super) delete: Vec<Label>,
+}
+
+fn parse_refstr(refstr: &str) -> Result<RefString, git::fmt::Error> {
+ RefString::try_from(refstr)
+}
diff --git a/crates/radicle-cli/src/commands/patch/review.rs b/crates/radicle-cli/src/commands/patch/review.rs
index fe4e28eb..5e3a398a 100644
--- a/crates/radicle-cli/src/commands/patch/review.rs
+++ b/crates/radicle-cli/src/commands/patch/review.rs
@@ -21,19 +21,16 @@ Markdown supported.
"#;
#[derive(Debug, PartialEq, Eq)]
-pub enum Operation {
- Delete,
- Review {
- by_hunk: bool,
- unified: usize,
- hunk: Option<usize>,
- verdict: Option<Verdict>,
- },
+pub(super) struct ReviewOptions {
+ pub(super) by_hunk: bool,
+ pub(super) unified: usize,
+ pub(super) hunk: Option<usize>,
+ pub(super) verdict: Option<Verdict>,
}
-impl Default for Operation {
+impl Default for ReviewOptions {
fn default() -> Self {
- Self::Review {
+ Self {
by_hunk: false,
unified: 3,
hunk: None,
@@ -42,6 +39,18 @@ impl Default for Operation {
}
}
+#[derive(Debug, PartialEq, Eq)]
+pub(super) enum Operation {
+ Delete,
+ Review(ReviewOptions),
+}
+
+impl Default for Operation {
+ fn default() -> Self {
+ Operation::Review(ReviewOptions::default())
+ }
+}
+
#[derive(Debug, Default)]
pub struct Options {
pub message: Message,
@@ -77,12 +86,12 @@ pub fn run(
let patch_id_pretty = term::format::tertiary(term::format::cob(&patch_id));
match options.op {
- Operation::Review {
- verdict,
+ Operation::Review(ReviewOptions {
by_hunk,
unified,
hunk,
- } if by_hunk => {
+ verdict,
+ }) if by_hunk => {
crate::warning::obsolete("rad patch review --patch");
let mut opts = git::raw::DiffOptions::new();
opts.patience(true)
@@ -94,7 +103,7 @@ pub fn run(
.verdict(verdict)
.run(revision, &mut opts, &signer)?;
}
- Operation::Review { verdict, .. } => {
+ Operation::Review(ReviewOptions { verdict, .. }) => {
let message = options.message.get(REVIEW_HELP_MSG)?;
let message = message.replace(REVIEW_HELP_MSG.trim(), "");
let message = if message.is_empty() {
diff --git a/crates/radicle-cli/src/commands/patch/show.rs b/crates/radicle-cli/src/commands/patch/show.rs
index 80d093fd..4e3d3dec 100644
--- a/crates/radicle-cli/src/commands/patch/show.rs
+++ b/crates/radicle-cli/src/commands/patch/show.rs
@@ -5,6 +5,7 @@ use radicle::git;
use radicle::storage::git::Repository;
use crate::terminal as term;
+use crate::terminal::Error;
use super::*;
diff --git a/crates/radicle-cli/src/main.rs b/crates/radicle-cli/src/main.rs
index 9edaa5b0..404877b3 100644
--- a/crates/radicle-cli/src/main.rs
+++ b/crates/radicle-cli/src/main.rs
@@ -75,6 +75,7 @@ enum Commands {
Issue(issue::Args),
Ls(ls::Args),
Node(node::Args),
+ Patch(patch::Args),
Path(path::Args),
Publish(publish::Args),
Remote(remote::Args),
@@ -311,7 +312,9 @@ pub(crate) fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyho
}
}
"patch" => {
- term::run_command_args::<patch::Options, _>(patch::HELP, patch::run, args.to_vec());
+ if let Some(Commands::Patch(args)) = CliArgs::parse().command {
+ term::run_command_fn(patch::run, args);
+ }
}
"path" => {
if let Some(Commands::Path(args)) = CliArgs::parse().command {
Exit code: 0
shell: 'export RUSTDOCFLAGS=''-D warnings'' cargo --version rustc --version cargo fmt --check cargo clippy --all-targets --workspace -- --deny warnings cargo build --all-targets --workspace cargo doc --workspace --no-deps cargo test --workspace --no-fail-fast '
Commands:
$ podman run --name cebf607e-fc00-4ba7-8257-042e5bfd9cf6 -v /opt/radcis/ci.rad.levitte.org/cci/state/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/s:/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w:/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w -w /cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:bookworm bash /cebf607e-fc00-4ba7-8257-042e5bfd9cf6/s/script.sh
+ export 'RUSTDOCFLAGS=-D warnings'
+ RUSTDOCFLAGS='-D warnings'
+ cargo --version
info: syncing channel updates for '1.90-x86_64-unknown-linux-gnu'
info: latest update on 2025-09-18, rust version 1.90.0 (1159e78c4 2025-09-14)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-src'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-src'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'
cargo 1.90.0 (840b83a10 2025-07-30)
+ rustc --version
rustc 1.90.0 (1159e78c4 2025-09-14)
+ cargo fmt --check
+ cargo clippy --all-targets --workspace -- --deny warnings
Updating crates.io index
Downloading crates ...
Downloaded bytesize v2.0.1
Downloaded addr2line v0.24.2
Downloaded fxhash v0.2.1
Downloaded gix-chunk v0.4.11
Downloaded gix-negotiate v0.21.0
Downloaded gix-object v0.50.2
Downloaded git2 v0.19.0
Downloaded icu_locid_transform v1.5.0
Downloaded matchers v0.1.0
Downloaded localtime v1.3.1
Downloaded phf v0.11.3
Downloaded indicatif v0.18.0
Downloaded lock_api v0.4.14
Downloaded group v0.13.0
Downloaded litrs v0.4.1
Downloaded keccak v0.1.5
Downloaded clap_derive v4.5.41
Downloaded jsonschema v0.30.0
Downloaded gix-revision v0.35.0
Downloaded gix-lock v18.0.0
Downloaded gix-refspec v0.31.0
Downloaded log v0.4.27
Downloaded jobserver v0.1.31
Downloaded lazy_static v1.5.0
Downloaded memmap2 v0.9.8
Downloaded litemap v0.7.5
Downloaded icu_provider v1.5.0
Downloaded parking_lot v0.12.5
Downloaded miniz_oxide v0.8.8
Downloaded libz-rs-sys v0.5.2
Downloaded pbkdf2 v0.12.2
Downloaded phf_shared v0.11.3
Downloaded pkcs1 v0.7.5
Downloaded qcheck-macros v1.0.0
Downloaded radicle-std-ext v0.1.1
Downloaded radicle-git-ext v0.10.0
Downloaded outref v0.5.2
Downloaded num v0.4.3
Downloaded ref-cast v1.0.24
Downloaded rand_core v0.6.4
Downloaded memchr v2.7.2
Downloaded snapbox-macros v0.3.8
Downloaded proc-macro-error2 v2.0.1
Downloaded quote v1.0.41
Downloaded gix-pack v0.60.0
Downloaded sval_buffer v2.14.1
Downloaded spki v0.7.3
Downloaded shell-words v1.1.0
Downloaded same-file v1.0.6
Downloaded shlex v1.3.0
Downloaded sec1 v0.7.3
Downloaded thiserror-impl v1.0.69
Downloaded serde_spanned v1.0.0
Downloaded sval_serde v2.14.1
Downloaded sval_json v2.14.1
Downloaded signal-hook-mio v0.2.4
Downloaded toml_datetime v0.7.0
Downloaded sha2 v0.10.8
Downloaded streaming-iterator v0.1.9
Downloaded ssh-cipher v0.2.0
Downloaded thiserror-impl v2.0.12
Downloaded toml_writer v1.0.2
Downloaded sval_dynamic v2.14.1
Downloaded icu_properties_data v1.5.1
Downloaded value-bag-serde1 v1.11.1
Downloaded tinystr v0.7.6
Downloaded tempfile v3.23.0
Downloaded tracing-log v0.2.0
Downloaded tree-sitter-language v0.1.2
Downloaded unicode-width v0.1.11
Downloaded write16 v1.0.0
Downloaded tree-sitter-html v0.23.2
Downloaded yansi v0.5.1
Downloaded zerofrom v0.1.6
Downloaded xattr v1.3.1
Downloaded version_check v0.9.4
Downloaded vsimd v0.8.0
Downloaded unit-prefix v0.5.1
Downloaded toml v0.9.5
Downloaded zerofrom-derive v0.1.6
Downloaded yoke-derive v0.7.5
Downloaded writeable v0.5.5
Downloaded zerovec-derive v0.10.3
Downloaded unicode-ident v1.0.12
Downloaded typenum v1.17.0
Downloaded tracing v0.1.41
Downloaded serde v1.0.219
Downloaded url v2.5.4
Downloaded uuid v1.16.0
Downloaded regex v1.11.1
Downloaded unicode-segmentation v1.11.0
Downloaded unicode-normalization v0.1.23
Downloaded portable-atomic v1.11.0
Downloaded tree-sitter v0.24.4
Downloaded zerocopy v0.7.35
Downloaded zerovec v0.10.4
Downloaded winnow v0.7.13
Downloaded tree-sitter-c v0.23.2
Downloaded zlib-rs v0.5.2
Downloaded vcpkg v0.2.15
Downloaded syn v2.0.106
Downloaded tree-sitter-rust v0.23.2
Downloaded rustix v0.38.34
Downloaded libc v0.2.174
Downloaded rustix v1.0.7
Downloaded jiff v0.2.15
Downloaded tree-sitter-md v0.3.2
Downloaded tree-sitter-ruby v0.23.1
Downloaded tree-sitter-bash v0.23.3
Downloaded regex-automata v0.4.9
Downloaded regex-syntax v0.8.5
Downloaded unicode-width v0.2.1
Downloaded regex-syntax v0.6.29
Downloaded sha3 v0.10.8
Downloaded syn v1.0.109
Downloaded tree-sitter-python v0.23.4
Downloaded tracing-subscriber v0.3.19
Downloaded sha1-checked v0.10.0
Downloaded serde_json v1.0.140
Downloaded radicle-surf v0.25.0
Downloaded object v0.36.7
Downloaded bloomy v1.2.0
Downloaded tree-sitter-go v0.23.4
Downloaded ssh-key v0.6.6
Downloaded tokio v1.47.1
Downloaded zeroize v1.7.0
Downloaded tree-sitter-typescript v0.23.2
Downloaded yoke v0.7.5
Downloaded value-bag v1.11.1
Downloaded walkdir v2.5.0
Downloaded unicode-display-width v0.3.0
Downloaded tree-sitter-css v0.23.1
Downloaded tracing-core v0.1.34
Downloaded signal-hook v0.3.18
Downloaded sqlite3-src v0.5.1
Downloaded universal-hash v0.5.1
Downloaded tinyvec v1.6.0
Downloaded utf16_iter v1.0.5
Downloaded linux-raw-sys v0.4.13
Downloaded typeid v1.0.3
Downloaded tree-sitter-toml-ng v0.6.0
Downloaded regex-automata v0.1.10
Downloaded schemars v1.0.4
Downloaded utf8parse v0.2.1
Downloaded utf8_iter v1.0.4
Downloaded rsa v0.9.6
Downloaded value-bag-sval2 v1.11.1
Downloaded tree-sitter-highlight v0.24.4
Downloaded sharded-slab v0.1.7
Downloaded serde_derive v1.0.219
Downloaded p384 v0.13.0
Downloaded linux-raw-sys v0.9.4
Downloaded timeago v0.4.2
Downloaded thread_local v1.1.9
Downloaded thiserror v2.0.12
Downloaded libgit2-sys v0.17.0+1.8.1
Downloaded noise-framework v0.4.0
Downloaded thiserror v1.0.69
Downloaded tar v0.4.40
Downloaded pretty_assertions v1.4.0
Downloaded uuid-simd v0.8.0
Downloaded tree-sitter-json v0.24.8
Downloaded tinyvec_macros v0.1.1
Downloaded sval_fmt v2.14.1
Downloaded socket2 v0.5.7
Downloaded snapbox v0.4.17
Downloaded similar v2.5.0
Downloaded prodash v30.0.1
Downloaded p521 v0.13.3
Downloaded systemd-journal-logger v2.2.2
Downloaded sval_nested v2.14.1
Downloaded rand v0.8.5
Downloaded proc-macro2 v1.0.101
Downloaded spin v0.9.8
Downloaded smallvec v1.15.1
Downloaded stable_deref_trait v1.2.0
Downloaded ssh-encoding v0.2.0
Downloaded siphasher v0.3.11
Downloaded signal-hook-registry v1.4.5
Downloaded ryu v1.0.17
Downloaded sval v2.14.1
Downloaded subtle v2.5.0
Downloaded socks5-client v0.4.1
Downloaded signature v1.6.4
Downloaded serde_derive_internals v0.29.1
Downloaded referencing v0.30.0
Downloaded sem_safe v0.2.0
Downloaded test-log-macros v0.2.18
Downloaded test-log v0.2.18
Downloaded synstructure v0.13.1
Downloaded sval_ref v2.14.1
Downloaded sha1 v0.10.6
Downloaded num-bigint-dig v0.8.4
Downloaded qcheck v1.0.0
Downloaded pkcs8 v0.10.2
Downloaded rustc-demangle v0.1.26
Downloaded salsa20 v0.10.2
Downloaded mio v0.8.11
Downloaded amplify v4.6.0
Downloaded escargot v0.5.10
Downloaded siphasher v1.0.1
Downloaded signature v2.2.0
Downloaded polyval v0.6.2
Downloaded num-bigint v0.4.6
Downloaded mio v1.0.4
Downloaded itertools v0.14.0
Downloaded structured-logger v1.0.4
Downloaded strsim v0.11.1
Downloaded sqlite3-sys v0.15.2
Downloaded sqlite v0.32.0
Downloaded serde_fmt v1.0.3
Downloaded serde-untagged v0.1.7
Downloaded scrypt v0.11.0
Downloaded scopeguard v1.2.0
Downloaded libz-sys v1.1.16
Downloaded schemars_derive v1.0.4
Downloaded ref-cast-impl v1.0.24
Downloaded pkg-config v0.3.30
Downloaded parking_lot_core v0.9.12
Downloaded p256 v0.13.2
Downloaded num-traits v0.2.19
Downloaded gix-fs v0.16.1
Downloaded rfc6979 v0.4.0
Downloaded rand_chacha v0.3.1
Downloaded paste v1.0.15
Downloaded overload v0.1.1
Downloaded os_info v3.12.0
Downloaded once_cell v1.21.3
Downloaded num-rational v0.4.2
Downloaded num-complex v0.4.6
Downloaded libm v0.2.8
Downloaded amplify_num v0.5.2
Downloaded proc-macro-error-attr2 v2.0.0
Downloaded num-iter v0.1.45
Downloaded num-integer v0.1.46
Downloaded num-cmp v0.1.0
Downloaded nu-ansi-term v0.46.0
Downloaded nonempty v0.9.0
Downloaded clap_builder v4.5.44
Downloaded ppv-lite86 v0.2.17
Downloaded signals_receipts v0.2.0
Downloaded poly1305 v0.8.0
Downloaded jiff-static v0.2.15
Downloaded opaque-debug v0.3.1
Downloaded primeorder v0.13.6
Downloaded idna v1.0.3
Downloaded pin-project-lite v0.2.16
Downloaded normalize-line-endings v0.3.0
Downloaded icu_properties v1.5.1
Downloaded newline-converter v0.3.0
Downloaded multibase v0.9.1
Downloaded pem-rfc7468 v0.7.0
Downloaded gix-hash v0.19.0
Downloaded crossterm v0.29.0
Downloaded percent-encoding v2.3.1
Downloaded chrono v0.4.38
Downloaded indexmap v2.2.6
Downloaded icu_collections v1.5.0
Downloaded gix-validate v0.10.0
Downloaded gix-transport v0.48.0
Downloaded gix-packetline v0.19.1
Downloaded inout v0.1.3
Downloaded gix-revwalk v0.21.0
Downloaded gix-quote v0.6.0
Downloaded bstr v1.12.0
Downloaded maybe-async v0.2.10
Downloaded itoa v1.0.11
Downloaded home v0.5.9
Downloaded heck v0.5.0
Downloaded emojis v0.6.4
Downloaded derive_more v2.0.1
Downloaded icu_normalizer_data v1.5.1
Downloaded fancy-regex v0.14.0
Downloaded derive_more-impl v2.0.1
Downloaded der v0.7.9
Downloaded cc v1.2.2
Downloaded icu_locid_transform_data v1.5.1
Downloaded gix-traverse v0.47.0
Downloaded gix-prompt v0.11.1
Downloaded lexopt v0.3.0
Downloaded crossterm v0.25.0
Downloaded base64 v0.22.1
Downloaded bitflags v2.9.1
Downloaded heapless v0.8.0
Downloaded gix-trace v0.1.13
Downloaded gix-path v0.10.20
Downloaded env_logger v0.11.8
Downloaded elliptic-curve v0.13.8
Downloaded gix-ref v0.53.1
Downloaded either v1.11.0
Downloaded crossbeam-utils v0.8.19
Downloaded fastrand v2.3.0
Downloaded errno v0.3.13
Downloaded erased-serde v0.4.6
Downloaded equivalent v1.0.1
Downloaded ed25519 v1.5.3
Downloaded data-encoding v2.5.0
Downloaded console v0.16.0
Downloaded base64ct v1.6.0
Downloaded hashbrown v0.14.3
Downloaded email_address v0.2.9
Downloaded cipher v0.4.4
Downloaded bitflags v1.3.2
Downloaded bit-set v0.8.0
Downloaded icu_locid v1.5.0
Downloaded hashbrown v0.15.5
Downloaded gix-url v0.32.0
Downloaded gix-hashtable v0.9.0
Downloaded fast-glob v0.3.3
Downloaded cyphergraphy v0.3.0
Downloaded crc32fast v1.5.0
Downloaded bytecount v0.6.8
Downloaded gix-protocol v0.51.0
Downloaded ff v0.13.0
Downloaded faster-hex v0.10.0
Downloaded env_filter v0.1.3
Downloaded data-encoding-macro-internal v0.1.12
Downloaded convert_case v0.7.1
Downloaded colored v2.1.0
Downloaded block-buffer v0.10.4
Downloaded gix-utils v0.3.0
Downloaded gix-shallow v0.5.0
Downloaded gix-sec v0.12.0
Downloaded document-features v0.2.11
Downloaded displaydoc v0.2.5
Downloaded digest v0.10.7
Downloaded cypheraddr v0.4.0
Downloaded borrow-or-share v0.2.2
Downloaded iana-time-zone v0.1.60
Downloaded hash32 v0.3.1
Downloaded gix-tempfile v18.0.0
Downloaded ecdsa v0.16.9
Downloaded data-encoding-macro v0.1.14
Downloaded ct-codecs v1.1.1
Downloaded colorchoice v1.0.0
Downloaded byteorder v1.5.0
Downloaded bcrypt-pbkdf v0.10.0
Downloaded idna_adapter v1.2.0
Downloaded icu_normalizer v1.5.0
Downloaded cyphernet v0.5.2
Downloaded chacha20 v0.9.1
Downloaded backtrace v0.3.75
Downloaded inquire v0.7.5
Downloaded dyn-clone v1.0.17
Downloaded dunce v1.0.5
Downloaded diff v0.1.13
Downloaded ctr v0.9.2
Downloaded crypto-bigint v0.5.5
Downloaded const-oid v0.9.6
Downloaded bit-vec v0.8.0
Downloaded amplify_syn v2.0.1
Downloaded aes-gcm v0.10.3
Downloaded icu_provider_macros v1.5.0
Downloaded human-panic v2.0.3
Downloaded hmac v0.12.1
Downloaded ec25519 v0.1.0
Downloaded crypto-common v0.1.6
Downloaded clap_lex v0.7.5
Downloaded chacha20poly1305 v0.10.1
Downloaded cbc v0.1.2
Downloaded bytes v1.10.1
Downloaded blowfish v0.9.1
Downloaded base64 v0.21.7
Downloaded base32 v0.4.0
Downloaded base-x v0.2.11
Downloaded ascii v1.1.0
Downloaded arc-swap v1.7.1
Downloaded anyhow v1.0.82
Downloaded anstyle-query v1.0.2
Downloaded anstyle v1.0.11
Downloaded anstream v0.6.13
Downloaded amplify_derive v4.0.0
Downloaded ahash v0.8.11
Downloaded aes v0.8.4
Downloaded adler2 v2.0.0
Downloaded gix-odb v0.70.0
Downloaded crossbeam-channel v0.5.15
Downloaded cpufeatures v0.2.12
Downloaded clap v4.5.44
Downloaded cfg-if v1.0.0
Downloaded block-padding v0.3.3
Downloaded base16ct v0.2.0
Downloaded anstyle-parse v0.2.3
Downloaded gimli v0.31.1
Downloaded autocfg v1.2.0
Downloaded aead v0.5.2
Downloaded gix-features v0.43.1
Downloaded gix-diff v0.53.0
Downloaded gix-date v0.10.5
Downloaded gix-credentials v0.30.0
Downloaded git-ref-format-core v0.5.0
Downloaded getrandom v0.2.15
Downloaded fraction v0.15.3
Downloaded flate2 v1.1.1
Downloaded filetime v0.2.23
Downloaded gix-config-value v0.15.1
Downloaded gix-commitgraph v0.29.0
Downloaded gix-command v0.6.2
Downloaded gix-actor v0.35.4
Downloaded ghash v0.5.1
Downloaded getrandom v0.3.3
Downloaded generic-array v0.14.7
Downloaded form_urlencoded v1.2.1
Downloaded fluent-uri v0.3.2
Downloaded aho-corasick v1.1.3
Downloaded git-ref-format-macro v0.5.0
Downloaded git-ref-format v0.5.0
Compiling libc v0.2.174
Compiling proc-macro2 v1.0.101
Compiling quote v1.0.41
Compiling unicode-ident v1.0.12
Checking cfg-if v1.0.0
Compiling version_check v0.9.4
Compiling shlex v1.3.0
Checking memchr v2.7.2
Compiling jobserver v0.1.31
Compiling typenum v1.17.0
Compiling syn v2.0.106
Compiling cc v1.2.2
Checking getrandom v0.2.15
Compiling generic-array v0.14.7
Checking rand_core v0.6.4
Compiling serde v1.0.219
Checking aho-corasick v1.1.3
Checking crypto-common v0.1.6
Checking regex-syntax v0.8.5
Checking smallvec v1.15.1
Checking subtle v2.5.0
Checking stable_deref_trait v1.2.0
Checking cpufeatures v0.2.12
Checking once_cell v1.21.3
Compiling parking_lot_core v0.9.12
Checking scopeguard v1.2.0
Checking fastrand v2.3.0
Checking lock_api v0.4.14
Checking block-buffer v0.10.4
Compiling thiserror v2.0.12
Checking parking_lot v0.12.5
Checking digest v0.10.7
Compiling crc32fast v1.5.0
Checking tinyvec_macros v0.1.1
Checking byteorder v1.5.0
Checking tinyvec v1.6.0
Compiling typeid v1.0.3
Checking regex-automata v0.4.9
Checking bitflags v2.9.1
Checking gix-trace v0.1.13
Checking home v0.5.9
Checking unicode-normalization v0.1.23
Compiling synstructure v0.13.1
Checking zlib-rs v0.5.2
Checking gix-utils v0.3.0
Checking same-file v1.0.6
Checking walkdir v2.5.0
Checking prodash v30.0.1
Checking bstr v1.12.0
Compiling serde_derive v1.0.219
Compiling thiserror-impl v2.0.12
Checking libz-rs-sys v0.5.2
Compiling zerofrom-derive v0.1.6
Checking flate2 v1.1.1
Compiling yoke-derive v0.7.5
Checking zerofrom v0.1.6
Checking gix-validate v0.10.0
Compiling zerovec-derive v0.10.3
Checking yoke v0.7.5
Checking gix-path v0.10.20
Compiling displaydoc v0.2.5
Checking gix-features v0.43.1
Checking itoa v1.0.11
Compiling heapless v0.8.0
Checking hash32 v0.3.1
Checking zeroize v1.7.0
Checking zerovec v0.10.4
Compiling pkg-config v0.3.30
Checking litemap v0.7.5
Checking writeable v0.5.5
Checking tinystr v0.7.6
Compiling icu_locid_transform_data v1.5.1
Compiling thiserror v1.0.69
Checking icu_locid v1.5.0
Checking faster-hex v0.10.0
Compiling icu_provider_macros v1.5.0
Compiling thiserror-impl v1.0.69
Compiling rustix v1.0.7
Compiling icu_properties_data v1.5.1
Checking icu_provider v1.5.0
Checking sha1 v0.10.6
Checking block-padding v0.3.3
Compiling icu_normalizer_data v1.5.1
Checking linux-raw-sys v0.9.4
Checking inout v0.1.3
Checking erased-serde v0.4.6
Checking serde_fmt v1.0.3
Checking sha1-checked v0.10.0
Checking value-bag-serde1 v1.11.1
Checking value-bag v1.11.1
Checking icu_locid_transform v1.5.0
Checking icu_collections v1.5.0
Checking log v0.4.27
Compiling getrandom v0.3.3
Compiling syn v1.0.109
Checking icu_properties v1.5.1
Checking gix-hash v0.19.0
Checking cipher v0.4.4
Checking write16 v1.0.0
Checking utf16_iter v1.0.5
Checking utf8_iter v1.0.4
Checking percent-encoding v2.3.1
Checking form_urlencoded v1.2.1
Checking sha2 v0.10.8
Checking icu_normalizer v1.5.0
Compiling vcpkg v0.2.15
Checking idna_adapter v1.2.0
Checking idna v1.0.3
Checking universal-hash v0.5.1
Checking opaque-debug v0.3.1
Checking url v2.5.4
Checking tempfile v3.23.0
Compiling libz-sys v1.1.16
Compiling autocfg v1.2.0
Compiling amplify_syn v2.0.1
Compiling num-traits v0.2.19
Compiling libgit2-sys v0.17.0+1.8.1
Checking signature v1.6.4
Checking hashbrown v0.14.3
Compiling serde_json v1.0.140
Checking equivalent v1.0.1
Checking ed25519 v1.5.3
Checking indexmap v2.2.6
Checking aead v0.5.2
Checking amplify_num v0.5.2
Checking ryu v1.0.17
Compiling ref-cast v1.0.24
Checking ascii v1.1.0
Compiling amplify_derive v4.0.0
Checking ct-codecs v1.1.1
Checking ec25519 v0.1.0
Checking poly1305 v0.8.0
Checking git-ref-format-core v0.5.0
Checking chacha20 v0.9.1
Compiling ref-cast-impl v1.0.24
Checking polyval v0.6.2
Compiling sqlite3-src v0.5.1
Checking hmac v0.12.1
Checking keccak v0.1.5
Checking base64ct v1.6.0
Checking dyn-clone v1.0.17
Checking amplify v4.6.0
Checking sha3 v0.10.8
Checking pem-rfc7468 v0.7.0
Checking pbkdf2 v0.12.2
Checking cyphergraphy v0.3.0
Checking ghash v0.5.1
Checking ctr v0.9.2
Checking aes v0.8.4
Checking rand v0.8.5
Compiling data-encoding v2.5.0
Checking base32 v0.4.0
Compiling crossbeam-utils v0.8.19
Compiling data-encoding-macro-internal v0.1.12
Checking cypheraddr v0.4.0
Checking qcheck v1.0.0
Checking aes-gcm v0.10.3
Checking ssh-encoding v0.2.0
Checking chacha20poly1305 v0.10.1
Checking blowfish v0.9.1
Checking cbc v0.1.2
Compiling serde_derive_internals v0.29.1
Checking data-encoding-macro v0.1.14
Checking ssh-cipher v0.2.0
Checking bcrypt-pbkdf v0.10.0
Checking noise-framework v0.4.0
Checking socks5-client v0.4.1
Compiling schemars_derive v1.0.4
Checking base-x v0.2.11
Checking signature v2.2.0
Checking ssh-key v0.6.6
Checking multibase v0.9.1
Checking crossbeam-channel v0.5.15
Checking cyphernet v0.5.2
Checking radicle-ssh v0.10.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-ssh)
Checking schemars v1.0.4
Checking jiff v0.2.15
Checking lazy_static v1.5.0
Checking nonempty v0.9.0
Checking siphasher v1.0.1
Checking radicle-git-metadata v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-git-metadata)
Checking radicle-dag v0.10.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-dag)
Checking winnow v0.7.13
Checking hashbrown v0.15.5
Checking anstyle-query v1.0.2
Checking gix-hashtable v0.9.0
Checking radicle-git-ref-format v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-git-ref-format)
Checking base64 v0.21.7
Checking gix-date v0.10.5
Checking gix-actor v0.35.4
Checking iana-time-zone v0.1.60
Checking utf8parse v0.2.1
Checking chrono v0.4.38
Checking anstyle-parse v0.2.3
Checking gix-object v0.50.2
Checking colored v2.1.0
Checking serde-untagged v0.1.7
Checking bytesize v2.0.1
Checking localtime v1.3.1
Checking memmap2 v0.9.8
Checking anstyle v1.0.11
Checking tree-sitter-language v0.1.2
Checking fast-glob v0.3.3
Checking colorchoice v1.0.0
Checking dunce v1.0.5
Checking anstream v0.6.13
Checking gix-chunk v0.4.11
Checking gix-commitgraph v0.29.0
Checking gix-fs v0.16.1
Checking gix-tempfile v18.0.0
Checking gix-revwalk v0.21.0
Checking mio v1.0.4
Checking gix-quote v0.6.0
Checking sem_safe v0.2.0
Checking errno v0.3.13
Checking shell-words v1.1.0
Checking either v1.11.0
Checking gix-command v0.6.2
Checking signals_receipts v0.2.0
Compiling signal-hook v0.3.18
Compiling object v0.36.7
Checking gix-lock v18.0.0
Checking gix-url v0.32.0
Checking gix-config-value v0.15.1
Checking gix-sec v0.12.0
Checking signal-hook-registry v1.4.5
Checking gimli v0.31.1
Compiling rustix v0.38.34
Checking adler2 v2.0.0
Checking miniz_oxide v0.8.8
Checking gix-prompt v0.11.1
Checking addr2line v0.24.2
Checking radicle-signals v0.11.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-signals)
Checking gix-traverse v0.47.0
Checking gix-revision v0.35.0
Checking gix-diff v0.53.0
Checking mio v0.8.11
Checking gix-packetline v0.19.1
Compiling tree-sitter v0.24.4
Compiling unicode-segmentation v1.11.0
Compiling linux-raw-sys v0.4.13
Checking rustc-demangle v0.1.26
Compiling anyhow v1.0.82
Checking backtrace v0.3.75
Compiling convert_case v0.7.1
Checking signal-hook-mio v0.2.4
Checking gix-transport v0.48.0
Checking gix-pack v0.60.0
Checking gix-refspec v0.31.0
Checking sqlite3-sys v0.15.2
Checking sqlite v0.32.0
Checking gix-credentials v0.30.0
Checking radicle-crypto v0.14.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-crypto)
Checking gix-ref v0.53.1
Checking gix-shallow v0.5.0
Checking gix-negotiate v0.21.0
Compiling maybe-async v0.2.10
Checking regex v1.11.1
Compiling proc-macro-error-attr2 v2.0.0
Checking arc-swap v1.7.1
Compiling portable-atomic v1.11.0
Checking gix-protocol v0.51.0
Compiling proc-macro-error2 v2.0.1
Checking gix-odb v0.70.0
Compiling xattr v1.3.1
Compiling derive_more-impl v2.0.1
Compiling filetime v0.2.23
Checking uuid v1.16.0
Checking lexopt v0.3.0
Compiling litrs v0.4.1
Checking unicode-width v0.2.1
Checking bitflags v1.3.2
Checking bytes v1.10.1
Checking crossterm v0.25.0
Compiling document-features v0.2.11
Checking console v0.16.0
Checking derive_more v2.0.1
Compiling tar v0.4.40
Compiling git-ref-format-macro v0.5.0
Checking newline-converter v0.3.0
Checking snapbox-macros v0.3.8
Checking salsa20 v0.10.2
Checking fxhash v0.2.1
Checking similar v2.5.0
Checking unicode-width v0.1.11
Checking siphasher v0.3.11
Checking unit-prefix v0.5.1
Checking normalize-line-endings v0.3.0
Checking streaming-iterator v0.1.9
Checking indicatif v0.18.0
Checking snapbox v0.4.17
Checking bloomy v1.2.0
Checking inquire v0.7.5
Checking scrypt v0.11.0
Compiling radicle-surf v0.25.0
Checking git-ref-format v0.5.0
Checking crossterm v0.29.0
Checking unicode-display-width v0.3.0
Checking systemd-journal-logger v2.2.2
Checking serde_spanned v1.0.0
Checking toml_datetime v0.7.0
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-rust v0.23.2
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-python v0.23.4
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-toml-ng v0.6.0
Compiling heck v0.5.0
Checking pin-project-lite v0.2.16
Checking clap_lex v0.7.5
Checking radicle-std-ext v0.1.1
Checking toml_writer v1.0.2
Checking strsim v0.11.1
Checking tokio v1.47.1
Checking toml v0.9.5
Checking clap_builder v4.5.44
Compiling clap_derive v4.5.41
Checking os_info v3.12.0
Checking diff v0.1.13
Compiling radicle-node v0.16.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-node)
Checking yansi v0.5.1
Compiling radicle-cli v0.17.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-cli)
Checking pretty_assertions v1.4.0
Checking human-panic v2.0.3
Checking structured-logger v1.0.4
Checking clap v4.5.44
Checking radicle-systemd v0.11.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-systemd)
Checking tree-sitter-highlight v0.24.4
Checking itertools v0.14.0
Checking num-integer v0.1.46
Compiling qcheck-macros v1.0.0
Checking socket2 v0.5.7
Compiling escargot v0.5.10
Checking timeago v0.4.2
Checking num-bigint v0.4.6
Compiling ahash v0.8.11
Checking num-iter v0.1.45
Checking num-complex v0.4.6
Checking env_filter v0.1.3
Checking bit-vec v0.8.0
Checking borrow-or-share v0.2.2
Checking zerocopy v0.7.35
Checking fluent-uri v0.3.2
Checking num-rational v0.4.2
Checking bit-set v0.8.0
Checking env_logger v0.11.8
Checking phf_shared v0.11.3
Checking num v0.4.3
Compiling test-log-macros v0.2.18
Checking outref v0.5.2
Checking vsimd v0.8.0
Compiling paste v1.0.15
Compiling radicle-remote-helper v0.14.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-remote-helper)
Checking test-log v0.2.18
Checking uuid-simd v0.8.0
Checking phf v0.11.3
Checking fraction v0.15.3
Checking referencing v0.30.0
Checking fancy-regex v0.14.0
Checking email_address v0.2.9
Checking bytecount v0.6.8
Checking num-cmp v0.1.0
Checking base64 v0.22.1
Checking emojis v0.6.4
Checking jsonschema v0.30.0
Checking git2 v0.19.0
Checking radicle-oid v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-oid)
Checking radicle-git-ext v0.10.0
Checking radicle-term v0.16.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-term)
Checking radicle-cob v0.17.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-cob)
Checking radicle v0.20.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle)
Checking radicle-fetch v0.16.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-fetch)
Checking radicle-cli-test v0.13.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-cli-test)
Checking radicle-schemars v0.6.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-schemars)
Checking radicle-protocol v0.4.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-protocol)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 42.89s
+ cargo build --all-targets --workspace
Compiling libc v0.2.174
Compiling cfg-if v1.0.0
Compiling shlex v1.3.0
Compiling memchr v2.7.2
Compiling typenum v1.17.0
Compiling serde v1.0.219
Compiling generic-array v0.14.7
Compiling jobserver v0.1.31
Compiling getrandom v0.2.15
Compiling cc v1.2.2
Compiling rand_core v0.6.4
Compiling aho-corasick v1.1.3
Compiling crypto-common v0.1.6
Compiling regex-syntax v0.8.5
Compiling smallvec v1.15.1
Compiling subtle v2.5.0
Compiling stable_deref_trait v1.2.0
Compiling once_cell v1.21.3
Compiling cpufeatures v0.2.12
Compiling fastrand v2.3.0
Compiling scopeguard v1.2.0
Compiling lock_api v0.4.14
Compiling regex-automata v0.4.9
Compiling parking_lot_core v0.9.12
Compiling block-buffer v0.10.4
Compiling digest v0.10.7
Compiling parking_lot v0.12.5
Compiling thiserror v2.0.12
Compiling bitflags v2.9.1
Compiling byteorder v1.5.0
Compiling tinyvec_macros v0.1.1
Compiling tinyvec v1.6.0
Compiling crc32fast v1.5.0
Compiling gix-trace v0.1.13
Compiling typeid v1.0.3
Compiling home v0.5.9
Compiling erased-serde v0.4.6
Compiling serde_fmt v1.0.3
Compiling zlib-rs v0.5.2
Compiling unicode-normalization v0.1.23
Compiling value-bag-serde1 v1.11.1
Compiling same-file v1.0.6
Compiling walkdir v2.5.0
Compiling gix-utils v0.3.0
Compiling zerofrom v0.1.6
Compiling value-bag v1.11.1
Compiling prodash v30.0.1
Compiling bstr v1.12.0
Compiling log v0.4.27
Compiling gix-validate v0.10.0
Compiling yoke v0.7.5
Compiling gix-path v0.10.20
Compiling zerovec v0.10.4
Compiling itoa v1.0.11
Compiling hash32 v0.3.1
Compiling zeroize v1.7.0
Compiling tinystr v0.7.6
Compiling heapless v0.8.0
Compiling litemap v0.7.5
Compiling writeable v0.5.5
Compiling faster-hex v0.10.0
Compiling icu_locid v1.5.0
Compiling icu_locid_transform_data v1.5.1
Compiling libz-rs-sys v0.5.2
Compiling flate2 v1.1.1
Compiling gix-features v0.43.1
Compiling icu_provider v1.5.0
Compiling sha1 v0.10.6
Compiling block-padding v0.3.3
Compiling linux-raw-sys v0.9.4
Compiling inout v0.1.3
Compiling sha1-checked v0.10.0
Compiling icu_locid_transform v1.5.0
Compiling thiserror v1.0.69
Compiling icu_properties_data v1.5.1
Compiling icu_collections v1.5.0
Compiling gix-hash v0.19.0
Compiling rustix v1.0.7
Compiling icu_properties v1.5.1
Compiling icu_normalizer_data v1.5.1
Compiling cipher v0.4.4
Compiling write16 v1.0.0
Compiling utf8_iter v1.0.4
Compiling utf16_iter v1.0.5
Compiling getrandom v0.3.3
Compiling percent-encoding v2.3.1
Compiling sha2 v0.10.8
Compiling form_urlencoded v1.2.1
Compiling libz-sys v1.1.16
Compiling universal-hash v0.5.1
Compiling opaque-debug v0.3.1
Compiling libgit2-sys v0.17.0+1.8.1
Compiling equivalent v1.0.1
Compiling signature v1.6.4
Compiling hashbrown v0.14.3
Compiling icu_normalizer v1.5.0
Compiling tempfile v3.23.0
Compiling idna_adapter v1.2.0
Compiling idna v1.0.3
Compiling indexmap v2.2.6
Compiling url v2.5.4
Compiling ed25519 v1.5.3
Compiling aead v0.5.2
Compiling ct-codecs v1.1.1
Compiling amplify_num v0.5.2
Compiling ascii v1.1.0
Compiling ryu v1.0.17
Compiling serde_json v1.0.140
Compiling ec25519 v0.1.0
Compiling num-traits v0.2.19
Compiling amplify v4.6.0
Compiling poly1305 v0.8.0
Compiling chacha20 v0.9.1
Compiling git-ref-format-core v0.5.0
Compiling ref-cast v1.0.24
Compiling cyphergraphy v0.3.0
Compiling polyval v0.6.2
Compiling sqlite3-src v0.5.1
Compiling hmac v0.12.1
Compiling base64ct v1.6.0
Compiling dyn-clone v1.0.17
Compiling keccak v0.1.5
Compiling sha3 v0.10.8
Compiling pem-rfc7468 v0.7.0
Compiling pbkdf2 v0.12.2
Compiling ghash v0.5.1
Compiling aes v0.8.4
Compiling ctr v0.9.2
Compiling rand v0.8.5
Compiling base32 v0.4.0
Compiling qcheck v1.0.0
Compiling cypheraddr v0.4.0
Compiling aes-gcm v0.10.3
Compiling ssh-encoding v0.2.0
Compiling chacha20poly1305 v0.10.1
Compiling blowfish v0.9.1
Compiling cbc v0.1.2
Compiling data-encoding v2.5.0
Compiling ssh-cipher v0.2.0
Compiling data-encoding-macro v0.1.14
Compiling bcrypt-pbkdf v0.10.0
Compiling noise-framework v0.4.0
Compiling socks5-client v0.4.1
Compiling crossbeam-utils v0.8.19
Compiling signature v2.2.0
Compiling base-x v0.2.11
Compiling multibase v0.9.1
Compiling crossbeam-channel v0.5.15
Compiling ssh-key v0.6.6
Compiling cyphernet v0.5.2
Compiling schemars v1.0.4
Compiling radicle-ssh v0.10.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-ssh)
Compiling lazy_static v1.5.0
Compiling jiff v0.2.15
Compiling nonempty v0.9.0
Compiling siphasher v1.0.1
Compiling radicle-git-metadata v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-git-metadata)
Compiling radicle-dag v0.10.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-dag)
Compiling winnow v0.7.13
Compiling hashbrown v0.15.5
Compiling anstyle-query v1.0.2
Compiling gix-hashtable v0.9.0
Compiling radicle-git-ref-format v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-git-ref-format)
Compiling gix-date v0.10.5
Compiling gix-actor v0.35.4
Compiling base64 v0.21.7
Compiling utf8parse v0.2.1
Compiling iana-time-zone v0.1.60
Compiling chrono v0.4.38
Compiling anstyle-parse v0.2.3
Compiling gix-object v0.50.2
Compiling colored v2.1.0
Compiling serde-untagged v0.1.7
Compiling bytesize v2.0.1
Compiling localtime v1.3.1
Compiling memmap2 v0.9.8
Compiling fast-glob v0.3.3
Compiling tree-sitter-language v0.1.2
Compiling colorchoice v1.0.0
Compiling dunce v1.0.5
Compiling anstyle v1.0.11
Compiling anstream v0.6.13
Compiling gix-chunk v0.4.11
Compiling gix-commitgraph v0.29.0
Compiling adler2 v2.0.0
Compiling gix-revwalk v0.21.0
Compiling gix-fs v0.16.1
Compiling mio v1.0.4
Compiling gix-tempfile v18.0.0
Compiling gix-quote v0.6.0
Compiling sem_safe v0.2.0
Compiling errno v0.3.13
Compiling shell-words v1.1.0
Compiling either v1.11.0
Compiling unicode-segmentation v1.11.0
Compiling gix-command v0.6.2
Compiling signals_receipts v0.2.0
Compiling sqlite3-sys v0.15.2
Compiling gix-lock v18.0.0
Compiling sqlite v0.32.0
Compiling gix-url v0.32.0
Compiling radicle-crypto v0.14.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-crypto)
Compiling gix-config-value v0.15.1
Compiling gix-sec v0.12.0
Compiling signal-hook-registry v1.4.5
Compiling gimli v0.31.1
Compiling signal-hook v0.3.18
Compiling gix-prompt v0.11.1
Compiling radicle-signals v0.11.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-signals)
Compiling object v0.36.7
Compiling addr2line v0.24.2
Compiling gix-revision v0.35.0
Compiling gix-traverse v0.47.0
Compiling miniz_oxide v0.8.8
Compiling gix-diff v0.53.0
Compiling gix-packetline v0.19.1
Compiling mio v0.8.11
Compiling tree-sitter v0.24.4
Compiling rustc-demangle v0.1.26
Compiling rustix v0.38.34
Compiling backtrace v0.3.75
Compiling signal-hook-mio v0.2.4
Compiling gix-transport v0.48.0
Compiling gix-pack v0.60.0
Compiling gix-refspec v0.31.0
Compiling gix-credentials v0.30.0
Compiling gix-shallow v0.5.0
Compiling gix-ref v0.53.1
Compiling convert_case v0.7.1
Compiling gix-negotiate v0.21.0
Compiling regex v1.11.1
Compiling arc-swap v1.7.1
Compiling gix-protocol v0.51.0
Compiling gix-odb v0.70.0
Compiling derive_more-impl v2.0.1
Compiling xattr v1.3.1
Compiling uuid v1.16.0
Compiling filetime v0.2.23
Compiling bytes v1.10.1
Compiling unicode-width v0.2.1
Compiling bitflags v1.3.2
Compiling lexopt v0.3.0
Compiling crossterm v0.25.0
Compiling console v0.16.0
Compiling tar v0.4.40
Compiling git-ref-format-macro v0.5.0
Compiling derive_more v2.0.1
Compiling portable-atomic v1.11.0
Compiling anyhow v1.0.82
Compiling newline-converter v0.3.0
Compiling snapbox-macros v0.3.8
Compiling salsa20 v0.10.2
Compiling fxhash v0.2.1
Compiling unicode-width v0.1.11
Compiling siphasher v0.3.11
Compiling unit-prefix v0.5.1
Compiling normalize-line-endings v0.3.0
Compiling similar v2.5.0
Compiling streaming-iterator v0.1.9
Compiling bloomy v1.2.0
Compiling indicatif v0.18.0
Compiling snapbox v0.4.17
Compiling inquire v0.7.5
Compiling radicle-surf v0.25.0
Compiling scrypt v0.11.0
Compiling crossterm v0.29.0
Compiling git-ref-format v0.5.0
Compiling unicode-display-width v0.3.0
Compiling systemd-journal-logger v2.2.2
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-rust v0.23.2
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-python v0.23.4
Compiling serde_spanned v1.0.0
Compiling toml_datetime v0.7.0
Compiling radicle-std-ext v0.1.1
Compiling pin-project-lite v0.2.16
Compiling strsim v0.11.1
Compiling toml_writer v1.0.2
Compiling clap_lex v0.7.5
Compiling toml v0.9.5
Compiling clap_builder v4.5.44
Compiling tokio v1.47.1
Compiling os_info v3.12.0
Compiling diff v0.1.13
Compiling yansi v0.5.1
Compiling radicle-node v0.16.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-node)
Compiling radicle-cli v0.17.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-cli)
Compiling pretty_assertions v1.4.0
Compiling human-panic v2.0.3
Compiling structured-logger v1.0.4
Compiling clap v4.5.44
Compiling radicle-systemd v0.11.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-systemd)
Compiling tree-sitter-highlight v0.24.4
Compiling itertools v0.14.0
Compiling num-integer v0.1.46
Compiling socket2 v0.5.7
Compiling timeago v0.4.2
Compiling escargot v0.5.10
Compiling num-bigint v0.4.6
Compiling num-iter v0.1.45
Compiling num-complex v0.4.6
Compiling env_filter v0.1.3
Compiling num-rational v0.4.2
Compiling bit-vec v0.8.0
Compiling zerocopy v0.7.35
Compiling borrow-or-share v0.2.2
Compiling fluent-uri v0.3.2
Compiling ahash v0.8.11
Compiling bit-set v0.8.0
Compiling num v0.4.3
Compiling env_logger v0.11.8
Compiling phf_shared v0.11.3
Compiling radicle-remote-helper v0.14.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-remote-helper)
Compiling outref v0.5.2
Compiling vsimd v0.8.0
Compiling test-log v0.2.18
Compiling phf v0.11.3
Compiling fraction v0.15.3
Compiling uuid-simd v0.8.0
Compiling referencing v0.30.0
Compiling fancy-regex v0.14.0
Compiling email_address v0.2.9
Compiling bytecount v0.6.8
Compiling num-cmp v0.1.0
Compiling base64 v0.22.1
Compiling emojis v0.6.4
Compiling jsonschema v0.30.0
Compiling git2 v0.19.0
Compiling radicle-oid v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-oid)
Compiling radicle-git-ext v0.10.0
Compiling radicle-term v0.16.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-term)
Compiling radicle-cob v0.17.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-cob)
Compiling radicle v0.20.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle)
Compiling radicle-fetch v0.16.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-fetch)
Compiling radicle-protocol v0.4.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-protocol)
Compiling radicle-cli-test v0.13.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-cli-test)
Compiling radicle-schemars v0.6.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-schemars)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 58.82s
+ cargo doc --workspace --no-deps
Checking regex-automata v0.4.9
Compiling syn v1.0.109
Checking idna v1.0.3
Checking radicle-ssh v0.10.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-ssh)
Compiling num-traits v0.2.19
Checking url v2.5.4
Checking git2 v0.19.0
Checking radicle-git-metadata v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-git-metadata)
Checking radicle-dag v0.10.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-dag)
Compiling amplify_syn v2.0.1
Checking bstr v1.12.0
Compiling data-encoding-macro-internal v0.1.12
Checking gix-validate v0.10.0
Checking git-ref-format-core v0.5.0
Compiling amplify_derive v4.0.0
Checking gix-path v0.10.20
Checking data-encoding-macro v0.1.14
Checking gix-features v0.43.1
Checking gix-date v0.10.5
Checking multibase v0.9.1
Checking gix-hash v0.19.0
Checking gix-actor v0.35.4
Checking chrono v0.4.38
Checking gix-hashtable v0.9.0
Checking radicle-oid v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-oid)
Checking gix-object v0.50.2
Checking gix-commitgraph v0.29.0
Checking radicle-git-ref-format v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-git-ref-format)
Checking gix-fs v0.16.1
Checking gix-quote v0.6.0
Checking gix-command v0.6.2
Checking gix-tempfile v18.0.0
Checking gix-revwalk v0.21.0
Checking gix-lock v18.0.0
Checking gix-url v0.32.0
Checking gix-config-value v0.15.1
Checking gix-traverse v0.47.0
Checking gix-revision v0.35.0
Checking gix-prompt v0.11.1
Checking radicle-signals v0.11.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-signals)
Checking gix-diff v0.53.0
Checking gix-packetline v0.19.1
Checking regex v1.11.1
Checking amplify v4.6.0
Checking gix-pack v0.60.0
Checking gix-transport v0.48.0
Checking tree-sitter v0.24.4
Checking gix-refspec v0.31.0
Checking cyphergraphy v0.3.0
Checking cypheraddr v0.4.0
Checking noise-framework v0.4.0
Checking git-ref-format v0.5.0
Checking gix-credentials v0.30.0
Checking gix-negotiate v0.21.0
Checking socks5-client v0.4.1
Checking gix-ref v0.53.1
Checking gix-shallow v0.5.0
Checking cyphernet v0.5.2
Checking radicle-crypto v0.14.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-crypto)
Checking radicle-git-ext v0.10.0
Checking gix-odb v0.70.0
Checking uuid v1.16.0
Checking radicle-cob v0.17.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-cob)
Checking gix-protocol v0.51.0
Compiling radicle-cli v0.17.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-cli)
Checking radicle-surf v0.25.0
Checking human-panic v2.0.3
Checking tree-sitter-toml-ng v0.6.0
Checking radicle-term v0.16.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-term)
Checking radicle v0.20.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle)
Checking tree-sitter-highlight v0.24.4
Compiling radicle-node v0.16.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-node)
Checking radicle-systemd v0.11.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-systemd)
Documenting radicle-systemd v0.11.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-systemd)
Documenting radicle v0.20.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle)
Documenting radicle-cob v0.17.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-cob)
Documenting radicle-term v0.16.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-term)
Documenting radicle-crypto v0.14.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-crypto)
Documenting radicle-signals v0.11.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-signals)
Documenting radicle-oid v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-oid)
Documenting radicle-git-ref-format v0.1.0 (/cebf607e-fc00-4ba7-8257-042e5bfd9cf6/w/crates/radicle-git-ref-format)
error: unresolved link to `::qcheck::Arbitrary`
--> crates/radicle-oid/src/lib.rs:55:28
|
55 | //! [`qcheck::Arbitrary`]: ::qcheck::Arbitrary
| ^^^^^^^^^^^^^^^^^^^ no item named `` in scope
|
= note: `-D rustdoc::broken-intra-doc-links` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(rustdoc::broken_intra_doc_links)]`
error: unresolved link to `::radicle_git_ref_format::Component`
--> crates/radicle-oid/src/lib.rs:61:44
|
61 | //! [`radicle_git_ref_format::Component`]: ::radicle_git_ref_format::Component
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no item named `` in scope
error: unresolved link to `::radicle_git_ref_format::RefString`
--> crates/radicle-oid/src/lib.rs:62:44
|
62 | //! [`radicle_git_ref_format::RefString`]: ::radicle_git_ref_format::RefString
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no item named `` in scope
error: could not document `radicle-oid`
warning: build failed, waiting for other jobs to finish...
Exit code: 101
{
"response": "finished",
"result": "failure"
}