rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood34939253f77c85bcb055a0d9deba6bd08e7f1b39
{
"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:z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz",
"alias": "erikli"
},
"before": "34939253f77c85bcb055a0d9deba6bd08e7f1b39",
"after": "34939253f77c85bcb055a0d9deba6bd08e7f1b39",
"branch": "master",
"commits": [
"34939253f77c85bcb055a0d9deba6bd08e7f1b39",
"c30298fb8a9617a38013a91ce4ba433392b90f16",
"e965d9a2c98e3f93d1a277da2f10c51066094d8b",
"db3b3b05484029bd747abad04911c405551be1dc",
"5a840983a8ba27f4fafbfeb82d15a10b1b9c7842"
]
}
{
"response": "triggered",
"run_id": {
"id": "ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75"
},
"info_url": "https://cci.rad.levitte.org//ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75.html"
}
Started at: 2025-07-14 11:31:20.786226+02:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFq…bS9wzpT
✓ Remote cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW added
✓ Remote-tracking branch cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW/master created for z6MktaN…hzPZRZW
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6Mkire…SQZ3voM
✓ Remote erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz added
✓ Remote-tracking branch erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz/master created for z6MkgFq…FGAnBGz
✓ Remote lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz added
✓ Remote-tracking branch lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz/master created for z6MkkPv…WX5sTEz
✓ Repository successfully cloned under /opt/radcis/ci.rad.levitte.org/cci/state/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 112 issues · 13 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 34939253f77c85bcb055a0d9deba6bd08e7f1b39
HEAD is now at 34939253 radicle: improve reviews
Exit code: 0
$ git show 34939253f77c85bcb055a0d9deba6bd08e7f1b39
commit 34939253f77c85bcb055a0d9deba6bd08e7f1b39
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Tue Jul 1 16:52:21 2025 +0200
radicle: improve reviews
The `Review::summary` was limited in behaviour, since it was only an
`Option<String>`.
The field is now changed to `NonEmpty<Edit>` so that it can enable an edit
history, as well as being able to supply embeds as part of the text.
`Reactions` are also introduced to `Review` and, necessarily, introducing an
`Action::ReviewReact`.
Note that some machinery was added under `actions` and `encoding` to enable
backwards-compatibility.
For `actions`, a new `ReviewEdit` is introduced to keep
track of the different versions of editing actions – supporting the old actions
while also introducing the new variant.
For `encoding`, the machinery exploits the fact that an `Option<String>` can be
converted into a `NonEmpty<Edit>` given that an `ActorId` and `Timestamp` are
available, and that `None` can be converted into an empty string. The struct
`patch::Review` now deserializes via this `encoding::review::Review` type and,
importantly, preserves backwards-compatibility.
diff --git a/Cargo.lock b/Cargo.lock
index 119495a2..c640af10 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -802,6 +802,16 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+[[package]]
+name = "erased-serde"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7"
+dependencies = [
+ "serde",
+ "typeid",
+]
+
[[package]]
name = "errno"
version = "0.3.13"
@@ -2471,6 +2481,7 @@ dependencies = [
"radicle-ssh",
"schemars",
"serde",
+ "serde-untagged",
"serde_json",
"siphasher 1.0.1",
"sqlite",
@@ -3012,6 +3023,17 @@ dependencies = [
"serde_derive",
]
+[[package]]
+name = "serde-untagged"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e"
+dependencies = [
+ "erased-serde",
+ "serde",
+ "typeid",
+]
+
[[package]]
name = "serde_derive"
version = "1.0.219"
@@ -3603,6 +3625,12 @@ dependencies = [
"tree-sitter-language",
]
+[[package]]
+name = "typeid"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
+
[[package]]
name = "typenum"
version = "1.17.0"
diff --git a/crates/radicle/Cargo.toml b/crates/radicle/Cargo.toml
index 38562b02..acb4ba82 100644
--- a/crates/radicle/Cargo.toml
+++ b/crates/radicle/Cargo.toml
@@ -37,6 +37,7 @@ radicle-ssh = { workspace = true }
schemars = { workspace = true, optional = true }
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true, features = ["preserve_order"] }
+serde-untagged = "0.1.7"
siphasher = "1.0.0"
sqlite = { workspace = true, features = ["bundled"] }
tempfile = { workspace = true }
diff --git a/crates/radicle/src/cob/patch.rs b/crates/radicle/src/cob/patch.rs
index fc224a0c..8bfbe27a 100644
--- a/crates/radicle/src/cob/patch.rs
+++ b/crates/radicle/src/cob/patch.rs
@@ -1,5 +1,10 @@
pub mod cache;
+mod actions;
+pub use actions::ReviewEdit;
+
+mod encoding;
+
use std::collections::btree_map;
use std::collections::{BTreeMap, BTreeSet, HashMap};
use std::fmt;
@@ -187,16 +192,6 @@ pub enum Action {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
labels: Vec<Label>,
},
- #[serde(rename = "review.edit")]
- ReviewEdit {
- review: ReviewId,
- #[serde(default, skip_serializing_if = "Option::is_none")]
- summary: Option<String>,
- #[serde(default, skip_serializing_if = "Option::is_none")]
- verdict: Option<Verdict>,
- #[serde(default, skip_serializing_if = "Vec::is_empty")]
- labels: Vec<Label>,
- },
#[serde(rename = "review.redact")]
ReviewRedact { review: ReviewId },
#[serde(rename = "review.comment")]
@@ -234,6 +229,13 @@ pub enum Action {
ReviewCommentResolve { review: ReviewId, comment: EntryId },
#[serde(rename = "review.comment.unresolve")]
ReviewCommentUnresolve { review: ReviewId, comment: EntryId },
+ /// React to the review.
+ #[serde(rename = "review.react")]
+ ReviewReact {
+ review: ReviewId,
+ reaction: Reaction,
+ active: bool,
+ },
//
// Revision actions
@@ -307,6 +309,12 @@ pub enum Action {
reaction: Reaction,
active: bool,
},
+ /// Edit a review's summary, verdict, labels, and embeds.
+ // Note that the tags live on `actions::ReviewEdit`, and according to the
+ // serde.rs docs, it must come after the other variants due to the
+ // `untagged` declaration.
+ #[serde(untagged)]
+ ReviewEdit(actions::ReviewEdit),
}
impl CobAction for Action {
@@ -674,7 +682,7 @@ impl Patch {
},
// Anyone can submit a review.
Action::Review { .. } => Authorization::Allow,
- Action::ReviewRedact { review, .. } | Action::ReviewEdit { review, .. } => {
+ Action::ReviewRedact { review, .. } => {
if let Some((_, review)) = lookup::review(self, review)? {
Authorization::from(actor == review.author.public_key())
} else {
@@ -682,6 +690,14 @@ impl Patch {
Authorization::Unknown
}
}
+ Action::ReviewEdit(edit) => {
+ if let Some((_, review)) = lookup::review(self, edit.review_id())? {
+ Authorization::from(actor == review.author.public_key())
+ } else {
+ // Redacted.
+ Authorization::Unknown
+ }
+ }
// Anyone can comment on a review.
Action::ReviewComment { .. } => Authorization::Allow,
// The comment author can edit and redact their own comment.
@@ -714,6 +730,7 @@ impl Patch {
// Redacted.
Authorization::Unknown
}
+ Action::ReviewReact { .. } => Authorization::Allow,
// Anyone can propose revisions.
Action::Revision { .. } => Authorization::Allow,
// Only the revision author can edit or redact their revision.
@@ -896,7 +913,7 @@ impl Patch {
}
Action::Review {
revision,
- ref summary,
+ summary,
verdict,
labels,
} => {
@@ -914,8 +931,9 @@ impl Patch {
id,
Author::new(author),
verdict,
- summary.to_owned(),
+ summary.unwrap_or_default(),
labels,
+ vec![],
timestamp,
));
// Update reviews index.
@@ -928,22 +946,7 @@ impl Patch {
}
}
}
- Action::ReviewEdit {
- review,
- summary,
- verdict,
- labels,
- } => {
- if summary.is_none() && verdict.is_none() {
- return Err(Error::EmptyReview);
- }
- let Some(review) = lookup::review_mut(self, &review)? else {
- return Ok(());
- };
- review.verdict = verdict;
- review.summary = summary;
- review.labels = labels;
- }
+ Action::ReviewEdit(edit) => edit.run(author, timestamp, self)?,
Action::ReviewCommentReact {
review,
comment,
@@ -1042,6 +1045,19 @@ impl Patch {
// Set the review locator in the review index to redacted.
*locator = None;
}
+ Action::ReviewReact {
+ review,
+ reaction,
+ active,
+ } => {
+ if let Some(review) = lookup::review_mut(self, &review)? {
+ if active {
+ review.reactions.insert((author, reaction));
+ } else {
+ review.reactions.remove(&(author, reaction));
+ }
+ }
+ }
Action::Merge { revision, commit } => {
// If the revision was redacted before the merge, ignore the merge.
if lookup::revision_mut(self, &revision)?.is_none() {
@@ -1613,6 +1629,7 @@ impl fmt::Display for Verdict {
/// A patch review on a revision.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
+#[serde(from = "encoding::review::Review")]
pub struct Review {
/// Review identifier.
pub(super) id: ReviewId,
@@ -1624,13 +1641,19 @@ pub struct Review {
pub(super) verdict: Option<Verdict>,
/// Review summary.
///
- /// Can be edited or set to `None`.
- pub(super) summary: Option<String>,
+ /// Can be empty, given there is a [`Verdict`].
+ ///
+ /// If not empty, then the last [`Edit`] in the `Vec` will be the latest
+ /// edit of the summary.
+ pub(super) summary: NonEmpty<Edit>,
/// Review comments.
pub(super) comments: Thread<Comment<CodeLocation>>,
/// Labels qualifying the review. For example if this review only looks at the
/// concept or intention of the patch, it could have a "concept" label.
pub(super) labels: Vec<Label>,
+ #[serde(skip_serializing_if = "BTreeSet::is_empty")]
+ /// Reactions to the review.
+ pub(super) reactions: Reactions,
/// Review timestamp.
pub(super) timestamp: Timestamp,
}
@@ -1640,16 +1663,19 @@ impl Review {
id: ReviewId,
author: Author,
verdict: Option<Verdict>,
- summary: Option<String>,
+ summary: String,
labels: Vec<Label>,
+ embeds: Vec<Embed<Uri>>,
timestamp: Timestamp,
) -> Self {
+ let summary = NonEmpty::new(Edit::new(*author.public_key(), summary, timestamp, embeds));
Self {
id,
author,
verdict,
summary,
comments: Thread::default(),
+ reactions: BTreeSet::new(),
labels,
timestamp,
}
@@ -1681,8 +1707,23 @@ impl Review {
}
/// Review general comment.
- pub fn summary(&self) -> Option<&str> {
- self.summary.as_deref()
+ pub fn summary(&self) -> &str {
+ self.summary.last().body.as_str()
+ }
+
+ /// Review embeds.
+ pub fn embeds(&self) -> &[Embed<Uri>] {
+ &self.summary.last().embeds
+ }
+
+ /// Review reactions.
+ pub fn reactions(&self) -> &Reactions {
+ &self.reactions
+ }
+
+ /// Get the review summary edits.
+ pub fn edits(&self) -> impl Iterator<Item = &Edit> {
+ self.summary.iter()
}
/// Review timestamp.
@@ -1911,15 +1952,17 @@ impl<R: ReadRepository> store::Transaction<Patch, R> {
&mut self,
review: ReviewId,
verdict: Option<Verdict>,
- summary: Option<String>,
+ summary: String,
labels: Vec<Label>,
+ embeds: impl IntoIterator<Item = Embed<Uri>>,
) -> Result<(), store::Error> {
- self.push(Action::ReviewEdit {
+ self.push(Action::ReviewEdit(actions::ReviewEdit::new(
review,
summary,
verdict,
labels,
- })
+ embeds.into_iter().collect(),
+ )))
}
/// Redact a patch review.
@@ -2272,15 +2315,16 @@ where
&mut self,
review: ReviewId,
verdict: Option<Verdict>,
- summary: Option<String>,
+ summary: String,
labels: Vec<Label>,
+ embeds: impl IntoIterator<Item = Embed<Uri>>,
signer: &Device<G>,
) -> Result<EntryId, Error>
where
G: crypto::signature::Signer<crypto::Signature>,
{
self.transaction("Edit review", signer, |tx| {
- tx.review_edit(review, verdict, summary, labels)
+ tx.review_edit(review, verdict, summary, labels, embeds)
})
}
@@ -3109,7 +3153,7 @@ mod test {
let review = revision.review_by(alice.signer.public_key()).unwrap();
assert_eq!(review.verdict(), Some(Verdict::Accept));
- assert_eq!(review.summary(), Some("LGTM"));
+ assert_eq!(review.summary(), "LGTM");
patch.redact_review(review_id, &alice.signer).unwrap();
patch.reload().unwrap();
@@ -3345,7 +3389,8 @@ mod test {
.review_edit(
review,
Some(Verdict::Reject),
- Some("Whoops!".to_owned()),
+ "Whoops!".to_owned(),
+ vec![],
vec![],
&alice.signer,
)
@@ -3354,7 +3399,7 @@ mod test {
let (_, revision) = patch.latest();
let review = revision.review_by(alice.signer.public_key()).unwrap();
assert_eq!(review.verdict(), Some(Verdict::Reject));
- assert_eq!(review.summary(), Some("Whoops!"));
+ assert_eq!(review.summary(), "Whoops!");
}
#[test]
@@ -3415,7 +3460,14 @@ mod test {
.unwrap();
let _review = patch
- .review_edit(review, Some(Verdict::Reject), None, vec![], &alice.signer)
+ .review_edit(
+ review,
+ Some(Verdict::Reject),
+ "".to_string(),
+ vec![],
+ vec![],
+ &alice.signer,
+ )
.unwrap();
patch
.review_comment(review, "Second comment!", None, None, [], &alice.signer)
@@ -3508,7 +3560,14 @@ mod test {
)
.unwrap();
patch
- .review_edit(review, Some(Verdict::Accept), None, vec![], &alice.signer)
+ .review_edit(
+ review,
+ Some(Verdict::Accept),
+ "".to_string(),
+ vec![],
+ vec![],
+ &alice.signer,
+ )
.unwrap();
let id = patch.id;
@@ -3517,7 +3576,7 @@ mod test {
let review = revision.review_by(alice.signer.public_key()).unwrap();
assert_eq!(review.verdict(), Some(Verdict::Accept));
- assert_eq!(review.summary(), None);
+ assert_eq!(review.summary(), "");
}
#[test]
diff --git a/crates/radicle/src/cob/patch/actions.rs b/crates/radicle/src/cob/patch/actions.rs
new file mode 100644
index 00000000..6924c5fc
--- /dev/null
+++ b/crates/radicle/src/cob/patch/actions.rs
@@ -0,0 +1,180 @@
+//! Keep track of the patch [`Action`] versions, to ensure compatibility where
+//! possible.
+//!
+//! [`Action`]: super::Action
+
+use serde::{Deserialize, Serialize};
+
+use crate::cob::{thread::Edit, ActorId, Embed, Label, Timestamp, Uri};
+
+use super::{lookup, Error, Patch, ReviewId, Verdict};
+
+/// A review edit that keeps track of the different versions of actions.
+///
+/// [`ReviewEdit::new`] will create the latest version of the action.
+///
+/// [`ReviewEdit::run`] will apply the action to the given [`Patch`].
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+#[serde(tag = "type", rename_all = "camelCase")]
+pub enum ReviewEdit {
+ /// The initial version of editing a review.
+ ///
+ /// This allowed editing the `summary`, `verdict`, and `labels` of a
+ /// [`Patch`], where the `summary` value was optional.
+ #[serde(rename = "review.edit")]
+ V1(ReviewEditV1),
+ /// The latest version of editing a review.
+ ///
+ /// This allows editing the `summary`, `verdict`, `labels` of [`Patch`], and
+ /// introduces `embeds` to the review [`summary`].
+ ///
+ /// The `summary` of a [`Review`] is now an edit-history.
+ #[serde(rename = "review.edit.v2")]
+ V2(ReviewEditV2),
+}
+
+impl ReviewEdit {
+ /// Create the latest version of [`ReviewEdit`].
+ pub fn new(
+ review: ReviewId,
+ summary: String,
+ verdict: Option<Verdict>,
+ labels: Vec<Label>,
+ embeds: Vec<Embed<Uri>>,
+ ) -> Self {
+ Self::V2(ReviewEditV2 {
+ review,
+ summary,
+ verdict,
+ labels,
+ embeds,
+ })
+ }
+
+ /// Get the [`ReviewId`] that this edit is applying to.
+ pub fn review_id(&self) -> &ReviewId {
+ match self {
+ ReviewEdit::V1(ReviewEditV1 { review, .. }) => review,
+ ReviewEdit::V2(ReviewEditV2 { review, .. }) => review,
+ }
+ }
+
+ /// Apply the action to the given [`Patch`].
+ pub fn run(
+ self,
+ author: ActorId,
+ timestamp: Timestamp,
+ patch: &mut Patch,
+ ) -> Result<(), Error> {
+ match self {
+ ReviewEdit::V1(ReviewEditV1 {
+ review,
+ summary,
+ verdict,
+ labels,
+ }) => {
+ if summary.is_none() && verdict.is_none() {
+ return Err(Error::EmptyReview);
+ }
+ let Some(review) = lookup::review_mut(patch, &review)? else {
+ return Ok(());
+ };
+
+ if let Some(body) = summary {
+ review
+ .summary
+ .push(Edit::new(author, body, timestamp, vec![]));
+ }
+ review.verdict = verdict;
+ review.labels = labels;
+ Ok(())
+ }
+ ReviewEdit::V2(ReviewEditV2 {
+ review,
+ summary,
+ verdict,
+ labels,
+ embeds,
+ }) => {
+ if summary.is_empty() && verdict.is_none() {
+ return Err(Error::EmptyReview);
+ }
+ let Some(review) = lookup::review_mut(patch, &review)? else {
+ return Ok(());
+ };
+
+ review
+ .summary
+ .push(Edit::new(author, summary, timestamp, embeds));
+ review.verdict = verdict;
+ review.labels = labels;
+ Ok(())
+ }
+ }
+ }
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ReviewEditV2 {
+ review: ReviewId,
+ #[serde(default, skip_serializing_if = "String::is_empty")]
+ summary: String,
+ #[serde(default, skip_serializing_if = "Option::is_none")]
+ verdict: Option<Verdict>,
+ #[serde(default, skip_serializing_if = "Vec::is_empty")]
+ labels: Vec<Label>,
+ #[serde(default, skip_serializing_if = "Vec::is_empty")]
+ embeds: Vec<Embed<Uri>>,
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ReviewEditV1 {
+ review: ReviewId,
+ #[serde(default, skip_serializing_if = "Option::is_none")]
+ summary: Option<String>,
+ #[serde(default, skip_serializing_if = "Option::is_none")]
+ verdict: Option<Verdict>,
+ #[serde(default, skip_serializing_if = "Vec::is_empty")]
+ labels: Vec<Label>,
+}
+
+#[allow(clippy::unwrap_used)]
+#[cfg(test)]
+mod test {
+ use serde_json::json;
+
+ use crate::patch;
+
+ use super::ReviewEdit;
+
+ #[test]
+ fn test_review_edit() {
+ let v1 = json!({
+ "type": "review.edit",
+ "review": "89d45fb371eb2622ba88188d474347cc526d80bb",
+ "summary": "lgtm",
+ "verdict": "accept",
+ "labels": [],
+ });
+ let v2 = json!({
+ "type": "review.edit.v2",
+ "review": "89d45fb371eb2622ba88188d474347cc526d80bb",
+ "summary": "lgtm",
+ "verdict": "accept",
+ "labels": [],
+ "embeds": [],
+ });
+ serde_json::from_value::<ReviewEdit>(v1.clone()).unwrap();
+ serde_json::from_value::<ReviewEdit>(v2.clone()).unwrap();
+ assert!(matches!(
+ serde_json::from_value::<patch::Action>(v1).unwrap(),
+ patch::Action::ReviewEdit { .. }
+ ));
+ assert!(matches!(
+ serde_json::from_value::<patch::Action>(v2).unwrap(),
+ patch::Action::ReviewEdit { .. }
+ ));
+ }
+}
diff --git a/crates/radicle/src/cob/patch/encoding.rs b/crates/radicle/src/cob/patch/encoding.rs
new file mode 100644
index 00000000..01897f31
--- /dev/null
+++ b/crates/radicle/src/cob/patch/encoding.rs
@@ -0,0 +1,6 @@
+//! Home for separating serialization and deserialization of [`Patch`] data from
+//! the final [`Patch`] state.
+//!
+//! [`Patch`]: super::Patch
+
+pub mod review;
diff --git a/crates/radicle/src/cob/patch/encoding/review.rs b/crates/radicle/src/cob/patch/encoding/review.rs
new file mode 100644
index 00000000..306b64a9
--- /dev/null
+++ b/crates/radicle/src/cob/patch/encoding/review.rs
@@ -0,0 +1,254 @@
+//! Representation of a [`patch::Review`] for deserializing.
+//!
+//! The [`Review`] type contains fields that are:
+//!
+//! - Shared within previous versions, e.g. V1 fields that are shared with V2
+//! - Introduced at a later version, but can use a [`Default`] instance
+//! - Can be migrated from one version to another
+//!
+//! [`patch::Review`]: crate::cob::patch::Review
+
+use nonempty::NonEmpty;
+use serde::Deserialize;
+use serde_untagged::UntaggedEnumVisitor;
+
+use crate::cob::patch;
+use crate::cob::patch::{
+ Author, CodeLocation, Comment, Edit, Label, Reactions, ReviewId, Thread, Timestamp, Verdict,
+};
+
+/// The encoding for a `patch::Review` that can be deserialized and migrated.
+///
+/// To maintain backwards-compatibility, [`Review`] must implement:
+/// ```rust, no_run
+/// From<Review> for patch::Review
+/// ```
+#[derive(Deserialize)]
+pub(in crate::cob::patch) struct Review {
+ // V1 fields
+ id: ReviewId,
+ author: Author,
+ verdict: Option<Verdict>,
+ comments: Thread<Comment<CodeLocation>>,
+ labels: Vec<Label>,
+ timestamp: Timestamp,
+
+ // V2 fields
+ #[serde(default)]
+ reactions: Reactions,
+
+ // V1 -> V2 conversion
+ #[serde(default)]
+ summary: Summary,
+}
+
+/// The [`Summary`] type represents the different versions of the `summary`
+/// field of a [`Review`].
+///
+/// The `V1` variant holds an `Option<String>`, which can be converted into an
+/// `Edit` given the `ActorId` and `Timestamp` – supplying an empty `Vec` of
+/// `Embed`s.
+///
+/// The `V2` variant holds the current type `NonEmpty<Edit>`.
+///
+/// Using [`Summary::into_edits`], we can get the latest representation of a
+/// [`patch::Review::summary`].
+///
+/// [`patch::Review::summary`]: crate::cob::patch::Review::summary
+#[derive(Debug, PartialEq, Eq)]
+pub(in crate::cob::patch) enum Summary {
+ V2(NonEmpty<Edit>),
+ V1(Option<String>),
+}
+
+impl<'de> Deserialize<'de> for Summary {
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where
+ D: serde::Deserializer<'de>,
+ {
+ UntaggedEnumVisitor::new()
+ .unit(|| Ok(Self::V1(None)))
+ .string(|body| Ok(Self::V1(Some(body.to_owned()))))
+ .seq(|edits| edits.deserialize().map(Self::V2))
+ .deserialize(deserializer)
+ }
+}
+
+impl Default for Summary {
+ fn default() -> Self {
+ Self::V1(None)
+ }
+}
+
+impl Summary {
+ fn into_edits(self, author: &Author, timestamp: &Timestamp) -> NonEmpty<Edit> {
+ match self {
+ Summary::V1(summary) => NonEmpty::new(Edit::new(
+ *author.public_key(),
+ summary.unwrap_or_default(),
+ *timestamp,
+ vec![],
+ )),
+ Summary::V2(edits) => edits,
+ }
+ }
+}
+
+impl From<Review> for patch::Review {
+ fn from(review: Review) -> Self {
+ let Review {
+ id,
+ author,
+ verdict,
+ comments,
+ labels,
+ timestamp,
+ reactions,
+ summary,
+ } = review;
+ let summary = summary.into_edits(&author, ×tamp);
+ Self {
+ id,
+ author,
+ verdict,
+ summary,
+ comments,
+ labels,
+ reactions,
+ timestamp,
+ }
+ }
+}
+
+#[allow(clippy::unwrap_used)]
+#[cfg(test)]
+mod test {
+ use nonempty::nonempty;
+ use serde_json::json;
+
+ use crate::{
+ cob::{thread::Edit, Timestamp},
+ patch,
+ };
+
+ use super::{Review, Summary};
+
+ #[test]
+ fn test_review_summary() {
+ let summary_null = json!(null);
+ let summary_string = json!("lgtm");
+ let summary_edits = json!([{
+ "author": "z6MkwPUeUS2fJMfc2HZN1RQTQcTTuhw4HhPySB8JeUg2mVvx",
+ "timestamp": 1710947885000_i64,
+ "body": "lgtm",
+ "embeds": [],
+ }]);
+ assert_eq!(
+ serde_json::from_value::<Summary>(summary_null).unwrap(),
+ Summary::V1(None)
+ );
+ assert_eq!(
+ serde_json::from_value::<Summary>(summary_string).unwrap(),
+ Summary::V1(Some("lgtm".to_string()))
+ );
+ assert_eq!(
+ serde_json::from_value::<Summary>(summary_edits).unwrap(),
+ Summary::V2(nonempty![Edit::new(
+ "z6MkwPUeUS2fJMfc2HZN1RQTQcTTuhw4HhPySB8JeUg2mVvx"
+ .parse()
+ .unwrap(),
+ "lgtm".to_string(),
+ Timestamp::from_secs(1710947885),
+ vec![]
+ )])
+ );
+ }
+
+ #[test]
+ fn test_review_deserialize_summary_migration_null_summary() {
+ let review = json!({
+ "id": "89d45fb371eb2622ba88188d474347cc526d80bb",
+ "author": { "id": "did:key:z6MkwPUeUS2fJMfc2HZN1RQTQcTTuhw4HhPySB8JeUg2mVvx" },
+ "verdict": "accept",
+ "summary": null,
+ "comments": {
+ "comments": {},
+ "timeline": []
+ },
+ "labels": [],
+ "timestamp": 1710947885000_i64
+ });
+ let v1 = serde_json::from_value::<Review>(review.clone()).unwrap();
+ assert_eq!(
+ serde_json::from_value::<patch::Review>(review).unwrap(),
+ v1.into()
+ );
+ }
+
+ #[test]
+ fn test_review_deserialize_summary_migration_without_summary() {
+ let review = json!({
+ "id": "89d45fb371eb2622ba88188d474347cc526d80bb",
+ "author": { "id": "did:key:z6MkwPUeUS2fJMfc2HZN1RQTQcTTuhw4HhPySB8JeUg2mVvx" },
+ "verdict": "accept",
+ "comments": {
+ "comments": {},
+ "timeline": []
+ },
+ "labels": [],
+ "timestamp": 1710947885000_i64
+ });
+ let v1 = serde_json::from_value::<Review>(review.clone()).unwrap();
+ assert_eq!(
+ serde_json::from_value::<patch::Review>(review).unwrap(),
+ v1.into()
+ );
+ }
+
+ #[test]
+ fn test_review_deserialize_summary_migration_with_summary() {
+ let review = json!({
+ "id": "89d45fb371eb2622ba88188d474347cc526d80bb",
+ "author": { "id": "did:key:z6MkwPUeUS2fJMfc2HZN1RQTQcTTuhw4HhPySB8JeUg2mVvx" },
+ "verdict": "accept",
+ "summary": "lgtm",
+ "comments": {
+ "comments": {},
+ "timeline": []
+ },
+ "labels": [],
+ "timestamp": 1710947885000_i64
+ });
+ let v1 = serde_json::from_value::<Review>(review.clone()).unwrap();
+ assert_eq!(
+ serde_json::from_value::<patch::Review>(review).unwrap(),
+ v1.into()
+ );
+ }
+
+ #[test]
+ fn test_review_deserialize_summary_v2() {
+ let review = json!({
+ "id": "89d45fb371eb2622ba88188d474347cc526d80bb",
+ "author": { "id": "did:key:z6MkwPUeUS2fJMfc2HZN1RQTQcTTuhw4HhPySB8JeUg2mVvx" },
+ "verdict": "accept",
+ "summary": [{
+ "author": "z6MkwPUeUS2fJMfc2HZN1RQTQcTTuhw4HhPySB8JeUg2mVvx",
+ "timestamp": 1710947885000_i64,
+ "body": "lgtm",
+ "embeds": [],
+ }],
+ "comments": {
+ "comments": {},
+ "timeline": []
+ },
+ "labels": [],
+ "timestamp": 1710947885000_i64
+ });
+ let v2 = serde_json::from_value::<Review>(review.clone()).unwrap();
+ assert_eq!(
+ serde_json::from_value::<patch::Review>(review).unwrap(),
+ v2.into()
+ );
+ }
+}
Exit code: 0
shell: '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 ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75 -v /opt/radcis/ci.rad.levitte.org/cci/state/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/s:/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w:/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w -w /ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:bookworm bash /ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/s/script.sh
+ cargo --version
info: syncing channel updates for '1.85-x86_64-unknown-linux-gnu'
info: latest update on 2025-03-18, rust version 1.85.1 (4eb161250 2025-03-15)
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.85.1 (d73d2caf9 2024-12-31)
+ rustc --version
rustc 1.85.1 (4eb161250 2025-03-15)
+ cargo fmt --check
+ cargo clippy --all-targets --workspace -- --deny warnings
Updating crates.io index
Downloading crates ...
Downloaded amplify_derive v4.0.0
Downloaded form_urlencoded v1.2.1
Downloaded phf_shared v0.11.3
Downloaded anstream v0.6.13
Downloaded ahash v0.8.11
Downloaded ref-cast v1.0.24
Downloaded schemars_derive v1.0.0-alpha.17
Downloaded regex-syntax v0.8.5
Downloaded streaming-iterator v0.1.9
Downloaded colored v2.1.0
Downloaded base64 v0.13.1
Downloaded base32 v0.4.0
Downloaded chacha20poly1305 v0.10.1
Downloaded stable_deref_trait v1.2.0
Downloaded ryu v1.0.17
Downloaded sha2 v0.10.8
Downloaded referencing v0.30.0
Downloaded signal-hook-mio v0.2.4
Downloaded ssh-cipher v0.2.0
Downloaded salsa20 v0.10.2
Downloaded rfc6979 v0.4.0
Downloaded thiserror v1.0.69
Downloaded sqlite3-sys v0.15.2
Downloaded socket2 v0.5.7
Downloaded tree-sitter-json v0.24.8
Downloaded sec1 v0.7.3
Downloaded normalize-line-endings v0.3.0
Downloaded regex v1.11.1
Downloaded tree-sitter-language v0.1.2
Downloaded tinystr v0.7.6
Downloaded fancy-regex v0.14.0
Downloaded write16 v1.0.0
Downloaded hmac v0.12.1
Downloaded vsimd v0.8.0
Downloaded inout v0.1.3
Downloaded yansi v0.5.1
Downloaded utf8_iter v1.0.4
Downloaded universal-hash v0.5.1
Downloaded pbkdf2 v0.12.2
Downloaded multibase v0.9.1
Downloaded num-cmp v0.1.0
Downloaded gix-chunk v0.4.11
Downloaded gix-shallow v0.1.0
Downloaded localtime v1.3.1
Downloaded num v0.4.3
Downloaded gix-trace v0.1.12
Downloaded outref v0.5.2
Downloaded zerofrom v0.1.6
Downloaded gix-date v0.9.4
Downloaded gix-hashtable v0.6.0
Downloaded parking_lot v0.12.3
Downloaded lazy_static v1.5.0
Downloaded gix-path v0.10.15
Downloaded gix-utils v0.1.14
Downloaded nonempty v0.5.0
Downloaded gix-url v0.28.2
Downloaded maybe-async v0.2.10
Downloaded home v0.5.9
Downloaded litrs v0.4.1
Downloaded gix-fs v0.12.1
Downloaded group v0.13.0
Downloaded iana-time-zone v0.1.60
Downloaded keccak v0.1.5
Downloaded zerofrom-derive v0.1.6
Downloaded zeroize v1.7.0
Downloaded url v2.5.4
Downloaded gix-features v0.39.1
Downloaded icu_normalizer_data v1.5.1
Downloaded icu_provider v1.5.0
Downloaded zerovec-derive v0.10.3
Downloaded unicode-segmentation v1.11.0
Downloaded num-complex v0.4.6
Downloaded log v0.4.21
Downloaded gix-odb v0.66.0
Downloaded icu_normalizer v1.5.0
Downloaded icu_collections v1.5.0
Downloaded unicode-normalization v0.1.23
Downloaded num-bigint-dig v0.8.4
Downloaded hashbrown v0.14.3
Downloaded zerocopy v0.7.35
Downloaded zerovec v0.10.4
Downloaded git2 v0.19.0
Downloaded vcpkg v0.2.15
Downloaded tree-sitter-md v0.3.2
Downloaded syn v2.0.89
Downloaded rustix v1.0.7
Downloaded rustix v0.38.34
Downloaded tree-sitter-rust v0.23.2
Downloaded p384 v0.13.0
Downloaded icu_properties_data v1.5.1
Downloaded winnow v0.6.26
Downloaded tree-sitter-bash v0.23.3
Downloaded tree-sitter-python v0.23.4
Downloaded tree-sitter-c v0.23.2
Downloaded jsonschema v0.30.0
Downloaded memchr v2.7.2
Downloaded libm v0.2.8
Downloaded tree-sitter-ruby v0.23.1
Downloaded syn v1.0.109
Downloaded gix-pack v0.56.0
Downloaded idna v1.0.3
Downloaded serde_json v1.0.140
Downloaded lock_api v0.4.11
Downloaded gix-diff v0.49.0
Downloaded gix-ref v0.49.1
Downloaded regex-automata v0.4.9
Downloaded jiff v0.2.1
Downloaded icu_locid_transform_data v1.5.1
Downloaded gix-command v0.4.1
Downloaded icu_locid v1.5.0
Downloaded gix-validate v0.9.4
Downloaded sha3 v0.10.8
Downloaded gix-protocol v0.47.0
Downloaded libc v0.2.174
Downloaded tree-sitter-typescript v0.23.2
Downloaded inquire v0.7.5
Downloaded miniz_oxide v0.8.8
Downloaded indexmap v2.2.6
Downloaded noise-framework v0.4.0
Downloaded icu_locid_transform v1.5.0
Downloaded num-integer v0.1.46
Downloaded typenum v1.17.0
Downloaded num-bigint v0.4.6
Downloaded gix-credentials v0.26.0
Downloaded gix-config-value v0.14.12
Downloaded gix-commitgraph v0.25.1
Downloaded p256 v0.13.2
Downloaded gix-packetline v0.18.4
Downloaded tree-sitter v0.24.4
Downloaded memmap2 v0.9.4
Downloaded p521 v0.13.3
Downloaded gix-transport v0.44.0
Downloaded icu_properties v1.5.1
Downloaded unicode-ident v1.0.12
Downloaded uuid v1.16.0
Downloaded newline-converter v0.3.0
Downloaded icu_provider_macros v1.5.0
Downloaded gix-traverse v0.43.1
Downloaded ssh-key v0.6.6
Downloaded gix-revision v0.31.1
Downloaded litemap v0.7.5
Downloaded sqlite3-src v0.5.1
Downloaded emojis v0.6.4
Downloaded gix-refspec v0.27.0
Downloaded gix-quote v0.4.15
Downloaded gix-prompt v0.9.1
Downloaded gix-hash v0.15.1
Downloaded nonempty v0.9.0
Downloaded gix-revwalk v0.17.0
Downloaded linux-raw-sys v0.4.13
Downloaded gix-object v0.46.1
Downloaded mio v1.0.4
Downloaded mio v0.8.11
Downloaded gix-tempfile v15.0.0
Downloaded gix-negotiate v0.17.0
Downloaded gix-lock v15.0.1
Downloaded jobserver v0.1.31
Downloaded walkdir v2.5.0
Downloaded num-traits v0.2.19
Downloaded netservices v0.8.0
Downloaded lexopt v0.3.0
Downloaded crossterm v0.29.0
Downloaded libgit2-sys v0.17.0+1.8.1
Downloaded gix-sec v0.10.12
Downloaded tree-sitter-toml-ng v0.6.0
Downloaded gix-actor v0.33.2
Downloaded unicode-display-width v0.3.0
Downloaded typeid v1.0.3
Downloaded parking_lot_core v0.9.9
Downloaded itoa v1.0.11
Downloaded yoke v0.7.5
Downloaded xattr v1.3.1
Downloaded version_check v0.9.4
Downloaded tree-sitter-go v0.23.4
Downloaded yoke-derive v0.7.5
Downloaded io-reactor v0.5.2
Downloaded writeable v0.5.5
Downloaded utf8parse v0.2.1
Downloaded utf16_iter v1.0.5
Downloaded bloomy v1.2.0
Downloaded num-iter v0.1.45
Downloaded tree-sitter-css v0.23.1
Downloaded idna_adapter v1.2.0
Downloaded unicode-width v0.1.11
Downloaded fraction v0.15.3
Downloaded crossterm v0.25.0
Downloaded once_cell v1.21.3
Downloaded tinyvec v1.6.0
Downloaded num-rational v0.4.2
Downloaded pem-rfc7468 v0.7.0
Downloaded flate2 v1.1.1
Downloaded cyphernet v0.5.2
Downloaded crypto-bigint v0.5.5
Downloaded crossbeam-channel v0.5.15
Downloaded uuid-simd v0.8.0
Downloaded opaque-debug v0.3.1
Downloaded crc32fast v1.4.0
Downloaded thiserror-impl v1.0.69
Downloaded tempfile v3.10.1
Downloaded tar v0.4.40
Downloaded subtle v2.5.0
Downloaded linux-raw-sys v0.9.4
Downloaded snapbox v0.4.17
Downloaded signals_receipts v0.2.0
Downloaded sha1_smol v1.0.0
Downloaded scopeguard v1.2.0
Downloaded phf v0.11.3
Downloaded percent-encoding v2.3.1
Downloaded erased-serde v0.4.6
Downloaded elliptic-curve v0.13.8
Downloaded ctr v0.9.2
Downloaded crossbeam-utils v0.8.19
Downloaded convert_case v0.7.1
Downloaded tree-sitter-highlight v0.24.4
Downloaded tinyvec_macros v0.1.1
Downloaded thiserror-impl v2.0.12
Downloaded thiserror v2.0.12
Downloaded synstructure v0.13.1
Downloaded spki v0.7.3
Downloaded git-ref-format-core v0.3.1
Downloaded getrandom v0.2.15
Downloaded generic-array v0.14.7
Downloaded fxhash v0.2.1
Downloaded filetime v0.2.23
Downloaded escargot v0.5.10
Downloaded equivalent v1.0.1
Downloaded ec25519 v0.1.0
Downloaded cypheraddr v0.4.0
Downloaded git-ref-format v0.3.1
Downloaded ct-codecs v1.1.1
Downloaded sem_safe v0.2.0
Downloaded scrypt v0.11.0
Downloaded ghash v0.5.1
Downloaded fluent-uri v0.3.2
Downloaded errno v0.3.13
Downloaded dyn-clone v1.0.17
Downloaded faster-hex v0.9.0
Downloaded ecdsa v0.16.9
Downloaded displaydoc v0.2.5
Downloaded cpufeatures v0.2.12
Downloaded tree-sitter-html v0.23.2
Downloaded timeago v0.4.2
Downloaded ssh-encoding v0.2.0
Downloaded siphasher v0.3.11
Downloaded signature v1.6.4
Downloaded serde_derive v1.0.219
Downloaded email_address v0.2.9
Downloaded either v1.11.0
Downloaded ed25519 v1.5.3
Downloaded derive_more-impl v2.0.1
Downloaded siphasher v1.0.1
Downloaded same-file v1.0.6
Downloaded fastrand v2.1.0
Downloaded document-features v0.2.11
Downloaded data-encoding-macro-internal v0.1.12
Downloaded colorchoice v1.0.0
Downloaded sqlite v0.32.0
Downloaded signature v2.2.0
Downloaded serde_derive_internals v0.29.1
Downloaded serde-untagged v0.1.7
Downloaded ff v0.13.0
Downloaded diff v0.1.13
Downloaded derive_more v2.0.1
Downloaded der v0.7.9
Downloaded data-encoding-macro v0.1.14
Downloaded data-encoding v2.5.0
Downloaded rsa v0.9.6
Downloaded crypto-common v0.1.6
Downloaded const-oid v0.9.6
Downloaded bitflags v1.3.2
Downloaded bit-set v0.8.0
Downloaded digest v0.10.7
Downloaded cipher v0.4.4
Downloaded chrono v0.4.38
Downloaded bytesize v2.0.1
Downloaded bytecount v0.6.8
Downloaded similar v2.5.0
Downloaded signal-hook v0.3.18
Downloaded bstr v1.9.1
Downloaded block-padding v0.3.3
Downloaded shell-words v1.1.0
Downloaded libz-sys v1.1.16
Downloaded cyphergraphy v0.3.0
Downloaded chacha20 v0.9.1
Downloaded byteorder v1.5.0
Downloaded block-buffer v0.10.4
Downloaded ascii v1.1.0
Downloaded base64 v0.22.1
Downloaded autocfg v1.2.0
Downloaded ref-cast-impl v1.0.24
Downloaded blowfish v0.9.1
Downloaded cfg-if v1.0.0
Downloaded borrow-or-share v0.2.2
Downloaded bit-vec v0.8.0
Downloaded arc-swap v1.7.1
Downloaded aead v0.5.2
Downloaded spin v0.9.8
Downloaded socks5-client v0.4.1
Downloaded snapbox-macros v0.3.8
Downloaded smallvec v1.13.2
Downloaded signal-hook-registry v1.4.5
Downloaded shlex v1.3.0
Downloaded serde v1.0.219
Downloaded schemars v1.0.0-alpha.17
Downloaded cc v1.2.2
Downloaded bitflags v2.9.1
Downloaded base64ct v1.6.0
Downloaded base16ct v0.2.0
Downloaded base-x v0.2.11
Downloaded anstyle v1.0.6
Downloaded amplify_syn v2.0.1
Downloaded amplify v4.6.0
Downloaded radicle-surf v0.22.0
Downloaded prodash v29.0.2
Downloaded pretty_assertions v1.4.0
Downloaded anyhow v1.0.82
Downloaded anstyle-parse v0.2.3
Downloaded amplify_num v0.5.2
Downloaded aho-corasick v1.1.3
Downloaded aes-gcm v0.10.3
Downloaded adler2 v2.0.0
Downloaded rand_core v0.6.4
Downloaded rand v0.8.5
Downloaded radicle-git-ext v0.8.1
Downloaded quote v1.0.36
Downloaded qcheck v1.0.0
Downloaded proc-macro2 v1.0.92
Downloaded proc-macro-error v1.0.4
Downloaded primeorder v0.13.6
Downloaded ppv-lite86 v0.2.17
Downloaded popol v3.0.0
Downloaded polyval v0.6.2
Downloaded poly1305 v0.8.0
Downloaded pkg-config v0.3.30
Downloaded pkcs8 v0.10.2
Downloaded pkcs1 v0.7.5
Downloaded git-ref-format-macro v0.3.1
Downloaded anstyle-query v1.0.2
Downloaded aes v0.8.4
Downloaded rand_chacha v0.3.1
Downloaded radicle-std-ext v0.1.0
Downloaded qcheck-macros v1.0.0
Downloaded proc-macro-error-attr v1.0.4
Downloaded cbc v0.1.2
Downloaded bcrypt-pbkdf v0.10.0
Downloaded base64 v0.21.7
Compiling libc v0.2.174
Compiling proc-macro2 v1.0.92
Compiling unicode-ident v1.0.12
Checking cfg-if v1.0.0
Compiling shlex v1.3.0
Compiling version_check v0.9.4
Checking memchr v2.7.2
Compiling serde v1.0.219
Compiling autocfg v1.2.0
Compiling quote v1.0.36
Checking getrandom v0.2.15
Checking smallvec v1.13.2
Compiling syn v2.0.89
Compiling jobserver v0.1.31
Checking aho-corasick v1.1.3
Checking regex-syntax v0.8.5
Compiling cc v1.2.2
Compiling typenum v1.17.0
Checking regex-automata v0.4.9
Compiling generic-array v0.14.7
Checking log v0.4.21
Checking rand_core v0.6.4
Checking fastrand v2.1.0
Compiling lock_api v0.4.11
Checking crypto-common v0.1.6
Compiling parking_lot_core v0.9.9
Checking bitflags v2.9.1
Compiling synstructure v0.13.1
Checking scopeguard v1.2.0
Checking bstr v1.9.1
Checking subtle v2.5.0
Checking stable_deref_trait v1.2.0
Checking parking_lot v0.12.3
Checking once_cell v1.21.3
Compiling syn v1.0.109
Checking tinyvec_macros v0.1.1
Checking zeroize v1.7.0
Checking tinyvec v1.6.0
Checking cpufeatures v0.2.12
Checking litemap v0.7.5
Checking writeable v0.5.5
Compiling crc32fast v1.4.0
Checking unicode-normalization v0.1.23
Compiling serde_derive v1.0.219
Compiling zerofrom-derive v0.1.6
Compiling yoke-derive v0.7.5
Checking zerofrom v0.1.6
Compiling zerovec-derive v0.10.3
Checking yoke v0.7.5
Compiling displaydoc v0.2.5
Compiling icu_locid_transform_data v1.5.1
Compiling thiserror v2.0.12
Checking zerovec v0.10.4
Compiling icu_provider_macros v1.5.0
Compiling thiserror-impl v2.0.12
Checking tinystr v0.7.6
Checking block-padding v0.3.3
Checking icu_locid v1.5.0
Compiling icu_properties_data v1.5.1
Checking inout v0.1.3
Checking icu_provider v1.5.0
Checking block-buffer v0.10.4
Compiling icu_normalizer_data v1.5.1
Checking hashbrown v0.14.3
Compiling pkg-config v0.3.30
Checking itoa v1.0.11
Checking icu_locid_transform v1.5.0
Checking digest v0.10.7
Checking cipher v0.4.4
Checking icu_collections v1.5.0
Checking utf8_iter v1.0.4
Checking utf16_iter v1.0.5
Checking write16 v1.0.0
Compiling thiserror v1.0.69
Compiling thiserror-impl v1.0.69
Checking percent-encoding v2.3.1
Checking icu_properties v1.5.1
Compiling rustix v0.38.34
Checking linux-raw-sys v0.4.13
Checking sha2 v0.10.8
Checking form_urlencoded v1.2.1
Checking universal-hash v0.5.1
Checking opaque-debug v0.3.1
Compiling vcpkg v0.2.15
Compiling amplify_syn v2.0.1
Checking icu_normalizer v1.5.0
Checking idna_adapter v1.2.0
Compiling libz-sys v1.1.16
Checking idna v1.0.3
Checking byteorder v1.5.0
Checking url v2.5.4
Checking gix-trace v0.1.12
Compiling data-encoding v2.5.0
Compiling amplify_derive v4.0.0
Checking tempfile v3.10.1
Checking ascii v1.1.0
Checking signature v1.6.4
Checking amplify_num v0.5.2
Compiling data-encoding-macro-internal v0.1.12
Checking ed25519 v1.5.3
Checking faster-hex v0.9.0
Compiling libgit2-sys v0.17.0+1.8.1
Checking data-encoding-macro v0.1.14
Checking aead v0.5.2
Compiling num-traits v0.2.19
Compiling proc-macro-error-attr v1.0.4
Checking ct-codecs v1.1.1
Checking base-x v0.2.11
Checking ec25519 v0.1.0
Checking multibase v0.9.1
Checking poly1305 v0.8.0
Checking chacha20 v0.9.1
Checking amplify v4.6.0
Checking gix-utils v0.1.14
Compiling proc-macro-error v1.0.4
Checking adler2 v2.0.0
Checking miniz_oxide v0.8.8
Checking cyphergraphy v0.3.0
Checking gix-hash v0.15.1
Compiling crossbeam-utils v0.8.19
Checking keccak v0.1.5
Checking same-file v1.0.6
Checking walkdir v2.5.0
Checking sha3 v0.10.8
Checking flate2 v1.1.1
Compiling git-ref-format-core v0.3.1
Checking polyval v0.6.2
Checking hmac v0.12.1
Compiling sqlite3-src v0.5.1
Checking prodash v29.0.2
Compiling serde_json v1.0.140
Checking sha1_smol v1.0.0
Checking base64ct v1.6.0
Checking ppv-lite86 v0.2.17
Checking base32 v0.4.0
Checking equivalent v1.0.1
Checking pem-rfc7468 v0.7.0
Checking rand_chacha v0.3.1
Checking indexmap v2.2.6
Checking cypheraddr v0.4.0
Checking gix-features v0.39.1
Checking pbkdf2 v0.12.2
Checking ghash v0.5.1
Compiling git-ref-format-macro v0.3.1
Checking chacha20poly1305 v0.10.1
Checking ctr v0.9.2
Checking aes v0.8.4
Checking ryu v1.0.17
Checking aes-gcm v0.10.3
Checking git-ref-format v0.3.1
Checking noise-framework v0.4.0
Checking crossbeam-channel v0.5.15
Checking socks5-client v0.4.1
Checking rand v0.8.5
Checking ssh-encoding v0.2.0
Checking blowfish v0.9.1
Checking cbc v0.1.2
Checking radicle-std-ext v0.1.0
Compiling ref-cast v1.0.24
Checking home v0.5.9
Checking gix-path v0.10.15
Checking ssh-cipher v0.2.0
Checking bcrypt-pbkdf v0.10.0
Checking cyphernet v0.5.2
Compiling ref-cast-impl v1.0.24
Checking signature v2.2.0
Checking ssh-key v0.6.6
Checking qcheck v1.0.0
Checking radicle-ssh v0.9.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-ssh)
Checking dyn-clone v1.0.17
Compiling typeid v1.0.3
Checking lazy_static v1.5.0
Checking siphasher v1.0.1
Checking nonempty v0.9.0
Compiling serde_derive_internals v0.29.1
Checking radicle-dag v0.10.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-dag)
Checking tree-sitter-language v0.1.2
Checking erased-serde v0.4.6
Checking jiff v0.2.1
Compiling schemars_derive v1.0.0-alpha.17
Checking iana-time-zone v0.1.60
Checking chrono v0.4.38
Checking schemars v1.0.0-alpha.17
Checking gix-date v0.9.4
Checking serde-untagged v0.1.7
Checking colored v2.1.0
Checking bytesize v2.0.1
Checking localtime v1.3.1
Checking winnow v0.6.26
Compiling anyhow v1.0.82
Checking base64 v0.21.7
Checking gix-hashtable v0.6.0
Checking gix-validate v0.9.4
Checking anstyle-query v1.0.2
Checking memmap2 v0.9.4
Checking gix-chunk v0.4.11
Checking errno v0.3.13
Checking sem_safe v0.2.0
Checking gix-actor v0.33.2
Checking signals_receipts v0.2.0
Checking gix-object v0.46.1
Checking gix-commitgraph v0.25.1
Compiling signal-hook v0.3.18
Checking gix-fs v0.12.1
Checking signal-hook-registry v1.4.5
Checking gix-revwalk v0.17.0
Checking gix-tempfile v15.0.0
Checking radicle-signals v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-signals)
Checking mio v1.0.4
Checking mio v0.8.11
Compiling tree-sitter v0.24.4
Compiling unicode-segmentation v1.11.0
Compiling convert_case v0.7.1
Checking signal-hook-mio v0.2.4
Checking regex v1.11.1
Checking shell-words v1.1.0
Compiling rustix v1.0.7
Checking gix-command v0.4.1
Compiling xattr v1.3.1
Compiling derive_more-impl v2.0.1
Compiling filetime v0.2.23
Compiling litrs v0.4.1
Checking lexopt v0.3.0
Checking bitflags v1.3.2
Checking sqlite3-sys v0.15.2
Checking linux-raw-sys v0.9.4
Checking utf8parse v0.2.1
Checking sqlite v0.32.0
Checking anstyle-parse v0.2.3
Checking crossterm v0.25.0
Checking derive_more v2.0.1
Compiling document-features v0.2.11
Compiling tar v0.4.40
Checking newline-converter v0.3.0
Checking gix-lock v15.0.1
Checking gix-url v0.28.2
Checking gix-config-value v0.14.12
Checking gix-quote v0.4.15
Checking fxhash v0.2.1
Checking gix-sec v0.10.12
Checking colorchoice v1.0.0
Checking unicode-width v0.1.11
Checking anstyle v1.0.6
Checking streaming-iterator v0.1.9
Checking inquire v0.7.5
Checking anstream v0.6.13
Compiling radicle-surf v0.22.0
Checking gix-prompt v0.9.1
Checking crossterm v0.29.0
Checking unicode-display-width v0.3.0
Checking gix-revision v0.31.1
Checking gix-traverse v0.43.1
Checking gix-diff v0.49.0
Checking gix-packetline v0.18.4
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-rust v0.23.2
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-python v0.23.4
Compiling tree-sitter-html v0.23.2
Checking gix-transport v0.44.0
Checking gix-pack v0.56.0
Checking gix-refspec v0.27.0
Checking gix-credentials v0.26.0
Checking snapbox-macros v0.3.8
Checking gix-shallow v0.1.0
Checking gix-ref v0.49.1
Checking gix-negotiate v0.17.0
Compiling maybe-async v0.2.10
Checking similar v2.5.0
Checking normalize-line-endings v0.3.0
Checking arc-swap v1.7.1
Checking base64 v0.13.1
Checking nonempty v0.5.0
Compiling radicle-cli v0.13.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cli)
Checking gix-odb v0.66.0
Checking gix-protocol v0.47.0
Checking snapbox v0.4.17
Checking tree-sitter-highlight v0.24.4
Checking popol v3.0.0
Checking timeago v0.4.2
Checking either v1.11.0
Checking io-reactor v0.5.2
Checking salsa20 v0.10.2
Checking socket2 v0.5.7
Checking siphasher v0.3.11
Checking yansi v0.5.1
Checking diff v0.1.13
Compiling radicle-node v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-node)
Checking netservices v0.8.0
Checking pretty_assertions v1.4.0
Checking bloomy v1.2.0
Checking scrypt v0.11.0
Checking num-integer v0.1.46
Compiling escargot v0.5.10
Checking radicle-systemd v0.9.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-systemd)
Checking num-bigint v0.4.6
Compiling qcheck-macros v1.0.0
Compiling ahash v0.8.11
Compiling radicle-remote-helper v0.10.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-remote-helper)
Checking num-rational v0.4.2
Checking num-iter v0.1.45
Checking num-complex v0.4.6
Checking bit-vec v0.8.0
Checking zerocopy v0.7.35
Checking borrow-or-share v0.2.2
Checking bit-set v0.8.0
Checking fluent-uri v0.3.2
Checking num v0.4.3
Checking phf_shared v0.11.3
Checking uuid v1.16.0
Checking vsimd v0.8.0
Checking outref v0.5.2
Checking referencing v0.30.0
Checking phf v0.11.3
Checking uuid-simd v0.8.0
Checking fraction v0.15.3
Checking fancy-regex v0.14.0
Checking email_address v0.2.9
Checking base64 v0.22.1
Checking num-cmp v0.1.0
Checking bytecount v0.6.8
Checking emojis v0.6.4
Checking jsonschema v0.30.0
Checking git2 v0.19.0
Checking radicle-git-ext v0.8.1
Checking radicle-term v0.12.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-term)
Checking radicle-crypto v0.12.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-crypto)
Checking radicle-cob v0.14.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cob)
Checking radicle v0.15.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle)
Checking radicle-fetch v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-fetch)
Checking radicle-cli-test v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cli-test)
Checking radicle-schemars v0.1.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-schemars)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 41.61s
+ cargo build --all-targets --workspace
Compiling cfg-if v1.0.0
Compiling libc v0.2.174
Compiling shlex v1.3.0
Compiling memchr v2.7.2
Compiling serde v1.0.219
Compiling smallvec v1.13.2
Compiling regex-syntax v0.8.5
Compiling jobserver v0.1.31
Compiling getrandom v0.2.15
Compiling cc v1.2.2
Compiling aho-corasick v1.1.3
Compiling regex-automata v0.4.9
Compiling typenum v1.17.0
Compiling log v0.4.21
Compiling generic-array v0.14.7
Compiling rand_core v0.6.4
Compiling fastrand v2.1.0
Compiling bitflags v2.9.1
Compiling scopeguard v1.2.0
Compiling lock_api v0.4.11
Compiling crypto-common v0.1.6
Compiling zerofrom v0.1.6
Compiling parking_lot_core v0.9.9
Compiling subtle v2.5.0
Compiling stable_deref_trait v1.2.0
Compiling yoke v0.7.5
Compiling parking_lot v0.12.3
Compiling once_cell v1.21.3
Compiling tinyvec_macros v0.1.1
Compiling zerovec v0.10.4
Compiling tinyvec v1.6.0
Compiling bstr v1.9.1
Compiling zeroize v1.7.0
Compiling unicode-normalization v0.1.23
Compiling cpufeatures v0.2.12
Compiling tinystr v0.7.6
Compiling writeable v0.5.5
Compiling litemap v0.7.5
Compiling block-padding v0.3.3
Compiling thiserror v2.0.12
Compiling inout v0.1.3
Compiling icu_locid v1.5.0
Compiling icu_locid_transform_data v1.5.1
Compiling block-buffer v0.10.4
Compiling itoa v1.0.11
Compiling adler2 v2.0.0
Compiling hashbrown v0.14.3
Compiling miniz_oxide v0.8.8
Compiling icu_provider v1.5.0
Compiling digest v0.10.7
Compiling cipher v0.4.4
Compiling icu_locid_transform v1.5.0
Compiling crc32fast v1.4.0
Compiling icu_properties_data v1.5.1
Compiling icu_collections v1.5.0
Compiling icu_normalizer_data v1.5.1
Compiling write16 v1.0.0
Compiling utf16_iter v1.0.5
Compiling utf8_iter v1.0.4
Compiling percent-encoding v2.3.1
Compiling icu_properties v1.5.1
Compiling linux-raw-sys v0.4.13
Compiling thiserror v1.0.69
Compiling sha2 v0.10.8
Compiling rustix v0.38.34
Compiling form_urlencoded v1.2.1
Compiling universal-hash v0.5.1
Compiling opaque-debug v0.3.1
Compiling libz-sys v1.1.16
Compiling byteorder v1.5.0
Compiling gix-trace v0.1.12
Compiling data-encoding v2.5.0
Compiling icu_normalizer v1.5.0
Compiling signature v1.6.4
Compiling tempfile v3.10.1
Compiling idna_adapter v1.2.0
Compiling idna v1.0.3
Compiling amplify_num v0.5.2
Compiling ascii v1.1.0
Compiling url v2.5.4
Compiling ed25519 v1.5.3
Compiling data-encoding-macro v0.1.14
Compiling libgit2-sys v0.17.0+1.8.1
Compiling aead v0.5.2
Compiling faster-hex v0.9.0
Compiling amplify v4.6.0
Compiling base-x v0.2.11
Compiling ct-codecs v1.1.1
Compiling multibase v0.9.1
Compiling ec25519 v0.1.0
Compiling poly1305 v0.8.0
Compiling chacha20 v0.9.1
Compiling gix-utils v0.1.14
Compiling cyphergraphy v0.3.0
Compiling num-traits v0.2.19
Compiling gix-hash v0.15.1
Compiling keccak v0.1.5
Compiling same-file v1.0.6
Compiling walkdir v2.5.0
Compiling sha3 v0.10.8
Compiling polyval v0.6.2
Compiling git-ref-format-core v0.3.1
Compiling flate2 v1.1.1
Compiling hmac v0.12.1
Compiling sqlite3-src v0.5.1
Compiling prodash v29.0.2
Compiling equivalent v1.0.1
Compiling base32 v0.4.0
Compiling base64ct v1.6.0
Compiling ppv-lite86 v0.2.17
Compiling sha1_smol v1.0.0
Compiling rand_chacha v0.3.1
Compiling gix-features v0.39.1
Compiling pem-rfc7468 v0.7.0
Compiling cypheraddr v0.4.0
Compiling indexmap v2.2.6
Compiling git-ref-format-macro v0.3.1
Compiling pbkdf2 v0.12.2
Compiling ghash v0.5.1
Compiling crossbeam-utils v0.8.19
Compiling chacha20poly1305 v0.10.1
Compiling ctr v0.9.2
Compiling aes v0.8.4
Compiling ryu v1.0.17
Compiling serde_json v1.0.140
Compiling aes-gcm v0.10.3
Compiling git-ref-format v0.3.1
Compiling crossbeam-channel v0.5.15
Compiling noise-framework v0.4.0
Compiling socks5-client v0.4.1
Compiling ssh-encoding v0.2.0
Compiling rand v0.8.5
Compiling blowfish v0.9.1
Compiling cbc v0.1.2
Compiling home v0.5.9
Compiling radicle-std-ext v0.1.0
Compiling gix-path v0.10.15
Compiling ssh-cipher v0.2.0
Compiling bcrypt-pbkdf v0.10.0
Compiling cyphernet v0.5.2
Compiling signature v2.2.0
Compiling ssh-key v0.6.6
Compiling ref-cast v1.0.24
Compiling qcheck v1.0.0
Compiling radicle-ssh v0.9.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-ssh)
Compiling dyn-clone v1.0.17
Compiling lazy_static v1.5.0
Compiling siphasher v1.0.1
Compiling typeid v1.0.3
Compiling radicle-dag v0.10.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-dag)
Compiling nonempty v0.9.0
Compiling tree-sitter-language v0.1.2
Compiling erased-serde v0.4.6
Compiling iana-time-zone v0.1.60
Compiling jiff v0.2.1
Compiling serde-untagged v0.1.7
Compiling chrono v0.4.38
Compiling schemars v1.0.0-alpha.17
Compiling gix-date v0.9.4
Compiling colored v2.1.0
Compiling localtime v1.3.1
Compiling bytesize v2.0.1
Compiling winnow v0.6.26
Compiling base64 v0.21.7
Compiling gix-hashtable v0.6.0
Compiling gix-validate v0.9.4
Compiling gix-actor v0.33.2
Compiling anstyle-query v1.0.2
Compiling gix-object v0.46.1
Compiling memmap2 v0.9.4
Compiling anyhow v1.0.82
Compiling gix-chunk v0.4.11
Compiling sem_safe v0.2.0
Compiling errno v0.3.13
Compiling sqlite3-sys v0.15.2
Compiling unicode-segmentation v1.11.0
Compiling sqlite v0.32.0
Compiling signals_receipts v0.2.0
Compiling gix-commitgraph v0.25.1
Compiling gix-fs v0.12.1
Compiling gix-revwalk v0.17.0
Compiling signal-hook-registry v1.4.5
Compiling gix-tempfile v15.0.0
Compiling signal-hook v0.3.18
Compiling radicle-signals v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-signals)
Compiling mio v1.0.4
Compiling mio v0.8.11
Compiling tree-sitter v0.24.4
Compiling signal-hook-mio v0.2.4
Compiling convert_case v0.7.1
Compiling regex v1.11.1
Compiling shell-words v1.1.0
Compiling gix-command v0.4.1
Compiling derive_more-impl v2.0.1
Compiling xattr v1.3.1
Compiling filetime v0.2.23
Compiling lexopt v0.3.0
Compiling linux-raw-sys v0.9.4
Compiling utf8parse v0.2.1
Compiling bitflags v1.3.2
Compiling derive_more v2.0.1
Compiling crossterm v0.25.0
Compiling anstyle-parse v0.2.3
Compiling tar v0.4.40
Compiling rustix v1.0.7
Compiling gix-lock v15.0.1
Compiling newline-converter v0.3.0
Compiling gix-url v0.28.2
Compiling gix-config-value v0.14.12
Compiling gix-quote v0.4.15
Compiling fxhash v0.2.1
Compiling gix-sec v0.10.12
Compiling streaming-iterator v0.1.9
Compiling colorchoice v1.0.0
Compiling unicode-width v0.1.11
Compiling anstyle v1.0.6
Compiling radicle-surf v0.22.0
Compiling inquire v0.7.5
Compiling anstream v0.6.13
Compiling gix-prompt v0.9.1
Compiling crossterm v0.29.0
Compiling gix-revision v0.31.1
Compiling gix-traverse v0.43.1
Compiling unicode-display-width v0.3.0
Compiling gix-diff v0.49.0
Compiling gix-packetline v0.18.4
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-python v0.23.4
Compiling tree-sitter-rust v0.23.2
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-md v0.3.2
Compiling gix-transport v0.44.0
Compiling gix-pack v0.56.0
Compiling gix-refspec v0.27.0
Compiling gix-credentials v0.26.0
Compiling snapbox-macros v0.3.8
Compiling gix-shallow v0.1.0
Compiling gix-ref v0.49.1
Compiling gix-negotiate v0.17.0
Compiling normalize-line-endings v0.3.0
Compiling similar v2.5.0
Compiling radicle-cli v0.13.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cli)
Compiling nonempty v0.5.0
Compiling arc-swap v1.7.1
Compiling base64 v0.13.1
Compiling gix-odb v0.66.0
Compiling snapbox v0.4.17
Compiling gix-protocol v0.47.0
Compiling tree-sitter-highlight v0.24.4
Compiling popol v3.0.0
Compiling either v1.11.0
Compiling timeago v0.4.2
Compiling io-reactor v0.5.2
Compiling salsa20 v0.10.2
Compiling socket2 v0.5.7
Compiling yansi v0.5.1
Compiling siphasher v0.3.11
Compiling radicle-node v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-node)
Compiling diff v0.1.13
Compiling bloomy v1.2.0
Compiling pretty_assertions v1.4.0
Compiling netservices v0.8.0
Compiling scrypt v0.11.0
Compiling num-integer v0.1.46
Compiling radicle-systemd v0.9.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-systemd)
Compiling escargot v0.5.10
Compiling num-bigint v0.4.6
Compiling radicle-remote-helper v0.10.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-remote-helper)
Compiling num-iter v0.1.45
Compiling num-complex v0.4.6
Compiling num-rational v0.4.2
Compiling borrow-or-share v0.2.2
Compiling bit-vec v0.8.0
Compiling zerocopy v0.7.35
Compiling bit-set v0.8.0
Compiling ahash v0.8.11
Compiling num v0.4.3
Compiling fluent-uri v0.3.2
Compiling phf_shared v0.11.3
Compiling uuid v1.16.0
Compiling vsimd v0.8.0
Compiling outref v0.5.2
Compiling referencing v0.30.0
Compiling uuid-simd v0.8.0
Compiling phf v0.11.3
Compiling fraction v0.15.3
Compiling fancy-regex v0.14.0
Compiling email_address v0.2.9
Compiling bytecount v0.6.8
Compiling base64 v0.22.1
Compiling num-cmp v0.1.0
Compiling jsonschema v0.30.0
Compiling emojis v0.6.4
Compiling git2 v0.19.0
Compiling radicle-git-ext v0.8.1
Compiling radicle-term v0.12.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-term)
Compiling radicle-crypto v0.12.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-crypto)
Compiling radicle-cob v0.14.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cob)
Compiling radicle v0.15.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle)
Compiling radicle-fetch v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-fetch)
Compiling radicle-cli-test v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cli-test)
Compiling radicle-schemars v0.1.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-schemars)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 02s
+ 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.9.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-ssh)
Compiling num-traits v0.2.19
Checking url v2.5.4
Checking git2 v0.19.0
Checking radicle-dag v0.10.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-dag)
Checking chrono v0.4.38
Compiling amplify_syn v2.0.1
Checking bstr v1.9.1
Compiling proc-macro-error v1.0.4
Checking git-ref-format-core v0.3.1
Checking gix-path v0.10.15
Checking gix-date v0.9.4
Checking gix-validate v0.9.4
Checking gix-commitgraph v0.25.1
Compiling amplify_derive v4.0.0
Compiling data-encoding-macro-internal v0.1.12
Compiling git-ref-format-macro v0.3.1
Checking gix-actor v0.33.2
Checking data-encoding-macro v0.1.14
Checking gix-object v0.46.1
Checking multibase v0.9.1
Checking git-ref-format v0.3.1
Checking radicle-signals v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-signals)
Checking radicle-git-ext v0.8.1
Checking regex v1.11.1
Checking gix-command v0.4.1
Checking radicle-surf v0.22.0
Checking gix-revwalk v0.17.0
Checking tree-sitter v0.24.4
Compiling radicle-cli v0.13.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cli)
Checking radicle-term v0.12.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-term)
Checking tree-sitter-highlight v0.24.4
Checking tree-sitter-toml-ng v0.6.0
Checking gix-config-value v0.14.12
Checking gix-url v0.28.2
Checking gix-quote v0.4.15
Checking gix-prompt v0.9.1
Checking gix-traverse v0.43.1
Checking gix-revision v0.31.1
Checking gix-diff v0.49.0
Checking gix-packetline v0.18.4
Checking amplify v4.6.0
Checking gix-refspec v0.27.0
Checking gix-pack v0.56.0
Checking gix-transport v0.44.0
Checking gix-credentials v0.26.0
Checking cyphergraphy v0.3.0
Checking gix-ref v0.49.1
Checking gix-shallow v0.1.0
Checking cypheraddr v0.4.0
Checking noise-framework v0.4.0
Checking socks5-client v0.4.1
Checking gix-negotiate v0.17.0
Checking gix-odb v0.66.0
Checking cyphernet v0.5.2
Checking radicle-crypto v0.12.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-crypto)
Checking io-reactor v0.5.2
Checking gix-protocol v0.47.0
Compiling radicle-node v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-node)
Checking radicle-cob v0.14.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cob)
Checking netservices v0.8.0
Checking radicle-systemd v0.9.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-systemd)
Documenting radicle-cob v0.14.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cob)
Documenting radicle-crypto v0.12.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-crypto)
Checking radicle v0.15.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle)
Documenting radicle v0.15.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle)
Documenting radicle-term v0.12.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-term)
Documenting radicle-signals v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-signals)
Documenting radicle-ssh v0.9.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-ssh)
Documenting radicle-dag v0.10.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-dag)
Documenting radicle-systemd v0.9.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-systemd)
warning: unresolved link to `summary`
--> crates/radicle/src/cob/patch/actions.rs:29:45
|
29 | /// introduces `embeds` to the review [`summary`].
| ^^^^^^^ no item named `summary` in scope
|
= help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
= note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default
warning: unresolved link to `Review`
--> crates/radicle/src/cob/patch/actions.rs:31:30
|
31 | /// The `summary` of a [`Review`] is now an edit-history.
| ^^^^^^ no item named `Review` in scope
|
= help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
warning: `radicle` (lib doc) generated 2 warnings
Checking radicle-fetch v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-fetch)
Documenting radicle-cli v0.13.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cli)
Documenting radicle-cli-test v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cli-test)
Documenting radicle-node v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-node)
Documenting radicle-schemars v0.1.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-schemars)
Documenting radicle-fetch v0.11.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-fetch)
Checking radicle-remote-helper v0.10.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-remote-helper)
Documenting radicle-remote-helper v0.10.0 (/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-remote-helper)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 9.97s
Generated /ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/target/doc/radicle/index.html and 15 other files
+ cargo test --workspace --no-fail-fast
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.18s
Running unittests src/lib.rs (target/debug/deps/radicle-d545358ded40ebe4)
running 194 tests
test canonical::formatter::test::ascii_control_characters ... ok
test canonical::formatter::test::securesystemslib_asserts ... ok
test canonical::formatter::test::ordered_nested_object ... ok
test cob::cache::migrations::_2::tests::test_patch_json_deserialization ... ok
test cob::common::test::test_color ... ok
test cob::common::test::test_emojis ... ok
test cob::cache::tests::test_check_version ... ok
test cob::cache::migrations::_2::tests::test_migration_2 ... ok
test cob::cache::tests::test_migrate_to ... ok
test cob::identity::test::prop_json_eq_str ... ok
test cob::identity::test::test_identity_redact_revision ... ok
test cob::identity::test::test_identity_update_rejected ... ok
test cob::identity::test::test_identity_reject_concurrent ... ok
test cob::identity::test::test_identity_remove_delegate_concurrent ... ok
test cob::identity::test::test_identity_updates ... ok
test cob::issue::cache::tests::test_counts ... ok
test cob::issue::cache::tests::test_get ... ok
test cob::issue::cache::tests::test_is_empty ... ok
test cob::issue::cache::tests::test_list ... ok
test cob::issue::cache::tests::test_list_by_status ... ok
test cob::issue::cache::tests::test_remove ... ok
test cob::identity::test::test_identity_updates_concurrent ... ok
test cob::issue::test::test_embeds ... ok
test cob::identity::test::test_valid_identity ... ok
test cob::issue::test::test_invalid_actions ... ok
test cob::issue::test::test_embeds_edit ... ok
test cob::identity::test::test_identity_updates_concurrent_outdated ... ok
test cob::issue::test::test_invalid_tx_reference ... ok
test cob::issue::test::test_invalid_tx ... ok
test cob::issue::test::test_concurrency ... ok
test cob::issue::test::test_invalid_cob ... ok
test cob::issue::test::test_issue_all ... ok
test cob::issue::test::test_issue_comment ... ok
test cob::issue::test::test_issue_comment_redact ... ok
test cob::issue::test::test_issue_create_and_change_state ... ok
test cob::issue::test::test_issue_create_and_assign ... ok
test cob::issue::test::test_issue_create_and_get ... ok
test cob::issue::test::test_issue_create_and_unassign ... ok
test cob::issue::test::test_issue_create_and_reassign ... ok
test cob::issue::test::test_issue_edit ... ok
test cob::issue::test::test_issue_edit_description ... ok
test cob::issue::test::test_issue_multilines ... ok
test cob::issue::test::test_issue_state_serde ... ok
test cob::issue::test::test_ordering ... ok
test cob::patch::actions::test::test_review_edit ... ok
test cob::issue::test::test_issue_label ... ok
test cob::patch::cache::tests::test_find_by_revision ... ok
test cob::issue::test::test_issue_react ... ok
test cob::patch::cache::tests::test_is_empty ... ok
test cob::issue::test::test_issue_reply ... ok
test cob::patch::cache::tests::test_list_by_status ... ok
test cob::patch::cache::tests::test_get ... ok
test cob::patch::cache::tests::test_list ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_migration_null_summary ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_migration_without_summary ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_migration_with_summary ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_v2 ... ok
test cob::patch::encoding::review::test::test_review_summary ... ok
test cob::patch::test::test_json ... ok
test cob::patch::test::test_json_serialization ... ok
test cob::patch::cache::tests::test_counts ... ok
test cob::patch::cache::tests::test_remove ... ok
test cob::patch::test::test_patch_create_and_get ... ok
test cob::patch::test::test_patch_discussion ... ok
test cob::patch::test::test_patch_merge ... ok
test cob::patch::test::test_patch_redact ... ok
test cob::patch::test::test_patch_review ... ok
test cob::patch::test::test_patch_review_comment ... ok
test cob::patch::test::test_patch_review_duplicate ... ok
test cob::patch::test::test_patch_review_edit ... ok
test cob::patch::test::test_patch_review_edit_comment ... ok
test cob::patch::test::test_reactions_json_serialization ... ok
test cob::patch::test::test_revision_edit_redact ... ok
test cob::patch::test::test_revision_reaction ... ok
test cob::patch::test::test_patch_review_remove_summary ... ok
test cob::patch::test::test_revision_review_merge_redacted ... ok
test cob::thread::tests::test_comment_edit_missing ... ok
test cob::thread::tests::test_comment_edit_redacted ... ok
test cob::thread::tests::test_comment_redact_missing ... ok
test cob::thread::tests::test_duplicate_comments ... ok
test cob::thread::tests::test_edit_comment ... ok
test cob::thread::tests::test_redact_comment ... ok
test cob::thread::tests::test_timeline ... ok
test cob::patch::test::test_patch_review_revision_redact ... ok
test git::canonical::tests::test_quorum_merges ... ok
test cob::patch::test::test_patch_update ... ok
test git::test::test_version_from_str ... ok
test git::canonical::tests::test_quorum ... ok
test git::test::test_version_ord ... ok
test identity::did::test::test_did_vectors ... ok
test identity::doc::id::test::prop_from_str ... ok
test identity::did::test::test_did_encode_decode ... ok
test identity::doc::test::test_canonical_doc ... ok
test git::canonical::tests::test_quorum_properties ... ok
test identity::doc::test::test_duplicate_dids ... ok
test identity::doc::test::test_future_version_error ... ok
test identity::doc::test::test_is_valid_version ... ok
test identity::doc::test::test_max_delegates ... ok
test identity::doc::test::test_not_found ... ok
test identity::doc::test::test_parse_version ... ok
test identity::doc::test::test_visibility_json ... ok
test identity::project::test::test_project_name ... ok
test node::address::store::test::test_alias ... ok
test node::address::store::test::test_disconnected ... ok
test identity::doc::test::test_canonical_example ... ok
test node::address::store::test::test_disconnected_ban ... ok
test node::address::store::test::test_entries ... ok
test node::address::store::test::test_get_none ... ok
test node::address::store::test::test_insert_and_get ... ok
test node::address::store::test::test_insert_and_remove ... ok
test node::address::store::test::test_insert_and_update ... ok
test node::address::store::test::test_insert_duplicate ... ok
test node::address::store::test::test_node_aliases ... ok
test node::address::store::test::test_remove_nothing ... ok
test node::db::test::test_version ... ok
test node::features::test::test_operations ... ok
test node::notifications::store::test::test_branch_notifications ... ok
test node::notifications::store::test::test_clear ... ok
test node::address::store::test::test_empty ... ok
test node::notifications::store::test::test_cob_notifications ... ok
test node::notifications::store::test::test_counts_by_repo ... ok
test node::notifications::store::test::test_duplicate_notifications ... ok
test node::notifications::store::test::test_notification_status ... ok
test node::policy::store::test::test_follow_and_unfollow_node ... ok
test node::policy::store::test::test_node_aliases ... ok
test node::policy::store::test::test_node_policies ... ok
test node::policy::store::test::test_node_policy ... ok
test node::policy::store::test::test_repo_policies ... ok
test node::policy::store::test::test_repo_policy ... ok
test node::policy::store::test::test_seed_and_unseed_repo ... ok
test node::policy::store::test::test_update_alias ... ok
test node::policy::store::test::test_update_scope ... ok
test node::refs::store::test::test_count ... ok
test node::refs::store::test::test_set_and_delete ... ok
test node::refs::store::test::test_set_and_get ... ok
test node::routing::test::test_count ... ok
test node::routing::test::test_entries ... ok
test node::routing::test::test_insert_and_get ... ok
test node::routing::test::test_insert_and_get_resources ... ok
test node::routing::test::test_insert_and_remove ... ok
test node::routing::test::test_insert_duplicate ... ok
test node::routing::test::test_insert_existing_updated_time ... ok
test node::routing::test::test_len ... ok
test node::routing::test::test_remove_many ... ok
test node::routing::test::test_prune ... ok
test node::routing::test::test_remove_redundant ... ok
test node::routing::test::test_update_existing_multi ... ok
test node::sync::announce::test::announcer_must_reach_preferred_seeds ... ok
test node::sync::announce::test::announcer_reached_max_replication_target ... ok
test node::sync::announce::test::announcer_reached_min_replication_target ... ok
test node::sync::announce::test::announcer_timed_out ... ok
test node::sync::announce::test::announcer_will_minimise_replication_factor ... ok
test node::sync::announce::test::cannot_construct_announcer ... ok
test node::sync::fetch::test::all_nodes_are_candidates ... ok
test cob::thread::tests::prop_ordering ... ok
test node::sync::fetch::test::all_nodes_are_fetchable ... ok
test node::sync::fetch::test::ignores_duplicates_and_local_node ... ok
test node::sync::fetch::test::could_not_reach_target ... ok
test node::sync::fetch::test::preferred_seeds_target_returned_over_replicas ... ok
test node::sync::fetch::test::reaches_target_of_max_replicas ... ok
test node::sync::fetch::test::reaches_target_of_replicas ... ok
test node::sync::fetch::test::reaches_target_of_preferred_seeds ... ok
test node::test::test_alias ... ok
test node::sync::test::ensure_replicas_construction ... ok
test node::sync::test::replicas_constrain_to ... ok
test node::test::test_command_result ... ok
test node::timestamp::tests::test_timestamp_max ... ok
test node::test::test_user_agent ... ok
test profile::test::canonicalize_home ... ok
test profile::test::test_config ... ok
test rad::tests::test_checkout ... ok
test rad::tests::test_fork ... ok
test serde_ext::test::test_localtime ... ok
test serde_ext::test::test_localtime_ext ... ok
test profile::config::test::schema ... ok
test rad::tests::test_init ... ok
test storage::git::tests::test_references_of ... ok
test storage::git::transport::local::url::test::test_url_parse ... ok
test storage::git::transport::local::url::test::test_url_to_string ... ok
test storage::git::transport::remote::url::test::test_url_parse ... ok
test storage::refs::tests::prop_canonical_roundtrip ... ok
test storage::git::tests::test_sign_refs ... ok
test storage::tests::test_storage ... ok
test test::assert::test::assert_with_message ... ok
test test::assert::test::test_assert_no_move ... ok
test test::assert::test::test_assert_panic_0 - should panic ... ok
test test::assert::test::test_assert_panic_1 - should panic ... ok
test test::assert::test::test_assert_panic_2 - should panic ... ok
test test::assert::test::test_assert_succeed ... ok
test test::assert::test::test_panic_message ... ok
test version::test::test_version ... ok
test storage::git::tests::test_remote_refs ... ok
test storage::refs::tests::test_rid_verification ... ok
test identity::doc::test::prop_encode_decode ... ok
test result: ok. 194 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.24s
Running unittests src/lib.rs (target/debug/deps/radicle_cli-8e27271fff707550)
running 14 tests
test commands::rad_patch::review::builder::tests::test_review_comments_basic ... ok
test commands::rad_patch::review::builder::tests::test_review_comments_multiline ... ok
test commands::rad_patch::review::builder::tests::test_review_comments_split_hunk ... ok
test git::pretty_diff::test::test_pretty ... ignored
test commands::rad_patch::review::builder::tests::test_review_comments_before ... ok
test git::unified_diff::test::test_diff_content_encode_decode_content ... ok
test commands::rad_inspect::test::test_tree ... ok
test git::ddiff::tests::diff_encode_decode_ddiff_hunk ... ok
test git::unified_diff::test::test_diff_encode_decode_diff ... ok
test terminal::format::test::test_strip_comments ... ok
test terminal::format::test::test_bytes ... ok
test terminal::patch::test::test_edit_display_message ... ok
test terminal::patch::test::test_create_display_message ... ok
test terminal::patch::test::test_update_display_message ... ok
test result: ok. 13 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running unittests src/main.rs (target/debug/deps/rad-2cba7ed2a2446da4)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/commands.rs (target/debug/deps/commands-9cad607d659d1b1a)
running 97 tests
test framework_home ... ok
test git_push_amend ... ok
test git_push_and_fetch ... ok
test git_push_diverge ... ok
test rad_auth ... ok
test rad_auth_errors ... ok
test rad_block ... ok
test rad_checkout ... ok
test git_push_rollback ... ok
test git_tag ... ok
test git_push_converge ... ok
test rad_clone ... ok
test rad_clean ... ok
test rad_clone_connect ... ok
test rad_clone_unknown ... ok
test rad_cob_log ... ok
test rad_clone_directory ... ok
test rad_cob_multiset ... ok
test rad_clone_all ... ok
test rad_cob_migrate ... ok
test rad_clone_partial_fail ... ok
test rad_cob_show ... ok
test rad_cob_update ... ok
test rad_config ... ok
test rad_cob_update_identity ... ok
test rad_diff ... ok
test rad_id_collaboration ... ignored, slow
test rad_id ... ok
test rad_id_conflict ... ok
test rad_id_private ... ok
test rad_id_multi_delegate ... ok
test rad_id_threshold ... ok
test rad_id_unknown_field ... ok
test rad_id_update_delete_field ... ok
test rad_id_threshold_soft_fork ... ok
test rad_init ... ignored, part of many other tests
test rad_init_existing ... ok
test rad_init_no_git ... ok
test rad_init_no_seed ... ok
test rad_init_private ... ok
test rad_init_private_clone ... ok
test rad_inbox ... ok
test rad_init_private_no_seed ... ok
test rad_fetch ... ok
test rad_fork ... ok
test rad_init_private_clone_seed ... ok
test rad_init_private_seed ... ok
test rad_init_sync_not_connected ... ok
test rad_init_sync_preferred ... ok
test rad_init_with_existing_remote ... ok
test rad_inspect ... ok
test rad_issue ... ok
test rad_merge_after_update ... ok
test rad_merge_no_ff ... ok
test rad_merge_via_push ... ok
test rad_node_connect ... ok
test rad_node_connect_without_address ... ok
test rad_node ... ok
test rad_patch ... ok
test rad_patch_ahead_behind ... ok
test rad_patch_change_base ... ok
test rad_patch_checkout ... ok
test rad_patch_checkout_revision ... ok
test rad_patch_checkout_force ... ok
test rad_patch_detached_head ... ok
test rad_init_sync_timeout ... ok
test rad_init_sync_and_clone ... ok
test rad_patch_diff ... ok
test rad_patch_draft ... ok
test rad_patch_edit ... ok
test rad_patch_fetch_2 ... ok
test rad_patch_merge_draft ... ok
test rad_patch_fetch_1 ... ok
test rad_patch_delete ... ok
test rad_patch_revert_merge ... ok
test rad_patch_open_explore ... ok
test rad_patch_update ... ok
test rad_publish ... ok
test rad_patch_via_push ... ok
test rad_review_by_hunk ... ok
test rad_seed_and_follow ... ok
test rad_remote ... ok
test rad_self ... ok
test rad_seed_many ... ok
test rad_sync_without_node ... ok
test rad_push_and_pull_patches ... ok
test rad_unseed ... ok
test rad_warn_old_nodes ... FAILED
test rad_unseed_many ... ok
test rad_sync ... ok
test rad_watch ... ok
test test_clone_without_seeds ... ok
test test_cob_deletion ... ok
test test_cob_replication ... ok
test rad_workflow ... ok
test rad_patch_pull_update ... ok
test test_replication_via_seed ... ok
failures:
---- rad_warn_old_nodes stdout ----
1752485676 test: Using PATH ["/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/crates/radicle-cli/target/debug", "/usr/local/cargo/bin", "/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin", "/tmp/radicle-DtCKxR/work/alice"]
1752485676 test: rad-warn-old-nodes.md: Running `/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/target/debug/rad` with ["config", "push", "preferredSeeds", "z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@seed.radicle.garden:8776"] in `/tmp/radicle-DtCKxR/work/alice`..
1752485676 test: rad-warn-old-nodes.md: Running `/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/target/debug/rad` with ["config", "push", "node.connect", "z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo@ash.radicle.garden:8776"] in `/tmp/radicle-DtCKxR/work/alice`..
1752485676 test: rad-warn-old-nodes.md: Running `/ca7f7784-0c27-4e51-a3ce-2c57ad8bbc75/w/target/debug/rad` with ["debug"] in `/tmp/radicle-DtCKxR/work/alice`..
thread 'rad_warn_old_nodes' panicked at crates/radicle-cli-test/src/lib.rs:487:36:
--- Expected
++++ actual: stdout
1 1 | {
2 2 | "radExe": "[..]",
3 3 | "radVersion": "[..]",
4 - "radicleNodeVersion": "radicle-node [..]",
5 - "gitRemoteRadVersion": "git-remote-rad [..]",
6 - "gitVersion": "git version [..]",
7 - "sshVersion": "[..]",
8 - "gitHead": "[..]",
4 + "radicleNodeVersion": "<unknown>",
5 + "gitRemoteRadVersion": "git-remote-rad pre-release (34939253)",
6 + "gitVersion": "git version 2.39.5",
7 + "sshVersion": "OpenSSH_9.2p1 Debian-2+deb12u6, OpenSSL 3.0.16 11 Feb 2025",
8 + "gitHead": "34939253",
9 9 | "log": {
10 10 | "filename": "[..]",
11 11 | "exists": false,
12 12 | "len": null
13 13 | },
⋮
29 29 | "warnings": [
30 30 | "Value of configuration option `node.connect` at index 0 mentions node with address 'ash.radicle.garden:8776', which has been renamed to 'rosa.radicle.xyz:8776'. Please update your configuration.",
31 31 | "Value of configuration option `preferred_seeds` at index 0 mentions node with address 'seed.radicle.garden:8776', which has been renamed to 'iris.radicle.xyz:8776'. Please update your configuration."
32 32 | ]
33 33 | }
Exit status: 0
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
rad_warn_old_nodes
test result: FAILED. 94 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 71.45s
error: test failed, to rerun pass `-p radicle-cli --test commands`
Running unittests src/lib.rs (target/debug/deps/radicle_cli_test-97968ad523fd49da)
running 3 tests
test tests::test_parse ... ok
test tests::test_run ... ok
test tests::test_example_spaced_brackets ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running unittests src/lib.rs (target/debug/deps/radicle_cob-65db1d3d21109e11)
running 8 tests
test object::tests::test_serde ... ok
test tests::invalid_parse_refstr ... ok
test tests::parse_refstr ... ok
test tests::list_cobs ... ok
test tests::roundtrip ... ok
test tests::traverse_cobs ... ok
test type_name::test::valid_typenames ... ok
test tests::update_cob ... ok
test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s
Running unittests src/lib.rs (target/debug/deps/radicle_crypto-0912e5a263b454ad)
running 12 tests
test ssh::fmt::test::test_key ... ok
test ssh::fmt::test::test_fingerprint ... ok
test ssh::keystore::tests::test_init_no_passphrase ... ok
test ssh::test::test_agent_encoding_remove ... ok
test ssh::test::test_agent_encoding_sign ... ok
test ssh::test::prop_encode_decode_sk ... ok
test tests::prop_encode_decode ... ok
test tests::test_e25519_dh ... ok
test tests::test_encode_decode ... ok
test tests::prop_key_equality ... ok
test ssh::keystore::tests::test_signer ... ok
test ssh::keystore::tests::test_init_passphrase ... ok
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.84s
Running unittests src/lib.rs (target/debug/deps/radicle_dag-20ca1aca3d76c348)
running 20 tests
test tests::test_complex ... ok
test tests::test_cycle ... ok
test tests::test_contains ... ok
test tests::test_dependencies ... ok
test tests::test_fold_diamond ... ok
test tests::test_diamond ... ok
test tests::test_fold_multiple_roots ... ok
test tests::test_fold_sorting_1 ... ok
test tests::test_fold_reject ... ok
test tests::test_fold_sorting_2 ... ok
test tests::test_len ... ok
test tests::test_get ... ok
test tests::test_merge_1 ... ok
test tests::test_is_empty ... ok
test tests::test_prune_1 ... ok
test tests::test_merge_2 ... ok
test tests::test_prune_2 ... ok
test tests::test_remove ... ok
test tests::test_prune_by_sorting ... ok
test tests::test_siblings ... ok
test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_fetch-b6e0a9890ea528d3)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_node-174ccb3a689413a0)
running 113 tests
test deserializer::test::test_decode_next ... ok
test deserializer::test::prop_decode_next ... ok
test service::filter::test::test_parameters ... ok
test deserializer::test::test_unparsed ... ok
test control::tests::test_control_socket ... ok
test service::limiter::test::test_limitter_different_rates ... ok
test service::limiter::test::test_limitter_multi ... ok
test service::gossip::store::test::test_announced ... ok
test service::limiter::test::test_limitter_refill ... ok
test service::filter::test::test_sizes ... ok
test service::message::tests::test_inventory_limit ... ok
test service::message::tests::test_ref_remote_limit ... ok
test control::tests::test_seed_unseed ... ok
test service::message::tests::prop_refs_announcement_signing ... ok
test tests::e2e::missing_default_branch ... ok
test tests::e2e::missing_delegate_default_branch ... ok
test tests::e2e::test_background_foreground_fetch ... ok
test tests::e2e::test_catchup_on_refs_announcements ... ok
test tests::e2e::test_channel_reader_limit ... ok
test tests::e2e::test_clone ... ok
test service::message::tests::test_node_announcement_validate ... ok
test tests::e2e::test_dont_fetch_owned_refs ... ok
test tests::e2e::test_connection_crossing ... ok
test tests::e2e::test_fetch_followed_remotes ... ok
test tests::e2e::test_fetch_preserve_owned_refs ... ok
test tests::e2e::test_concurrent_fetches ... ok
test tests::e2e::test_fetch_unseeded ... ok
test tests::e2e::test_fetch_up_to_date ... ok
test tests::e2e::test_inventory_sync_basic ... ok
test tests::e2e::test_large_fetch ... ok
test tests::e2e::test_migrated_clone ... ok
test tests::e2e::test_missing_remote ... ok
test tests::e2e::test_multiple_offline_inits ... ok
test tests::e2e::test_non_fastforward_sigrefs ... ok
test tests::e2e::test_outdated_delegate_sigrefs ... ok
test tests::e2e::test_outdated_sigrefs ... ok
test tests::e2e::test_replication ... ok
test tests::e2e::test_inventory_sync_bridge ... ok
test tests::e2e::test_replication_invalid ... ok
test tests::e2e::test_inventory_sync_ring ... ok
test tests::e2e::test_replication_ref_in_sigrefs ... ok
test tests::e2e::test_inventory_sync_star ... ok
test tests::test_announcement_rebroadcast ... ok
test tests::test_announcement_rebroadcast_duplicates ... ok
test tests::test_announcement_relay ... ok
test tests::test_announcement_rebroadcast_timestamp_filtered ... ok
test tests::test_connection_kept_alive ... ok
test tests::test_fetch_missing_inventory_on_gossip ... ok
test tests::test_disconnecting_unresponsive_peer ... ok
test tests::test_fetch_missing_inventory_on_schedule ... ok
test tests::test_inbound_connection ... ok
test tests::test_inventory_decode ... ok
test tests::test_init_and_seed ... ok
test tests::test_inventory_relay ... ok
test tests::test_inventory_relay_bad_timestamp ... ok
test tests::test_inventory_sync ... ok
test tests::test_maintain_connections ... ok
test tests::test_maintain_connections_failed_attempt ... ok
test tests::test_inventory_pruning ... ok
test tests::test_maintain_connections_transient ... ok
test tests::test_outbound_connection ... ok
test tests::test_persistent_peer_connect ... ok
test tests::test_persistent_peer_reconnect_success ... ok
test tests::test_persistent_peer_reconnect_attempt ... ok
test tests::test_ping_response ... ok
test tests::test_queued_fetch_from_ann_same_rid ... ok
test tests::test_queued_fetch_from_command_same_rid ... ok
test tests::test_queued_fetch_max_capacity ... ok
test tests::test_redundant_connect ... ok
test tests::test_refs_announcement_followed ... ok
test tests::test_refs_announcement_fetch_trusted_no_inventory ... ok
test tests::test_refs_announcement_no_subscribe ... ok
test tests::test_refs_announcement_offline ... ok
test tests::test_refs_announcement_relay_private ... ok
test tests::test_refs_synced_event ... ok
test tests::test_refs_announcement_relay_public ... ok
test tests::test_seeding ... ok
test wire::frame::test::test_stream_id ... ok
test wire::message::tests::prop_addr ... ok
test tests::test_seed_repo_subscribe ... ok
test wire::message::tests::prop_message_encode_decode ... ok
test wire::message::tests::prop_zero_bytes_encode_decode ... ok
test wire::message::tests::test_inv_ann_max_size ... ok
test wire::message::tests::test_node_ann_max_size ... ok
test wire::message::tests::test_pingpong_encode_max_size ... ok
test wire::message::tests::test_pingpong_encode_size_overflow ... ok
test tests::prop_inventory_exchange_dense ... ok
test wire::protocol::test::test_inventory_ann_with_extension ... ok
test wire::protocol::test::test_pong_message_with_extension ... ok
test wire::tests::prop_filter ... ok
test wire::tests::prop_id ... ok
test wire::tests::prop_oid ... ok
test wire::message::tests::prop_message_decoder ... ok
test wire::tests::prop_refs ... ok
test wire::tests::prop_signature ... ok
test wire::message::tests::test_refs_ann_max_size ... ok
test wire::tests::prop_signed_refs ... ok
test wire::tests::prop_string ... ok
test wire::tests::prop_tuple ... ok
test wire::tests::prop_u32 ... ok
test wire::tests::prop_u16 ... ok
test wire::tests::prop_u64 ... ok
test wire::tests::prop_u8 ... ok
test wire::tests::test_alias ... ok
test wire::tests::prop_pubkey ... ok
test wire::tests::test_filter_invalid ... ok
test wire::tests::test_string ... ok
test wire::varint::test::prop_encode_decode ... ok
test wire::varint::test::test_encode_overflow - should panic ... ok
test wire::varint::test::test_encoding ... ok
test wire::tests::test_bounded_vec_limit ... ok
test wire::tests::prop_vec ... ok
test tests::test_announcement_message_amplification ... ok
test result: ok. 113 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 18.05s
Running unittests src/main.rs (target/debug/deps/radicle_node-56bcc3f85ccb1baa)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_remote_helper-288399db19c58512)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/git-remote-rad.rs (target/debug/deps/git_remote_rad-f6c423c733095f75)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/main.rs (target/debug/deps/radicle_schemars-c8c53e2870f2dbc4)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_signals-ad41f42c3d3e47ce)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_ssh-02e22359ef9bf046)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_systemd-28e02dc067eac38d)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_term-8690075601e9065b)
running 20 tests
test ansi::tests::colors_disabled ... ok
test ansi::tests::colors_enabled ... ok
test cell::test::test_width ... ok
test element::test::test_truncate ... ok
test table::test::test_table ... ok
test ansi::tests::wrapping ... ok
test element::test::test_width ... ok
test table::test::test_table_border_maximized ... ok
test table::test::test_table_border ... ok
test table::test::test_table_truncate ... ok
test table::test::test_table_border_truncated ... ok
test table::test::test_truncate ... ok
test table::test::test_table_unicode_truncate ... ok
test table::test::test_table_unicode ... ok
test textarea::test::test_wrapping_code_block ... ok
test textarea::test::test_wrapping ... ok
test vstack::test::test_vstack ... ok
test vstack::test::test_vstack_maximize ... ok
test textarea::test::test_wrapping_fenced_block ... ok
test textarea::test::test_wrapping_paragraphs ... ok
test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle
running 1 test
test crates/radicle/src/cob/patch/encoding/review.rs - cob::patch::encoding::review::Review (line 23) - compile ... FAILED
failures:
---- crates/radicle/src/cob/patch/encoding/review.rs - cob::patch::encoding::review::Review (line 23) stdout ----
error: comparison operators cannot be chained
--> crates/radicle/src/cob/patch/encoding/review.rs:24:5
|
3 | From<Review> for patch::Review
| ^ ^
|
= help: use `::<...>` instead of `<...>` to specify lifetime, type, or const arguments
= help: or use `(...)` if you meant to specify fn arguments
error: aborting due to 1 previous error
Couldn't compile the test.
failures:
crates/radicle/src/cob/patch/encoding/review.rs - cob::patch::encoding::review::Review (line 23)
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
error: doctest failed, to rerun pass `-p radicle --doc`
Doc-tests radicle_cli
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_cli_test
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_cob
running 1 test
test crates/radicle-cob/src/backend/git/stable.rs - backend::git::stable::with_advanced_timestamp (line 56) ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_crypto
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_dag
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_fetch
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_node
running 6 tests
test crates/radicle-node/src/bounded.rs - bounded::BoundedVec<T,N>::max (line 96) ... ok
test crates/radicle-node/src/bounded.rs - bounded::BoundedVec<T,N>::push (line 122) ... ok
test crates/radicle-node/src/bounded.rs - bounded::BoundedVec<T,N>::collect_from (line 30) ... ok
test crates/radicle-node/src/bounded.rs - bounded::BoundedVec<T,N>::truncate (line 50) ... ok
test crates/radicle-node/src/bounded.rs - bounded::BoundedVec<T,N>::with_capacity (line 66) ... ok
test crates/radicle-node/src/bounded.rs - bounded::BoundedVec<T,N>::unbound (line 149) ... ok
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.49s
Doc-tests radicle_remote_helper
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_signals
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_ssh
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_systemd
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_term
running 1 test
test crates/radicle-term/src/table.rs - table (line 4) ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.48s
error: 2 targets failed:
`-p radicle-cli --test commands`
`-p radicle --doc`
Exit code: 101
{
"response": "finished",
"result": "failure"
}