rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood4919ad36064a99e4be9e6efdd1e7d0352d3e9b65
{
"request": "trigger",
"version": 1,
"event_type": "patch",
"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"
]
},
"action": "Updated",
"patch": {
"id": "ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"title": "I2P Support",
"state": {
"status": "draft",
"conflicts": []
},
"before": "c06b00e330d82c8b8221cc8f8776c883208d159f",
"after": "4919ad36064a99e4be9e6efdd1e7d0352d3e9b65",
"commits": [
"4919ad36064a99e4be9e6efdd1e7d0352d3e9b65",
"550d153bbccb827c04b296512e0f8a8e24971873",
"3df9fc62b43d1fe7d5ae297d580bc5a29b4d62ea",
"d63718ac30e9f3ceb2224565e9f04f3a2919f74c"
],
"target": "c06b00e330d82c8b8221cc8f8776c883208d159f",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "",
"base": "c06b00e330d82c8b8221cc8f8776c883208d159f",
"oid": "f74bb2262ab9028c5c094f7fbec53b81a757afa5",
"timestamp": 1771118763
},
{
"id": "915b75d70e90138154227d52a7fe22cfec2287dd",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Make this build on top of newer `cyphernet`.",
"base": "c06b00e330d82c8b8221cc8f8776c883208d159f",
"oid": "fb12068ad0f8d59ef07d36fc40d8964a6aa76d2e",
"timestamp": 1771156513
},
{
"id": "cacb8ba70d876997f8477558b16356c9b968c9d6",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Improve handling of `AddressConfig`.",
"base": "c06b00e330d82c8b8221cc8f8776c883208d159f",
"oid": "f4d0dbcd0d69f0d520f4414237541b909f448ac8",
"timestamp": 1771163789
},
{
"id": "68c35a4f9142fe2641fde225ba7ff960317ce12d",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Fix",
"base": "c06b00e330d82c8b8221cc8f8776c883208d159f",
"oid": "4919ad36064a99e4be9e6efdd1e7d0352d3e9b65",
"timestamp": 1771201639
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "a35f7e74-3dff-44cf-af43-d8ba5b587e38"
},
"info_url": "https://cci.rad.levitte.org//a35f7e74-3dff-44cf-af43-d8ba5b587e38.html"
}
Started at: 2026-02-16 01:27:44.691886+01:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW added
✓ Remote-tracking branch cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW/master created for z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ Remote erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz added
✓ Remote-tracking branch erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz/master created for z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz
✓ Remote lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz added
✓ Remote-tracking branch lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz/master created for z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz
✓ Repository successfully cloned under /opt/radcis/ci.rad.levitte.org/cci/state/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 138 issues · 34 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25
✓ Switched to branch patch/ec8bf7a at revision 68c35a4
✓ Branch patch/ec8bf7a setup to track rad/patches/ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 4919ad36064a99e4be9e6efdd1e7d0352d3e9b65
HEAD is now at 4919ad36 I2P Support
Exit code: 0
$ rad patch show ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25 -p
╭───────────────────────────────────────────────────────────────────────╮
│ Title I2P Support │
│ Patch ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25 │
│ Author lorenz z6MkkPv…WX5sTEz │
│ Head 4919ad36064a99e4be9e6efdd1e7d0352d3e9b65 │
│ Base c06b00e330d82c8b8221cc8f8776c883208d159f │
│ Branches patch/ec8bf7a │
│ Commits ahead 4, behind 0 │
│ Status draft │
├───────────────────────────────────────────────────────────────────────┤
│ 4919ad3 I2P Support │
│ 550d153 Use development version of `cyphernet` │
│ 3df9fc6 node: Explicit default for `AddressConfig` │
│ d63718a cargo: Add feature for Tor support │
├───────────────────────────────────────────────────────────────────────┤
│ ● Revision ec8bf7a @ f74bb22 by lorenz z6MkkPv…WX5sTEz 23 hours ago │
│ ↑ Revision 915b75d @ fb12068 by lorenz z6MkkPv…WX5sTEz 12 hours ago │
│ ↑ Revision cacb8ba @ f4d0dbc by lorenz z6MkkPv…WX5sTEz 10 hours ago │
│ ↑ Revision 68c35a4 @ 4919ad3 by lorenz z6MkkPv…WX5sTEz 27 seconds ago │
╰───────────────────────────────────────────────────────────────────────╯
commit 4919ad36064a99e4be9e6efdd1e7d0352d3e9b65
Author: Lorenz Leutgeb <lorenz.leutgeb@radicle.xyz>
Date: Sun Feb 15 02:13:04 2026 +0100
I2P Support
Co-authored-by: ps
diff --git a/Cargo.lock b/Cargo.lock
index 9517644b8..96c3e58a0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -673,7 +673,7 @@ dependencies = [
[[package]]
name = "cypheraddr"
version = "0.4.0"
-source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
+source = "git+https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedcac9f1075d516ce1f0129f4aa9b73ee81e"
dependencies = [
"amplify",
"base32",
@@ -684,7 +684,7 @@ dependencies = [
[[package]]
name = "cyphergraphy"
version = "0.3.0"
-source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
+source = "git+https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedcac9f1075d516ce1f0129f4aa9b73ee81e"
dependencies = [
"amplify",
"ec25519",
@@ -694,7 +694,7 @@ dependencies = [
[[package]]
name = "cyphernet"
version = "0.5.2"
-source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
+source = "git+https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedcac9f1075d516ce1f0129f4aa9b73ee81e"
dependencies = [
"cypheraddr",
"cyphergraphy",
@@ -2289,7 +2289,7 @@ dependencies = [
[[package]]
name = "noise-framework"
version = "0.4.0"
-source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
+source = "git+https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedcac9f1075d516ce1f0129f4aa9b73ee81e"
dependencies = [
"amplify",
"chacha20poly1305",
@@ -3794,7 +3794,7 @@ dependencies = [
[[package]]
name = "socks5-client"
version = "0.4.1"
-source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
+source = "git+https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedcac9f1075d516ce1f0129f4aa9b73ee81e"
dependencies = [
"amplify",
"cypheraddr",
diff --git a/Cargo.toml b/Cargo.toml
index 59f26e16d..d90cc16d4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -98,4 +98,5 @@ debug = true
incremental = false
[patch.crates-io]
-cyphernet.git = "https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4"
+cyphernet = { git = "https://github.com/lorenzleutgeb/cyphernet.rs.git", branch = "push-ooltwtzkpvlk" }
+cypheraddr = { git = "https://github.com/lorenzleutgeb/cyphernet.rs.git", branch = "push-ooltwtzkpvlk" }
diff --git a/crates/radicle-cli/Cargo.toml b/crates/radicle-cli/Cargo.toml
index 5afd11ef6..adc8343f3 100644
--- a/crates/radicle-cli/Cargo.toml
+++ b/crates/radicle-cli/Cargo.toml
@@ -14,7 +14,8 @@ name = "rad"
path = "src/main.rs"
[features]
-default = ["tor"]
+default = ["i2p", "tor"]
+i2p = ["radicle/i2p"]
tor = ["radicle/tor"]
[dependencies]
diff --git a/crates/radicle-cli/src/terminal/format.rs b/crates/radicle-cli/src/terminal/format.rs
index b229b9832..4f271be1e 100644
--- a/crates/radicle-cli/src/terminal/format.rs
+++ b/crates/radicle-cli/src/terminal/format.rs
@@ -47,6 +47,11 @@ pub fn addr_compact(address: &Address) -> Paint<String> {
.collect::<String>();
format!("{start}…{end}")
}
+ #[cfg(feature = "i2p")]
+ HostName::I2p(i2p) => {
+ // TODO: Base32 addresses can be shortened like onion addresses.
+ i2p.to_string()
+ }
_ => unreachable!(),
};
diff --git a/crates/radicle-node/Cargo.toml b/crates/radicle-node/Cargo.toml
index 0a57c94d8..1a6d9fcfa 100644
--- a/crates/radicle-node/Cargo.toml
+++ b/crates/radicle-node/Cargo.toml
@@ -10,7 +10,8 @@ build = "build.rs"
rust-version.workspace = true
[features]
-default = ["backtrace", "systemd", "structured-logger", "socket2", "tor"]
+default = ["backtrace", "i2p", "systemd", "structured-logger", "socket2", "tor"]
+i2p = ["cyphernet/i2p", "radicle/i2p", "radicle-protocol/i2p"]
systemd = ["dep:radicle-systemd"]
test = ["radicle/test", "radicle-crypto/test", "radicle-crypto/cyphernet", "radicle-protocol/test", "qcheck", "snapbox"]
tor = ["cyphernet/tor", "radicle/tor", "radicle-protocol/tor"]
diff --git a/crates/radicle-node/src/wire.rs b/crates/radicle-node/src/wire.rs
index 31ef46226..7c6714094 100644
--- a/crates/radicle-node/src/wire.rs
+++ b/crates/radicle-node/src/wire.rs
@@ -19,7 +19,7 @@ use radicle::node::device::Device;
use radicle::collections::{RandomMap, RandomSet};
use radicle::crypto;
-#[cfg(feature = "tor")]
+#[cfg(any(feature = "tor", feature = "i2p"))]
use radicle::node::config::AddressConfig;
use radicle::node::Link;
use radicle::node::NodeId;
@@ -1084,6 +1084,30 @@ pub fn dial<G: Ecdh<Pk = NodeId>>(
signer: G,
config: &radicle::node::Config,
) -> io::Result<WireSession<G>> {
+ #[cfg(any(feature = "tor", feature = "i2p"))]
+ fn proxy_or_forward<H: std::fmt::Display>(
+ config: &AddressConfig,
+ global_proxy: Option<net::SocketAddr>,
+ host: H,
+ port: u16,
+ ) -> io::Result<NetAddr<InetHost>> {
+ match config {
+ // In proxy mode, simply use the configured proxy address.
+ // This takes precedence over any global proxy.
+ AddressConfig::Proxy { address } => Ok((*address).into()),
+ // In "forward" mode, if a global proxy is set, we use that, otherwise
+ // we treat the address as a regular DNS name.
+ AddressConfig::Forward => Ok(global_proxy
+ .map(Into::into)
+ .unwrap_or_else(|| NetAddr::new(InetHost::Dns(host.to_string()), port))),
+ // If address type support isn't configured, refuse to connect.
+ AddressConfig::Drop => Err(io::Error::new(
+ io::ErrorKind::Unsupported,
+ "no configuration found for address type",
+ )),
+ }
+ }
+
// Determine what address to establish a TCP connection with, given the remote peer
// address and our node configuration.
let inet_addr: NetAddr<InetHost> = match (&remote_addr.host, config.proxy) {
@@ -1094,27 +1118,11 @@ pub fn dial<G: Ecdh<Pk = NodeId>>(
(HostName::Dns(dns), None) => NetAddr::new(InetHost::Dns(dns.clone()), remote_addr.port),
// For onion addresses, handle with care.
#[cfg(feature = "tor")]
- (HostName::Tor(onion), proxy) => match config.onion {
- // In onion proxy mode, simply use the configured proxy address.
- // This takes precedence over any global proxy.
- AddressConfig::Proxy { address } => address.into(),
- // In "forward" mode, if a global proxy is set, we use that, otherwise
- // we treat `.onion` addresses as regular DNS names.
- AddressConfig::Forward => {
- if let Some(proxy) = proxy {
- proxy.into()
- } else {
- NetAddr::new(InetHost::Dns(onion.to_string()), remote_addr.port)
- }
- }
- // If onion address support isn't configured, refuse to connect.
- AddressConfig::Drop => {
- return Err(io::Error::new(
- io::ErrorKind::Unsupported,
- "no configuration found for .onion addresses",
- ));
- }
- },
+ (HostName::Tor(onion), proxy) => {
+ proxy_or_forward(&config.onion, proxy, onion, remote_addr.port)?
+ }
+ #[cfg(feature = "i2p")]
+ (HostName::I2p(i2p), proxy) => proxy_or_forward(&config.i2p, proxy, i2p, remote_addr.port)?,
_ => {
return Err(io::Error::new(
io::ErrorKind::Unsupported,
diff --git a/crates/radicle-protocol/Cargo.toml b/crates/radicle-protocol/Cargo.toml
index 32e97aa33..f9db27aa8 100644
--- a/crates/radicle-protocol/Cargo.toml
+++ b/crates/radicle-protocol/Cargo.toml
@@ -9,6 +9,7 @@ edition.workspace = true
rust-version.workspace = true
[features]
+i2p = ["cyphernet/i2p"]
test = ["radicle/test", "radicle-crypto/test", "radicle-crypto/cyphernet", "qcheck"]
tor = ["cyphernet/tor"]
@@ -36,4 +37,4 @@ paste = "1.0.15"
qcheck = { workspace = true }
qcheck-macros = { workspace = true }
radicle = { workspace = true, features = ["test"] }
-radicle-crypto = { workspace = true, features = ["test", "cyphernet"] }
+radicle-crypto = { workspace = true, features = ["test", "cyphernet"] }
\ No newline at end of file
diff --git a/crates/radicle-protocol/src/service.rs b/crates/radicle-protocol/src/service.rs
index 2b2bfd2f8..c0c19c0de 100644
--- a/crates/radicle-protocol/src/service.rs
+++ b/crates/radicle-protocol/src/service.rs
@@ -2627,11 +2627,18 @@ where
///
/// If the [`Address`] is an `.onion` address and the service supports onion
/// routing then this will return `true`.
+ ///
+ /// # I2P
+ ///
+ /// If the [`Address`] is an I2P address and the service supports I2P
+ /// connections then this will return `true`.
fn is_supported_address(&self, address: &Address) -> bool {
match AddressType::from(address) {
// Only consider onion addresses if configured.
#[cfg(feature = "tor")]
AddressType::Onion => self.config.onion != AddressConfig::Drop,
+ #[cfg(feature = "i2p")]
+ AddressType::I2p => self.config.i2p != AddressConfig::Drop,
AddressType::Dns | AddressType::Ipv4 | AddressType::Ipv6 => true,
}
}
diff --git a/crates/radicle-protocol/src/wire.rs b/crates/radicle-protocol/src/wire.rs
index 15f4fee57..e48f1e99b 100644
--- a/crates/radicle-protocol/src/wire.rs
+++ b/crates/radicle-protocol/src/wire.rs
@@ -15,6 +15,8 @@ use std::string::FromUtf8Error;
use bytes::{Buf, BufMut};
+#[cfg(feature = "i2p")]
+use cyphernet::addr::i2p;
#[cfg(feature = "tor")]
use cyphernet::addr::tor;
@@ -62,6 +64,9 @@ pub enum Invalid {
#[cfg(feature = "tor")]
#[error("invalid onion address: {0}")]
OnionAddr(#[from] tor::OnionAddrDecodeError),
+ #[cfg(feature = "i2p")]
+ #[error("invalid i2p address: {0}")]
+ I2pAddr(#[from] i2p::I2pAddrParseError),
#[error("invalid timestamp: {actual_millis} millis")]
Timestamp { actual_millis: u64 },
@@ -266,6 +271,13 @@ impl Encode for cyphernet::addr::tor::OnionAddrV3 {
}
}
+#[cfg(feature = "i2p")]
+impl Encode for i2p::I2pAddr {
+ fn encode(&self, buf: &mut impl BufMut) {
+ self.to_string().encode(buf)
+ }
+}
+
impl Encode for UserAgent {
fn encode(&self, buf: &mut impl BufMut) {
self.as_ref().encode(buf)
@@ -549,6 +561,16 @@ impl Decode for tor::OnionAddrV3 {
}
}
+#[cfg(feature = "i2p")]
+impl Decode for i2p::I2pAddr {
+ fn decode(buf: &mut impl Buf) -> Result<Self, Error> {
+ let s = String::decode(buf)?;
+ let addr = i2p::I2pAddr::from_str(&s).map_err(Invalid::from)?;
+
+ Ok(addr)
+ }
+}
+
impl Encode for Timestamp {
fn encode(&self, buf: &mut impl BufMut) {
self.deref().encode(buf)
diff --git a/crates/radicle-protocol/src/wire/message.rs b/crates/radicle-protocol/src/wire/message.rs
index 929908a8f..fa259c5bd 100644
--- a/crates/radicle-protocol/src/wire/message.rs
+++ b/crates/radicle-protocol/src/wire/message.rs
@@ -2,6 +2,8 @@ use std::{mem, net};
use bytes::Buf;
use bytes::BufMut;
+#[cfg(feature = "i2p")]
+use cyphernet::addr::i2p;
#[cfg(feature = "tor")]
use cyphernet::addr::tor;
use cyphernet::addr::{HostName, NetAddr};
@@ -83,6 +85,8 @@ pub enum AddressType {
Dns = 3,
#[cfg(feature = "tor")]
Onion = 4,
+ #[cfg(feature = "i2p")]
+ I2p = 5,
}
impl From<AddressType> for u8 {
@@ -99,6 +103,8 @@ impl From<&Address> for AddressType {
HostName::Dns(_) => AddressType::Dns,
#[cfg(feature = "tor")]
HostName::Tor(_) => AddressType::Onion,
+ #[cfg(feature = "i2p")]
+ HostName::I2p(_) => AddressType::I2p,
_ => todo!(), // FIXME(cloudhead): Maxim will remove `non-exhaustive`
}
}
@@ -114,6 +120,8 @@ impl TryFrom<u8> for AddressType {
3 => Ok(AddressType::Dns),
#[cfg(feature = "tor")]
4 => Ok(AddressType::Onion),
+ #[cfg(feature = "i2p")]
+ 5 => Ok(AddressType::I2p),
_ => Err(other),
}
}
@@ -348,7 +356,7 @@ impl wire::Decode for Message {
impl wire::Encode for Address {
fn encode(&self, buf: &mut impl BufMut) {
- match self.host {
+ match &self.host {
HostName::Ip(net::IpAddr::V4(ip)) => {
u8::from(AddressType::Ipv4).encode(buf);
ip.octets().encode(buf);
@@ -366,6 +374,11 @@ impl wire::Encode for Address {
u8::from(AddressType::Onion).encode(buf);
addr.encode(buf);
}
+ #[cfg(feature = "i2p")]
+ HostName::I2p(addr) => {
+ u8::from(AddressType::I2p).encode(buf);
+ addr.encode(buf);
+ }
_ => {
unimplemented!(
"Encoding not defined for addresses of the same type as the following: {:?}",
@@ -405,6 +418,12 @@ impl wire::Decode for Address {
HostName::Tor(onion)
}
+ #[cfg(feature = "i2p")]
+ Ok(AddressType::I2p) => {
+ let i2p: i2p::I2pAddr = wire::Decode::decode(buf)?;
+
+ HostName::I2p(i2p)
+ }
Err(other) => return Err(wire::Invalid::AddressType { actual: other }.into()),
};
let port = u16::decode(buf)?;
diff --git a/crates/radicle/Cargo.toml b/crates/radicle/Cargo.toml
index c26b282cf..8040cadeb 100644
--- a/crates/radicle/Cargo.toml
+++ b/crates/radicle/Cargo.toml
@@ -11,6 +11,7 @@ rust-version.workspace = true
[features]
default = []
+i2p = ["cyphernet/i2p"]
test = ["tempfile", "qcheck", "radicle-crypto/test", "radicle-cob/test"]
logger = ["colored", "chrono"]
qcheck = [
diff --git a/crates/radicle/src/node.rs b/crates/radicle/src/node.rs
index 68c1d3dd0..54b3b28f1 100644
--- a/crates/radicle/src/node.rs
+++ b/crates/radicle/src/node.rs
@@ -428,8 +428,8 @@ impl TryFrom<&sqlite::Value> for Alias {
feature = "schemars",
derive(schemars::JsonSchema),
schemars(description = "\
- An IP address, or a DNS name, or a Tor onion name, followed by the symbol ':', \
- followed by a TCP port number.\
+ An IP address, or a DNS name, or a Tor onion name, or I2P address,
+ followed by the symbol ':', followed by a TCP port number.\
")
)]
pub struct Address(
@@ -439,6 +439,7 @@ pub struct Address(
regex(pattern = r"^.+:((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$"),
extend("examples" = [
"xmrhfasfg5suueegrnc4gsgyi2tyclcy5oz7f5drnrodmdtob6t2ioyd.onion:8776",
+ "f2atcc7udeub5kh4nkljtjwyk7ikjviorufzgwnfwhkphljl3vhq.b32.i2p:8776",
"seed.example.com:8776",
"192.0.2.0:31337",
]),
@@ -485,6 +486,15 @@ impl Address {
}
}
+ /// Returns `true` if the [`HostName`] is an I2P address.
+ #[cfg(feature = "i2p")]
+ pub fn is_i2p(&self) -> bool {
+ match self.0.host {
+ HostName::I2p(_) => true,
+ _ => false,
+ }
+ }
+
/// Return the port number of the [`Address`].
pub fn port(&self) -> u16 {
self.0.port
diff --git a/crates/radicle/src/node/address.rs b/crates/radicle/src/node/address.rs
index 92a0227ca..9f3df8fc7 100644
--- a/crates/radicle/src/node/address.rs
+++ b/crates/radicle/src/node/address.rs
@@ -203,6 +203,8 @@ pub enum AddressType {
Dns = 3,
#[cfg(feature = "tor")]
Onion = 4,
+ #[cfg(feature = "i2p")]
+ I2p = 5,
}
impl From<AddressType> for u8 {
@@ -219,6 +221,8 @@ impl From<&Address> for AddressType {
HostName::Dns(_) => AddressType::Dns,
#[cfg(feature = "tor")]
HostName::Tor(_) => AddressType::Onion,
+ #[cfg(feature = "i2p")]
+ HostName::I2p(_) => AddressType::I2p,
_ => todo!(), // FIXME(cloudhead): Maxim will remove `non-exhaustive`
}
}
@@ -234,6 +238,8 @@ impl TryFrom<u8> for AddressType {
3 => Ok(AddressType::Dns),
#[cfg(feature = "tor")]
4 => Ok(AddressType::Onion),
+ #[cfg(feature = "i2p")]
+ 5 => Ok(AddressType::I2p),
_ => Err(other),
}
}
diff --git a/crates/radicle/src/node/address/store.rs b/crates/radicle/src/node/address/store.rs
index 43b124026..135a9dcfa 100644
--- a/crates/radicle/src/node/address/store.rs
+++ b/crates/radicle/src/node/address/store.rs
@@ -537,6 +537,8 @@ impl TryFrom<&sql::Value> for AddressType {
"dns" => Ok(AddressType::Dns),
#[cfg(feature = "tor")]
"onion" => Ok(AddressType::Onion),
+ #[cfg(feature = "i2p")]
+ "i2p" => Ok(AddressType::I2p),
_ => Err(err),
},
_ => Err(err),
@@ -552,6 +554,8 @@ impl sql::BindableWithIndex for AddressType {
Self::Dns => "dns".bind(stmt, i),
#[cfg(feature = "tor")]
Self::Onion => "onion".bind(stmt, i),
+ #[cfg(feature = "i2p")]
+ Self::I2p => "i2p".bind(stmt, i),
}
}
}
diff --git a/crates/radicle/src/node/config.rs b/crates/radicle/src/node/config.rs
index 20f32e049..dd1cb4aeb 100644
--- a/crates/radicle/src/node/config.rs
+++ b/crates/radicle/src/node/config.rs
@@ -275,7 +275,7 @@ pub struct RateLimits {
schemars(description = "\
A node address to connect to. Format: An Ed25519 public key in multibase encoding, \
followed by the symbol '@', followed by an IP address, or a DNS name, or a Tor onion \
- name, followed by the symbol ':', followed by a TCP port number.\
+ name, or an I2P address, followed by the symbol ':', followed by a TCP port number.\
")
)]
pub struct ConnectAddress(
@@ -286,6 +286,7 @@ pub struct ConnectAddress(
extend("examples" = [
"z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@rosa.radicle.xyz:8776",
"z6MkvUJtYD9dHDJfpevWRT98mzDDpdAtmUjwyDSkyqksUr7C@xmrhfasfg5suueegrnc4gsgyi2tyclcy5oz7f5drnrodmdtob6t2ioyd.onion:8776",
+ "z6Mkvky2mnSYCTUMKRdAUoZXBXLLKtnWEkWeYQcGjjnmobAU@f2atcc7udeub5kh4nkljtjwyk7ikjviorufzgwnfwhkphljl3vhq.b32.i2p:8776",
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi@seed.example.com:8776",
"z6MkkfM3tPXNPrPevKr3uSiQtHPuwnNhu2yUVjgd2jXVsVz5@192.0.2.0:31337",
]),
@@ -355,7 +356,7 @@ pub enum Relay {
#[derive(Debug, Copy, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", tag = "mode")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
-#[cfg(feature = "tor")]
+#[cfg(any(feature = "tor", feature = "i2p"))]
pub enum AddressConfig {
/// Proxy connections to this address type.
Proxy {
@@ -439,6 +440,10 @@ pub struct Config {
#[cfg(feature = "tor")]
#[serde(default, skip_serializing_if = "crate::serde_ext::is_default")]
pub onion: AddressConfig,
+ /// I2P address config.
+ #[cfg(feature = "i2p")]
+ #[serde(default, skip_serializing_if = "crate::serde_ext::is_default")]
+ pub i2p: AddressConfig,
/// Peer-to-peer network.
#[serde(default)]
pub network: Network,
@@ -489,6 +494,8 @@ impl Config {
proxy: None,
#[cfg(feature = "tor")]
onion: AddressConfig::Drop,
+ #[cfg(feature = "i2p")]
+ i2p: AddressConfig::Drop,
relay: Relay::default(),
limits: Limits::default(),
workers: Workers::default(),
diff --git a/crates/radicle/src/test/arbitrary.rs b/crates/radicle/src/test/arbitrary.rs
index 41a34ce01..9958032c3 100644
--- a/crates/radicle/src/test/arbitrary.rs
+++ b/crates/radicle/src/test/arbitrary.rs
@@ -6,6 +6,8 @@ use std::{iter, net};
use crypto::test::signer::MockSigner;
use crypto::{PublicKey, Unverified};
+#[cfg(feature = "i2p")]
+use cyphernet::addr::i2p::I2pAddr;
#[cfg(feature = "tor")]
use cyphernet::{addr::tor::OnionAddrV3, EcPk};
use qcheck::Arbitrary;
@@ -301,6 +303,30 @@ impl Arbitrary for Address {
);
cyphernet::addr::HostName::Tor(addr)
}
+ #[cfg(feature = "i2p")]
+ AddressType::I2p => {
+ let address = if bool::arbitrary(g) {
+ let mut rng = fastrand::Rng::with_seed(u64::arbitrary(g));
+
+ let name: String = iter::repeat_with(|| rng.alphanumeric()).take(56).collect();
+
+ name + ".b32"
+ } else {
+ g.choose(&["iris.radicle.example", "rosa.radicle.example"])
+ .unwrap()
+ .to_string()
+ };
+
+ let suffix = if bool::arbitrary(g) {
+ ".i2p"
+ } else {
+ ".i2p.alt"
+ };
+
+ let address = address + suffix;
+
+ cyphernet::addr::HostName::I2p(I2pAddr::from_str(&address).unwrap())
+ }
};
Address::from(cyphernet::addr::NetAddr {
commit 550d153bbccb827c04b296512e0f8a8e24971873
Author: Lorenz Leutgeb <lorenz.leutgeb@radicle.xyz>
Date: Sun Feb 15 12:33:59 2026 +0100
Use development version of `cyphernet`
diff --git a/Cargo.lock b/Cargo.lock
index 42d1d3785..9517644b8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -673,8 +673,7 @@ dependencies = [
[[package]]
name = "cypheraddr"
version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba5c54d2ad4ab9941383519471b75d12abc1a7b4779265e233168f2703a730d9"
+source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
dependencies = [
"amplify",
"base32",
@@ -685,8 +684,7 @@ dependencies = [
[[package]]
name = "cyphergraphy"
version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b67c16c8ef5ddcdab57aab83fd8e770540ea3682ccdae09642c63575b0da2184"
+source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
dependencies = [
"amplify",
"ec25519",
@@ -696,8 +694,7 @@ dependencies = [
[[package]]
name = "cyphernet"
version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac949369884a7a1d802cc669821269c707be8cec4d65043382e253733d2e62e1"
+source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
dependencies = [
"cypheraddr",
"cyphergraphy",
@@ -2292,8 +2289,7 @@ dependencies = [
[[package]]
name = "noise-framework"
version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b57e96e713d599dc58755d0e5bb2238908a63e13f624f70c8345fdb7d8b51bae"
+source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
dependencies = [
"amplify",
"chacha20poly1305",
@@ -3798,8 +3794,7 @@ dependencies = [
[[package]]
name = "socks5-client"
version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffc7dcf6fab1d65d82d633006a4cc658d76ce436e01cf1a7c71873c0eeba324c"
+source = "git+https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4#888ee2a3468c8bbfdc868238fd67505401aa0ee4"
dependencies = [
"amplify",
"cypheraddr",
diff --git a/Cargo.toml b/Cargo.toml
index 0946af707..59f26e16d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -96,3 +96,6 @@ clippy.must_use_candidate = "deny"
inherits = "release"
debug = true
incremental = false
+
+[patch.crates-io]
+cyphernet.git = "https://github.com/cyphernet-labs/cyphernet.rs?rev=888ee2a3468c8bbfdc868238fd67505401aa0ee4"
diff --git a/crates/radicle-crypto/src/lib.rs b/crates/radicle-crypto/src/lib.rs
index 7c7c43cb7..f1d7a85a2 100644
--- a/crates/radicle-crypto/src/lib.rs
+++ b/crates/radicle-crypto/src/lib.rs
@@ -172,7 +172,18 @@ impl TryFrom<String> for Signature {
]),
),
)]
-pub struct PublicKey(pub ed25519::PublicKey);
+pub struct PublicKey(pub amplify::Bytes32);
+
+impl PublicKey {
+ /// Verify the signature for a given payload.
+ pub fn verify(
+ &self,
+ payload: impl AsRef<[u8]>,
+ signature: &ed25519::Signature,
+ ) -> Result<(), ed25519::Error> {
+ ed25519::PublicKey::new(self.0.to_byte_array()).verify(payload, signature)
+ }
+}
#[cfg(feature = "cyphernet")]
impl cyphernet::display::MultiDisplay<cyphernet::display::Encoding> for PublicKey {
@@ -186,7 +197,9 @@ impl cyphernet::display::MultiDisplay<cyphernet::display::Encoding> for PublicKe
#[cfg(feature = "ssh")]
impl From<PublicKey> for ssh_key::PublicKey {
fn from(key: PublicKey) -> Self {
- ssh_key::PublicKey::from(ssh_key::public::Ed25519PublicKey(**key))
+ ssh_key::PublicKey::from(ssh_key::public::Ed25519PublicKey(
+ key.deref().to_byte_array(),
+ ))
}
}
@@ -195,24 +208,24 @@ impl cyphernet::EcPk for PublicKey {
const COMPRESSED_LEN: usize = 32;
const CURVE_NAME: &'static str = "Edwards25519";
- type Compressed = [u8; 32];
+ type Compressed = amplify::Bytes32;
fn base_point() -> Self {
unimplemented!()
}
fn to_pk_compressed(&self) -> Self::Compressed {
- *self.0.deref()
+ amplify::Bytes32::from_byte_array(self.deref().to_byte_array())
}
fn from_pk_compressed(pk: Self::Compressed) -> Result<Self, cyphernet::EcPkInvalid> {
- Ok(PublicKey::from(pk))
+ Ok(PublicKey::from(pk.to_byte_array()))
}
fn from_pk_compressed_slice(slice: &[u8]) -> Result<Self, cyphernet::EcPkInvalid> {
ed25519::PublicKey::from_slice(slice)
.map_err(|_| cyphernet::EcPkInvalid::default())
- .map(Self)
+ .map(Self::from)
}
}
@@ -224,7 +237,8 @@ impl SecretKey {
/// Elliptic-curve Diffie-Hellman.
pub fn ecdh(&self, pk: &PublicKey) -> Result<[u8; 32], ed25519::Error> {
let scalar = self.seed().scalar();
- let ge = edwards25519::GeP3::from_bytes_vartime(pk).ok_or(Error::InvalidPublicKey)?;
+ let ge = edwards25519::GeP3::from_bytes_vartime(&pk.deref().to_byte_array())
+ .ok_or(Error::InvalidPublicKey)?;
Ok(edwards25519::ge_scalarmult(&scalar, &ge).to_bytes())
}
@@ -333,13 +347,19 @@ impl fmt::Debug for PublicKey {
impl From<ed25519::PublicKey> for PublicKey {
fn from(other: ed25519::PublicKey) -> Self {
- Self(other)
+ Self(amplify::Bytes32::from_byte_array(*other.deref()))
+ }
+}
+
+impl From<PublicKey> for ed25519::PublicKey {
+ fn from(val: PublicKey) -> Self {
+ ed25519::PublicKey::new(val.0.to_byte_array())
}
}
impl From<[u8; 32]> for PublicKey {
fn from(other: [u8; 32]) -> Self {
- Self(ed25519::PublicKey::new(other))
+ Self(amplify::Bytes32::from_byte_array(other))
}
}
@@ -347,7 +367,7 @@ impl TryFrom<&[u8]> for PublicKey {
type Error = ed25519::Error;
fn try_from(other: &[u8]) -> Result<Self, Self::Error> {
- ed25519::PublicKey::from_slice(other).map(Self)
+ ed25519::PublicKey::from_slice(other).map(Self::from)
}
}
@@ -362,7 +382,7 @@ impl PublicKey {
pub fn to_human(&self) -> String {
let mut buf = [0; 2 + ed25519::PublicKey::BYTES];
buf[..2].copy_from_slice(&Self::MULTICODEC_TYPE);
- buf[2..].copy_from_slice(self.0.deref());
+ buf[2..].copy_from_slice(self.0.to_byte_array().as_slice());
multibase::encode(multibase::Base::Base58Btc, buf)
}
@@ -397,7 +417,7 @@ impl FromStr for PublicKey {
if let Some(bytes) = bytes.strip_prefix(&Self::MULTICODEC_TYPE) {
let key = ed25519::PublicKey::from_slice(bytes)?;
- Ok(Self(key))
+ Ok(key.into())
} else {
Err(PublicKeyError::Multicodec(Self::MULTICODEC_TYPE))
}
@@ -413,7 +433,7 @@ impl TryFrom<String> for PublicKey {
}
impl Deref for PublicKey {
- type Target = ed25519::PublicKey;
+ type Target = amplify::Bytes32;
fn deref(&self) -> &Self::Target {
&self.0
diff --git a/crates/radicle-crypto/src/ssh.rs b/crates/radicle-crypto/src/ssh.rs
index 45259ca56..8837a18c2 100644
--- a/crates/radicle-crypto/src/ssh.rs
+++ b/crates/radicle-crypto/src/ssh.rs
@@ -51,7 +51,9 @@ impl ExtendedSignature {
/// Convert to OpenSSH standard PEM format.
pub fn to_pem(&self) -> Result<String, ExtendedSignatureError> {
ssh_key::SshSig::new(
- ssh_key::public::KeyData::from(ssh_key::public::Ed25519PublicKey(**self.key)),
+ ssh_key::public::KeyData::from(ssh_key::public::Ed25519PublicKey(
+ (*self.key).to_byte_array(),
+ )),
String::from("radicle"),
ssh_key::HashAlg::Sha256,
ssh_key::Signature::new(ssh_key::Algorithm::Ed25519, **self.sig)?,
diff --git a/crates/radicle-crypto/src/ssh/keystore.rs b/crates/radicle-crypto/src/ssh/keystore.rs
index 49d241ece..15007aca7 100644
--- a/crates/radicle-crypto/src/ssh/keystore.rs
+++ b/crates/radicle-crypto/src/ssh/keystore.rs
@@ -335,7 +335,7 @@ impl MemorySigner {
.ok_or_else(|| MemorySignerError::NotFound(public_path.to_path_buf()))?;
secret
- .validate_public_key(&public)
+ .validate_public_key(&public.into())
.map_err(|_| MemorySignerError::KeyMismatch {
secret: keystore.secret_key_path().to_path_buf(),
public: public_path.to_path_buf(),
@@ -348,7 +348,7 @@ impl MemorySigner {
/// the public key from the secret key.
pub fn from_secret(secret: Zeroizing<SecretKey>) -> Self {
Self {
- public: PublicKey(secret.public_key()),
+ public: PublicKey((*secret.public_key()).into()),
secret,
}
}
diff --git a/crates/radicle-crypto/src/test/arbitrary.rs b/crates/radicle-crypto/src/test/arbitrary.rs
index 452253ac6..875733534 100644
--- a/crates/radicle-crypto/src/test/arbitrary.rs
+++ b/crates/radicle-crypto/src/test/arbitrary.rs
@@ -18,6 +18,6 @@ impl Arbitrary for PublicKey {
let seed = Seed::new(bytes);
let keypair = KeyPair::from_seed(seed);
- PublicKey(keypair.pk)
+ keypair.pk.into()
}
}
diff --git a/crates/radicle-node/src/fingerprint.rs b/crates/radicle-node/src/fingerprint.rs
index 11c5c58c6..cd765a939 100644
--- a/crates/radicle-node/src/fingerprint.rs
+++ b/crates/radicle-node/src/fingerprint.rs
@@ -68,7 +68,7 @@ impl Fingerprint {
home: &Home,
secret_key: &impl std::ops::Deref<Target = crypto::SecretKey>,
) -> Result<(), Error> {
- let public_key = crypto::PublicKey(secret_key.deref().public_key());
+ let public_key = secret_key.deref().public_key().into();
let mut file = std::fs::OpenOptions::new()
.create_new(true)
.write(true)
@@ -86,7 +86,7 @@ impl Fingerprint {
&self,
secret_key: &impl std::ops::Deref<Target = crypto::SecretKey>,
) -> FingerprintVerification {
- let public_key = crypto::PublicKey(secret_key.deref().public_key());
+ let public_key = secret_key.deref().public_key().into();
if crypto::ssh::fmt::fingerprint(&public_key) == self.0 {
FingerprintVerification::Match
} else {
diff --git a/crates/radicle-protocol/src/wire.rs b/crates/radicle-protocol/src/wire.rs
index 65e17f4e2..15f4fee57 100644
--- a/crates/radicle-protocol/src/wire.rs
+++ b/crates/radicle-protocol/src/wire.rs
@@ -175,7 +175,7 @@ impl Encode for u64 {
impl Encode for PublicKey {
fn encode(&self, buf: &mut impl BufMut) {
- self.deref().encode(buf)
+ self.deref().to_byte_array().encode(buf)
}
}
diff --git a/crates/radicle/src/test/arbitrary.rs b/crates/radicle/src/test/arbitrary.rs
index 88a9ee590..41a34ce01 100644
--- a/crates/radicle/src/test/arbitrary.rs
+++ b/crates/radicle/src/test/arbitrary.rs
@@ -297,7 +297,7 @@ impl Arbitrary for Address {
AddressType::Onion => {
let pk = PublicKey::arbitrary(g);
let addr = OnionAddrV3::from(
- cyphernet::ed25519::PublicKey::from_pk_compressed(**pk).unwrap(),
+ cyphernet::ed25519::PublicKey::from_pk_compressed(*pk).unwrap(),
);
cyphernet::addr::HostName::Tor(addr)
}
commit 3df9fc62b43d1fe7d5ae297d580bc5a29b4d62ea
Author: Lorenz Leutgeb <lorenz.leutgeb@radicle.xyz>
Date: Sun Feb 15 13:13:04 2026 +0100
node: Explicit default for `AddressConfig`
The intent to drop outgoing connections is modeled as `Option::None`
which is brittle and easy to miss.
Extend `enum AddressConfig` with a variant that is more explicit.
diff --git a/crates/radicle-node/src/wire.rs b/crates/radicle-node/src/wire.rs
index 178073d68..31ef46226 100644
--- a/crates/radicle-node/src/wire.rs
+++ b/crates/radicle-node/src/wire.rs
@@ -1097,10 +1097,10 @@ pub fn dial<G: Ecdh<Pk = NodeId>>(
(HostName::Tor(onion), proxy) => match config.onion {
// In onion proxy mode, simply use the configured proxy address.
// This takes precedence over any global proxy.
- Some(AddressConfig::Proxy { address }) => address.into(),
+ AddressConfig::Proxy { address } => address.into(),
// In "forward" mode, if a global proxy is set, we use that, otherwise
// we treat `.onion` addresses as regular DNS names.
- Some(AddressConfig::Forward) => {
+ AddressConfig::Forward => {
if let Some(proxy) = proxy {
proxy.into()
} else {
@@ -1108,7 +1108,7 @@ pub fn dial<G: Ecdh<Pk = NodeId>>(
}
}
// If onion address support isn't configured, refuse to connect.
- None => {
+ AddressConfig::Drop => {
return Err(io::Error::new(
io::ErrorKind::Unsupported,
"no configuration found for .onion addresses",
diff --git a/crates/radicle-protocol/src/service.rs b/crates/radicle-protocol/src/service.rs
index 916226640..2b2bfd2f8 100644
--- a/crates/radicle-protocol/src/service.rs
+++ b/crates/radicle-protocol/src/service.rs
@@ -27,6 +27,8 @@ use radicle::node;
use radicle::node::address;
use radicle::node::address::Store as _;
use radicle::node::address::{AddressBook, AddressType, KnownAddress};
+#[cfg(feature = "tor")]
+use radicle::node::config::AddressConfig;
use radicle::node::config::{PeerConfig, RateLimit};
use radicle::node::device::Device;
use radicle::node::refs::Store as _;
@@ -2629,7 +2631,7 @@ where
match AddressType::from(address) {
// Only consider onion addresses if configured.
#[cfg(feature = "tor")]
- AddressType::Onion => self.config.onion.is_some(),
+ AddressType::Onion => self.config.onion != AddressConfig::Drop,
AddressType::Dns | AddressType::Ipv4 | AddressType::Ipv6 => true,
}
}
diff --git a/crates/radicle/src/node/config.rs b/crates/radicle/src/node/config.rs
index 31dea336d..20f32e049 100644
--- a/crates/radicle/src/node/config.rs
+++ b/crates/radicle/src/node/config.rs
@@ -352,7 +352,7 @@ pub enum Relay {
}
/// Proxy configuration.
-#[derive(Debug, Clone, Serialize, Deserialize)]
+#[derive(Debug, Copy, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", tag = "mode")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[cfg(feature = "tor")]
@@ -365,6 +365,9 @@ pub enum AddressConfig {
/// Forward address to the next layer. Either this is the global proxy,
/// or the operating system, via DNS.
Forward,
+ /// Drop connections to this address type.
+ #[default]
+ Drop,
}
/// Default seeding policy. Applies when no repository policies for the given repo are found.
@@ -434,8 +437,8 @@ pub struct Config {
pub proxy: Option<net::SocketAddr>,
/// Onion address config.
#[cfg(feature = "tor")]
- #[serde(default, skip_serializing_if = "Option::is_none")]
- pub onion: Option<AddressConfig>,
+ #[serde(default, skip_serializing_if = "crate::serde_ext::is_default")]
+ pub onion: AddressConfig,
/// Peer-to-peer network.
#[serde(default)]
pub network: Network,
@@ -485,7 +488,7 @@ impl Config {
network: Network::default(),
proxy: None,
#[cfg(feature = "tor")]
- onion: None,
+ onion: AddressConfig::Drop,
relay: Relay::default(),
limits: Limits::default(),
workers: Workers::default(),
commit d63718ac30e9f3ceb2224565e9f04f3a2919f74c
Author: Lorenz Leutgeb <lorenz.leutgeb@radicle.xyz>
Date: Sun Feb 15 01:40:39 2026 +0100
cargo: Add feature for Tor support
diff --git a/crates/radicle-cli/Cargo.toml b/crates/radicle-cli/Cargo.toml
index 33f541cfe..5afd11ef6 100644
--- a/crates/radicle-cli/Cargo.toml
+++ b/crates/radicle-cli/Cargo.toml
@@ -13,6 +13,10 @@ rust-version.workspace = true
name = "rad"
path = "src/main.rs"
+[features]
+default = ["tor"]
+tor = ["radicle/tor"]
+
[dependencies]
anyhow = "1"
chrono = { workspace = true, features = ["clock", "std"] }
diff --git a/crates/radicle-cli/src/terminal/format.rs b/crates/radicle-cli/src/terminal/format.rs
index 2e026cd74..b229b9832 100644
--- a/crates/radicle-cli/src/terminal/format.rs
+++ b/crates/radicle-cli/src/terminal/format.rs
@@ -37,6 +37,7 @@ pub fn addr_compact(address: &Address) -> Paint<String> {
let host = match address.host() {
HostName::Ip(ip) => ip.to_string(),
HostName::Dns(dns) => dns.clone(),
+ #[cfg(feature = "tor")]
HostName::Tor(onion) => {
let onion = onion.to_string();
let start = onion.chars().take(8).collect::<String>();
diff --git a/crates/radicle-node/Cargo.toml b/crates/radicle-node/Cargo.toml
index dd55ec2e6..0a57c94d8 100644
--- a/crates/radicle-node/Cargo.toml
+++ b/crates/radicle-node/Cargo.toml
@@ -10,9 +10,10 @@ build = "build.rs"
rust-version.workspace = true
[features]
-default = ["backtrace", "systemd", "structured-logger", "socket2"]
+default = ["backtrace", "systemd", "structured-logger", "socket2", "tor"]
systemd = ["dep:radicle-systemd"]
test = ["radicle/test", "radicle-crypto/test", "radicle-crypto/cyphernet", "radicle-protocol/test", "qcheck", "snapbox"]
+tor = ["cyphernet/tor", "radicle/tor", "radicle-protocol/tor"]
[dependencies]
backtrace = { version = "0.3.75", optional = true }
@@ -21,7 +22,7 @@ bytes = { workspace = true }
chrono = { workspace = true, features = ["clock"] }
colored = { workspace = true }
crossbeam-channel = { workspace = true }
-cyphernet = { workspace = true, features = ["tor", "dns", "ed25519", "p2p-ed25519", "noise-framework", "noise_sha2"] }
+cyphernet = { workspace = true, features = ["dns", "ed25519", "p2p-ed25519", "noise-framework", "noise_sha2"] }
fastrand = { workspace = true }
lexopt = { workspace = true }
log = { workspace = true, features = ["kv", "std"] }
diff --git a/crates/radicle-node/src/wire.rs b/crates/radicle-node/src/wire.rs
index 21112d012..178073d68 100644
--- a/crates/radicle-node/src/wire.rs
+++ b/crates/radicle-node/src/wire.rs
@@ -19,6 +19,7 @@ use radicle::node::device::Device;
use radicle::collections::{RandomMap, RandomSet};
use radicle::crypto;
+#[cfg(feature = "tor")]
use radicle::node::config::AddressConfig;
use radicle::node::Link;
use radicle::node::NodeId;
@@ -1092,6 +1093,7 @@ pub fn dial<G: Ecdh<Pk = NodeId>>(
(HostName::Dns(_), Some(proxy)) => proxy.into(),
(HostName::Dns(dns), None) => NetAddr::new(InetHost::Dns(dns.clone()), remote_addr.port),
// For onion addresses, handle with care.
+ #[cfg(feature = "tor")]
(HostName::Tor(onion), proxy) => match config.onion {
// In onion proxy mode, simply use the configured proxy address.
// This takes precedence over any global proxy.
diff --git a/crates/radicle-protocol/Cargo.toml b/crates/radicle-protocol/Cargo.toml
index 561a7b775..32e97aa33 100644
--- a/crates/radicle-protocol/Cargo.toml
+++ b/crates/radicle-protocol/Cargo.toml
@@ -10,12 +10,13 @@ rust-version.workspace = true
[features]
test = ["radicle/test", "radicle-crypto/test", "radicle-crypto/cyphernet", "qcheck"]
+tor = ["cyphernet/tor"]
[dependencies]
bloomy = "1.2"
bytes = { workspace = true }
crossbeam-channel = { workspace = true }
-cyphernet = { workspace = true, features = ["tor"] }
+cyphernet = { workspace = true }
fastrand = { workspace = true }
log = { workspace = true, features = ["std"] }
nonempty = { workspace = true, features = ["serialize"] }
diff --git a/crates/radicle-protocol/src/service.rs b/crates/radicle-protocol/src/service.rs
index 63bece7c8..916226640 100644
--- a/crates/radicle-protocol/src/service.rs
+++ b/crates/radicle-protocol/src/service.rs
@@ -2628,6 +2628,7 @@ where
fn is_supported_address(&self, address: &Address) -> bool {
match AddressType::from(address) {
// Only consider onion addresses if configured.
+ #[cfg(feature = "tor")]
AddressType::Onion => self.config.onion.is_some(),
AddressType::Dns | AddressType::Ipv4 | AddressType::Ipv6 => true,
}
diff --git a/crates/radicle-protocol/src/wire.rs b/crates/radicle-protocol/src/wire.rs
index 9f949536c..65e17f4e2 100644
--- a/crates/radicle-protocol/src/wire.rs
+++ b/crates/radicle-protocol/src/wire.rs
@@ -15,6 +15,7 @@ use std::string::FromUtf8Error;
use bytes::{Buf, BufMut};
+#[cfg(feature = "tor")]
use cyphernet::addr::tor;
use radicle::crypto::{PublicKey, Signature, Unverified};
@@ -58,6 +59,7 @@ pub enum Invalid {
Alias(#[from] node::AliasError),
#[error("invalid user agent string: {err}")]
InvalidUserAgent { err: String },
+ #[cfg(feature = "tor")]
#[error("invalid onion address: {0}")]
OnionAddr(#[from] tor::OnionAddrDecodeError),
#[error("invalid timestamp: {actual_millis} millis")]
@@ -257,6 +259,7 @@ impl Encode for Refs {
}
}
+#[cfg(feature = "tor")]
impl Encode for cyphernet::addr::tor::OnionAddrV3 {
fn encode(&self, buf: &mut impl BufMut) {
self.into_raw_bytes().encode(buf)
@@ -536,6 +539,7 @@ impl Decode for node::Features {
}
}
+#[cfg(feature = "tor")]
impl Decode for tor::OnionAddrV3 {
fn decode(buf: &mut impl Buf) -> Result<Self, Error> {
let bytes: [u8; tor::ONION_V3_RAW_LEN] = Decode::decode(buf)?;
diff --git a/crates/radicle-protocol/src/wire/message.rs b/crates/radicle-protocol/src/wire/message.rs
index 7d3bb985f..929908a8f 100644
--- a/crates/radicle-protocol/src/wire/message.rs
+++ b/crates/radicle-protocol/src/wire/message.rs
@@ -2,7 +2,9 @@ use std::{mem, net};
use bytes::Buf;
use bytes::BufMut;
-use cyphernet::addr::{tor, HostName, NetAddr};
+#[cfg(feature = "tor")]
+use cyphernet::addr::tor;
+use cyphernet::addr::{HostName, NetAddr};
use radicle::crypto::Signature;
use radicle::git::Oid;
use radicle::identity::RepoId;
@@ -79,6 +81,7 @@ pub enum AddressType {
Ipv4 = 1,
Ipv6 = 2,
Dns = 3,
+ #[cfg(feature = "tor")]
Onion = 4,
}
@@ -94,6 +97,7 @@ impl From<&Address> for AddressType {
HostName::Ip(net::IpAddr::V4(_)) => AddressType::Ipv4,
HostName::Ip(net::IpAddr::V6(_)) => AddressType::Ipv6,
HostName::Dns(_) => AddressType::Dns,
+ #[cfg(feature = "tor")]
HostName::Tor(_) => AddressType::Onion,
_ => todo!(), // FIXME(cloudhead): Maxim will remove `non-exhaustive`
}
@@ -108,6 +112,7 @@ impl TryFrom<u8> for AddressType {
1 => Ok(AddressType::Ipv4),
2 => Ok(AddressType::Ipv6),
3 => Ok(AddressType::Dns),
+ #[cfg(feature = "tor")]
4 => Ok(AddressType::Onion),
_ => Err(other),
}
@@ -356,6 +361,7 @@ impl wire::Encode for Address {
u8::from(AddressType::Dns).encode(buf);
dns.encode(buf);
}
+ #[cfg(feature = "tor")]
HostName::Tor(addr) => {
u8::from(AddressType::Onion).encode(buf);
addr.encode(buf);
@@ -393,6 +399,7 @@ impl wire::Decode for Address {
HostName::Dns(dns)
}
+ #[cfg(feature = "tor")]
Ok(AddressType::Onion) => {
let onion: tor::OnionAddrV3 = wire::Decode::decode(buf)?;
diff --git a/crates/radicle/Cargo.toml b/crates/radicle/Cargo.toml
index 6437a69f8..c26b282cf 100644
--- a/crates/radicle/Cargo.toml
+++ b/crates/radicle/Cargo.toml
@@ -24,6 +24,7 @@ schemars = [
"radicle-localtime/schemars",
"dep:schemars"
]
+tor = ["cyphernet/tor"]
[dependencies]
amplify = { workspace = true, features = ["std"] }
@@ -32,7 +33,7 @@ bytesize = { version = "2", features = ["serde"] }
chrono = { workspace = true, features = ["clock"], optional = true }
colored = { workspace = true, optional = true }
crossbeam-channel = { workspace = true }
-cyphernet = { workspace = true, features = ["tor", "dns", "p2p-ed25519"] }
+cyphernet = { workspace = true, features = ["dns", "p2p-ed25519"] }
dunce = { workspace = true }
fast-glob = { version = "0.3.2" }
fastrand = { workspace = true, features = ["std"] }
diff --git a/crates/radicle/src/node.rs b/crates/radicle/src/node.rs
index 2dafb663a..68c1d3dd0 100644
--- a/crates/radicle/src/node.rs
+++ b/crates/radicle/src/node.rs
@@ -477,6 +477,7 @@ impl Address {
}
/// Returns `true` if the [`HostName`] is a Tor onion address.
+ #[cfg(feature = "tor")]
pub fn is_onion(&self) -> bool {
match self.0.host {
HostName::Tor(_) => true,
diff --git a/crates/radicle/src/node/address.rs b/crates/radicle/src/node/address.rs
index baefd98fb..92a0227ca 100644
--- a/crates/radicle/src/node/address.rs
+++ b/crates/radicle/src/node/address.rs
@@ -201,6 +201,7 @@ pub enum AddressType {
Ipv4 = 1,
Ipv6 = 2,
Dns = 3,
+ #[cfg(feature = "tor")]
Onion = 4,
}
@@ -216,6 +217,7 @@ impl From<&Address> for AddressType {
HostName::Ip(net::IpAddr::V4(_)) => AddressType::Ipv4,
HostName::Ip(net::IpAddr::V6(_)) => AddressType::Ipv6,
HostName::Dns(_) => AddressType::Dns,
+ #[cfg(feature = "tor")]
HostName::Tor(_) => AddressType::Onion,
_ => todo!(), // FIXME(cloudhead): Maxim will remove `non-exhaustive`
}
@@ -230,6 +232,7 @@ impl TryFrom<u8> for AddressType {
1 => Ok(AddressType::Ipv4),
2 => Ok(AddressType::Ipv6),
3 => Ok(AddressType::Dns),
+ #[cfg(feature = "tor")]
4 => Ok(AddressType::Onion),
_ => Err(other),
}
diff --git a/crates/radicle/src/node/address/store.rs b/crates/radicle/src/node/address/store.rs
index ce292a357..43b124026 100644
--- a/crates/radicle/src/node/address/store.rs
+++ b/crates/radicle/src/node/address/store.rs
@@ -535,6 +535,7 @@ impl TryFrom<&sql::Value> for AddressType {
"ipv4" => Ok(AddressType::Ipv4),
"ipv6" => Ok(AddressType::Ipv6),
"dns" => Ok(AddressType::Dns),
+ #[cfg(feature = "tor")]
"onion" => Ok(AddressType::Onion),
_ => Err(err),
},
@@ -549,6 +550,7 @@ impl sql::BindableWithIndex for AddressType {
Self::Ipv4 => "ipv4".bind(stmt, i),
Self::Ipv6 => "ipv6".bind(stmt, i),
Self::Dns => "dns".bind(stmt, i),
+ #[cfg(feature = "tor")]
Self::Onion => "onion".bind(stmt, i),
}
}
diff --git a/crates/radicle/src/node/config.rs b/crates/radicle/src/node/config.rs
index 6d289e78e..31dea336d 100644
--- a/crates/radicle/src/node/config.rs
+++ b/crates/radicle/src/node/config.rs
@@ -19,7 +19,9 @@ pub type ProtocolVersion = u8;
pub mod seeds {
use std::{str::FromStr, sync::LazyLock};
- use cyphernet::addr::{tor::OnionAddrV3, HostName, NetAddr};
+ #[cfg(feature = "tor")]
+ use cyphernet::addr::tor::OnionAddrV3;
+ use cyphernet::addr::{HostName, NetAddr};
use super::{ConnectAddress, NodeId, PeerAddr};
@@ -38,6 +40,7 @@ pub mod seeds {
NodeId::from_str("z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7").unwrap(),
vec![
HostName::Dns("iris.radicle.xyz".to_owned()),
+ #[cfg(feature = "tor")]
#[allow(clippy::unwrap_used)] // Value is manually verified.
OnionAddrV3::from_str(
"irisradizskwweumpydlj4oammoshkxxjur3ztcmo7cou5emc6s5lfid.onion",
@@ -55,6 +58,7 @@ pub mod seeds {
NodeId::from_str("z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo").unwrap(),
vec![
HostName::Dns("rosa.radicle.xyz".to_owned()),
+ #[cfg(feature = "tor")]
#[allow(clippy::unwrap_used)] // Value is manually verified.
OnionAddrV3::from_str(
"rosarad5bxgdlgjnzzjygnsxrwxmoaj4vn7xinlstwglxvyt64jlnhyd.onion",
@@ -351,6 +355,7 @@ pub enum Relay {
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", tag = "mode")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
+#[cfg(feature = "tor")]
pub enum AddressConfig {
/// Proxy connections to this address type.
Proxy {
@@ -428,6 +433,7 @@ pub struct Config {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub proxy: Option<net::SocketAddr>,
/// Onion address config.
+ #[cfg(feature = "tor")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub onion: Option<AddressConfig>,
/// Peer-to-peer network.
@@ -478,6 +484,7 @@ impl Config {
external_addresses: vec![],
network: Network::default(),
proxy: None,
+ #[cfg(feature = "tor")]
onion: None,
relay: Relay::default(),
limits: Limits::default(),
diff --git a/crates/radicle/src/test/arbitrary.rs b/crates/radicle/src/test/arbitrary.rs
index a9af6bf3d..88a9ee590 100644
--- a/crates/radicle/src/test/arbitrary.rs
+++ b/crates/radicle/src/test/arbitrary.rs
@@ -6,8 +6,8 @@ use std::{iter, net};
use crypto::test::signer::MockSigner;
use crypto::{PublicKey, Unverified};
-use cyphernet::addr::tor::OnionAddrV3;
-use cyphernet::EcPk;
+#[cfg(feature = "tor")]
+use cyphernet::{addr::tor::OnionAddrV3, EcPk};
use qcheck::Arbitrary;
use crate::collections::RandomMap;
@@ -293,6 +293,7 @@ impl Arbitrary for Address {
.unwrap()
.to_string(),
),
+ #[cfg(feature = "tor")]
AddressType::Onion => {
let pk = PublicKey::arbitrary(g);
let addr = OnionAddrV3::from(
Exit code: 0
shell: 'export RUSTDOCFLAGS=''-D warnings'' cargo --version rustc --version cargo fmt --check cargo clippy --all-targets --workspace -- --deny warnings cargo build --all-targets --workspace cargo doc --workspace --no-deps --all-features cargo test --workspace --no-fail-fast '
Commands:
$ podman run --name a35f7e74-3dff-44cf-af43-d8ba5b587e38 -v /opt/radcis/ci.rad.levitte.org/cci/state/a35f7e74-3dff-44cf-af43-d8ba5b587e38/s:/a35f7e74-3dff-44cf-af43-d8ba5b587e38/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w:/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w -w /a35f7e74-3dff-44cf-af43-d8ba5b587e38/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /a35f7e74-3dff-44cf-af43-d8ba5b587e38/s/script.sh
+ export 'RUSTDOCFLAGS=-D warnings'
+ RUSTDOCFLAGS='-D warnings'
+ cargo --version
info: syncing channel updates for '1.90-x86_64-unknown-linux-gnu'
info: latest update on 2025-09-18, rust version 1.90.0 (1159e78c4 2025-09-14)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-src'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-src'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'
cargo 1.90.0 (840b83a10 2025-07-30)
+ rustc --version
rustc 1.90.0 (1159e78c4 2025-09-14)
+ cargo fmt --check
+ cargo clippy --all-targets --workspace -- --deny warnings
Updating git repository `https://github.com/lorenzleutgeb/cyphernet.rs.git`
Updating crates.io index
Downloading crates ...
Downloaded gix-prompt v0.11.1
Downloaded fnv v1.0.7
Downloaded fluent-uri v0.3.2
Downloaded chacha20 v0.9.1
Downloaded gix-path v0.10.20
Downloaded filetime v0.2.23
Downloaded inout v0.1.3
Downloaded flate2 v1.1.1
Downloaded gix-utils v0.3.0
Downloaded group v0.13.0
Downloaded ecdsa v0.16.9
Downloaded gix-command v0.6.2
Downloaded itoa v1.0.11
Downloaded home v0.5.9
Downloaded data-encoding-macro-internal v0.1.12
Downloaded getrandom v0.2.15
Downloaded opaque-debug v0.3.1
Downloaded nonempty v0.9.0
Downloaded cipher v0.4.4
Downloaded num v0.4.3
Downloaded gix-negotiate v0.21.0
Downloaded gix-tempfile v18.0.0
Downloaded indexmap v2.2.6
Downloaded paste v1.0.15
Downloaded phf_shared v0.11.3
Downloaded num-complex v0.4.6
Downloaded pem-rfc7468 v0.7.0
Downloaded quick-error v1.2.3
Downloaded ref-cast v1.0.24
Downloaded radicle-git-ext v0.11.0
Downloaded rand_xorshift v0.4.0
Downloaded newline-converter v0.3.0
Downloaded same-file v1.0.6
Downloaded scrypt v0.11.0
Downloaded num-traits v0.2.19
Downloaded signature v2.2.0
Downloaded signature v1.6.4
Downloaded rand_core v0.6.4
Downloaded sqlite3-sys v0.15.2
Downloaded subtle v2.5.0
Downloaded schemars_derive v1.0.4
Downloaded sval_dynamic v2.14.1
Downloaded signal-hook-registry v1.4.5
Downloaded sval_ref v2.14.1
Downloaded sval_json v2.14.1
Downloaded structured-logger v1.0.4
Downloaded spin v0.9.8
Downloaded test-log v0.2.19
Downloaded snapbox v0.4.17
Downloaded sval_nested v2.14.1
Downloaded tinyvec_macros v0.1.1
Downloaded tree-sitter-highlight v0.24.4
Downloaded tree-sitter-language v0.1.2
Downloaded litrs v0.4.1
Downloaded toml_writer v1.0.6+spec-1.1.0
Downloaded tree-sitter-json v0.24.8
Downloaded typeid v1.0.3
Downloaded tree-sitter-html v0.23.2
Downloaded universal-hash v0.5.1
Downloaded uuid-simd v0.8.0
Downloaded unit-prefix v0.5.1
Downloaded version_check v0.9.4
Downloaded unicode-width v0.1.11
Downloaded test-log-macros v0.2.19
Downloaded sval_serde v2.14.1
Downloaded poly1305 v0.8.0
Downloaded write16 v1.0.0
Downloaded utf8_iter v1.0.4
Downloaded unicode-display-width v0.3.0
Downloaded serde-untagged v0.1.7
Downloaded toml v0.9.12+spec-1.1.0
Downloaded zerovec-derive v0.10.3
Downloaded spki v0.7.3
Downloaded zeroize v1.7.0
Downloaded writeable v0.5.5
Downloaded value-bag-sval2 v1.11.1
Downloaded url v2.5.4
Downloaded log v0.4.27
Downloaded yoke-derive v0.7.5
Downloaded sval v2.14.1
Downloaded getrandom v0.3.3
Downloaded zerofrom-derive v0.1.6
Downloaded zerofrom v0.1.6
Downloaded thiserror v1.0.69
Downloaded unicode-segmentation v1.11.0
Downloaded proptest v1.9.0
Downloaded unicode-normalization v0.1.23
Downloaded zerovec v0.10.4
Downloaded zerocopy v0.7.35
Downloaded winnow v0.7.13
Downloaded zlib-rs v0.5.2
Downloaded vcpkg v0.2.15
Downloaded tracing-core v0.1.36
Downloaded tree-sitter-c v0.23.2
Downloaded unicode-width v0.2.1
Downloaded tree-sitter-md v0.3.2
Downloaded radicle-surf v0.26.0
Downloaded portable-atomic v1.11.0
Downloaded serde_json v1.0.140
Downloaded git2 v0.19.0
Downloaded p384 v0.13.0
Downloaded gimli v0.32.3
Downloaded tree-sitter-bash v0.23.3
Downloaded tracing v0.1.44
Downloaded syn v2.0.106
Downloaded rustix v1.0.7
Downloaded p521 v0.13.3
Downloaded tree-sitter-rust v0.23.2
Downloaded regex-syntax v0.8.5
Downloaded regex-automata v0.4.9
Downloaded jsonschema v0.30.0
Downloaded icu_properties_data v1.5.1
Downloaded ssh-key v0.6.6
Downloaded rustix v0.38.34
Downloaded idna v1.0.3
Downloaded hashbrown v0.14.3
Downloaded tree-sitter-ruby v0.23.1
Downloaded gix-pack v0.60.0
Downloaded mio v0.8.11
Downloaded itertools v0.14.0
Downloaded inquire v0.7.5
Downloaded serde v1.0.228
Downloaded memchr v2.7.2
Downloaded tree-sitter-typescript v0.23.2
Downloaded tokio v1.47.1
Downloaded libm v0.2.8
Downloaded jiff v0.2.15
Downloaded fraction v0.15.3
Downloaded libc v0.2.174
Downloaded sha1-checked v0.10.0
Downloaded uuid v1.20.0
Downloaded object v0.37.3
Downloaded syn v1.0.109
Downloaded jiff-static v0.2.15
Downloaded gix-transport v0.48.0
Downloaded sha3 v0.10.8
Downloaded gix-ref v0.53.1
Downloaded tree-sitter v0.24.4
Downloaded tracing-subscriber v0.3.22
Downloaded sysinfo v0.37.2
Downloaded sharded-slab v0.1.7
Downloaded miniz_oxide v0.8.8
Downloaded gix-odb v0.70.0
Downloaded tinyvec v1.6.0
Downloaded ryu v1.0.17
Downloaded regex v1.11.1
Downloaded indicatif v0.18.0
Downloaded heapless v0.8.0
Downloaded tree-sitter-python v0.23.4
Downloaded icu_provider v1.5.0
Downloaded icu_collections v1.5.0
Downloaded hashbrown v0.15.5
Downloaded bloomy v1.2.0
Downloaded sqlite v0.32.0
Downloaded icu_normalizer_data v1.5.1
Downloaded gix-object v0.50.2
Downloaded tree-sitter-toml-ng v0.6.0
Downloaded tree-sitter-go v0.23.4
Downloaded tracing-log v0.2.0
Downloaded icu_properties v1.5.1
Downloaded icu_locid_transform_data v1.5.1
Downloaded icu_locid v1.5.0
Downloaded synstructure v0.13.1
Downloaded streaming-iterator v0.1.9
Downloaded yoke v0.7.5
Downloaded yansi v0.5.1
Downloaded xattr v1.3.1
Downloaded walkdir v2.5.0
Downloaded vsimd v0.8.0
Downloaded value-bag v1.11.1
Downloaded sha2 v0.10.8
Downloaded memmap2 v0.9.8
Downloaded lock_api v0.4.14
Downloaded hmac v0.12.1
Downloaded maybe-async v0.2.10
Downloaded gix-traverse v0.47.0
Downloaded unicode-ident v1.0.12
Downloaded typenum v1.17.0
Downloaded wait-timeout v0.2.1
Downloaded value-bag-serde1 v1.11.1
Downloaded unarray v0.1.4
Downloaded tree-sitter-css v0.23.1
Downloaded utf8parse v0.2.2
Downloaded utf16_iter v1.0.5
Downloaded tar v0.4.40
Downloaded schemars v1.0.4
Downloaded proc-macro-error2 v2.0.1
Downloaded pkg-config v0.3.30
Downloaded chrono v0.4.38
Downloaded thiserror v2.0.17
Downloaded tempfile v3.23.0
Downloaded polyval v0.6.2
Downloaded keccak v0.1.5
Downloaded toml_datetime v0.7.5+spec-1.1.0
Downloaded tinystr v0.7.6
Downloaded timeago v0.4.2
Downloaded thread_local v1.1.9
Downloaded thiserror-impl v2.0.17
Downloaded rand v0.9.2
Downloaded gix-fs v0.16.1
Downloaded iana-time-zone v0.1.60
Downloaded thiserror-impl v1.0.69
Downloaded stable_deref_trait v1.2.0
Downloaded siphasher v1.0.1
Downloaded siphasher v0.3.11
Downloaded num-bigint-dig v0.8.4
Downloaded gix-revwalk v0.21.0
Downloaded systemd-journal-logger v2.2.2
Downloaded socket2 v0.5.7
Downloaded prodash v30.0.1
Downloaded sval_buffer v2.14.1
Downloaded similar v2.5.0
Downloaded sha1 v0.10.6
Downloaded serde_spanned v1.0.4
Downloaded serde_derive v1.0.228
Downloaded rand v0.8.5
Downloaded crossterm v0.29.0
Downloaded signal-hook v0.3.18
Downloaded smallvec v1.15.1
Downloaded shell-words v1.1.0
Downloaded serde_core v1.0.228
Downloaded rsa v0.9.6
Downloaded gix-hash v0.19.0
Downloaded sqlite3-src v0.5.1
Downloaded signals_receipts v0.2.0
Downloaded jobserver v0.1.31
Downloaded gix-shallow v0.5.0
Downloaded gix-revision v0.35.0
Downloaded gix-commitgraph v0.29.0
Downloaded litemap v0.7.5
Downloaded gix-credentials v0.30.0
Downloaded sval_fmt v2.14.1
Downloaded sec1 v0.7.3
Downloaded pretty_assertions v1.4.0
Downloaded mio v1.0.4
Downloaded crossterm v0.25.0
Downloaded referencing v0.30.0
Downloaded strsim v0.11.1
Downloaded sem_safe v0.2.0
Downloaded icu_locid_transform v1.5.0
Downloaded aho-corasick v1.1.3
Downloaded rfc6979 v0.4.0
Downloaded ref-cast-impl v1.0.24
Downloaded ssh-encoding v0.2.0
Downloaded ssh-cipher v0.2.0
Downloaded shlex v1.3.0
Downloaded serde_derive_internals v0.29.1
Downloaded gix-diff v0.53.0
Downloaded snapbox-macros v0.3.8
Downloaded proc-macro2 v1.0.101
Downloaded num-bigint v0.4.6
Downloaded rand_chacha v0.9.0
Downloaded signal-hook-mio v0.2.4
Downloaded serde_fmt v1.0.3
Downloaded libz-rs-sys v0.5.2
Downloaded scopeguard v1.2.0
Downloaded rustc-demangle v0.1.26
Downloaded gix-sec v0.12.0
Downloaded salsa20 v0.10.2
Downloaded rusty-fork v0.3.1
Downloaded rand_core v0.9.3
Downloaded primeorder v0.13.6
Downloaded pkcs1 v0.7.5
Downloaded der v0.7.9
Downloaded rand_chacha v0.3.1
Downloaded qcheck v1.0.0
Downloaded lexopt v0.3.0
Downloaded gix-packetline v0.19.1
Downloaded human-panic v2.0.6
Downloaded gix-url v0.32.0
Downloaded base64 v0.21.7
Downloaded backtrace v0.3.76
Downloaded arc-swap v1.7.1
Downloaded ppv-lite86 v0.2.17
Downloaded pkcs8 v0.10.2
Downloaded parking_lot v0.12.5
Downloaded crypto-bigint v0.5.5
Downloaded bytes v1.11.1
Downloaded quote v1.0.41
Downloaded qcheck-macros v1.0.0
Downloaded radicle-std-ext v0.2.0
Downloaded proc-macro-error-attr2 v2.0.0
Downloaded pbkdf2 v0.12.2
Downloaded parking_lot_core v0.9.12
Downloaded p256 v0.13.2
Downloaded is_terminal_polyfill v1.70.2
Downloaded gix-hashtable v0.9.0
Downloaded pin-project-lite v0.2.16
Downloaded phf v0.11.3
Downloaded git-ref-format v0.6.0
Downloaded derive_more-impl v2.0.1
Downloaded chacha20poly1305 v0.10.1
Downloaded bitflags v2.9.1
Downloaded num-rational v0.4.2
Downloaded num-integer v0.1.46
Downloaded gix-config-value v0.15.1
Downloaded fxhash v0.2.1
Downloaded elliptic-curve v0.13.8
Downloaded clap v4.5.44
Downloaded heck v0.5.0
Downloaded gix-validate v0.10.0
Downloaded percent-encoding v2.3.1
Downloaded outref v0.5.2
Downloaded once_cell v1.21.3
Downloaded nu-ansi-term v0.50.3
Downloaded form_urlencoded v1.2.1
Downloaded const-oid v0.9.6
Downloaded num-iter v0.1.45
Downloaded gix-date v0.10.5
Downloaded digest v0.10.7
Downloaded icu_normalizer v1.5.0
Downloaded gix-refspec v0.31.0
Downloaded diff v0.1.13
Downloaded console v0.16.0
Downloaded clap_derive v4.5.41
Downloaded anyhow v1.0.82
Downloaded gix-quote v0.6.0
Downloaded escargot v0.5.10
Downloaded crossbeam-channel v0.5.15
Downloaded base64ct v1.6.0
Downloaded ascii v1.1.0
Downloaded anstyle-parse v0.2.3
Downloaded gix-lock v18.0.0
Downloaded anstyle v1.0.13
Downloaded anstream v0.6.21
Downloaded fancy-regex v0.14.0
Downloaded emojis v0.6.4
Downloaded email_address v0.2.9
Downloaded ed25519 v1.5.3
Downloaded matchers v0.2.0
Downloaded lazy_static v1.5.0
Downloaded icu_provider_macros v1.5.0
Downloaded hash32 v0.3.1
Downloaded gix-trace v0.1.13
Downloaded git-ref-format-macro v0.6.0
Downloaded ghash v0.5.1
Downloaded generic-array v0.14.7
Downloaded byteorder v1.5.0
Downloaded amplify_num v0.5.2
Downloaded adler2 v2.0.0
Downloaded num-cmp v0.1.0
Downloaded normalize-line-endings v0.3.0
Downloaded multibase v0.9.1
Downloaded idna_adapter v1.2.0
Downloaded faster-hex v0.10.0
Downloaded fast-glob v0.3.3
Downloaded equivalent v1.0.1
Downloaded dunce v1.0.5
Downloaded crypto-common v0.1.6
Downloaded ff v0.13.0
Downloaded derive_more v2.0.1
Downloaded bcrypt-pbkdf v0.10.0
Downloaded base32 v0.4.0
Downloaded gix-actor v0.35.4
Downloaded ct-codecs v1.1.1
Downloaded borrow-or-share v0.2.2
Downloaded autocfg v1.2.0
Downloaded env_filter v0.1.3
Downloaded either v1.11.0
Downloaded dyn-clone v1.0.17
Downloaded cpufeatures v0.2.12
Downloaded cfg-if v1.0.0
Downloaded bit-vec v0.8.0
Downloaded base64 v0.22.1
Downloaded amplify_syn v2.0.1
Downloaded crc32fast v1.5.0
Downloaded colorchoice v1.0.0
Downloaded cbc v0.1.2
Downloaded bytecount v0.6.8
Downloaded anstyle-query v1.0.2
Downloaded ec25519 v0.1.0
Downloaded data-encoding-macro v0.1.14
Downloaded clap_builder v4.5.44
Downloaded block-buffer v0.10.4
Downloaded bitflags v1.3.2
Downloaded base16ct v0.2.0
Downloaded amplify v4.6.0
Downloaded gix-protocol v0.51.0
Downloaded gix-chunk v0.4.11
Downloaded git-ref-format-core v0.6.0
Downloaded env_logger v0.11.8
Downloaded document-features v0.2.11
Downloaded convert_case v0.7.1
Downloaded cc v1.2.2
Downloaded blowfish v0.9.1
Downloaded block-padding v0.3.3
Downloaded base-x v0.2.11
Downloaded erased-serde v0.4.6
Downloaded data-encoding v2.5.0
Downloaded crossbeam-utils v0.8.19
Downloaded gix-features v0.43.1
Downloaded fastrand v2.3.0
Downloaded displaydoc v0.2.5
Downloaded bit-set v0.8.0
Downloaded aead v0.5.2
Downloaded addr2line v0.25.1
Downloaded errno v0.3.13
Downloaded ctr v0.9.2
Downloaded aes-gcm v0.10.3
Downloaded aes v0.8.4
Downloaded colored v2.1.0
Downloaded clap_lex v0.7.5
Downloaded bytesize v2.0.1
Downloaded amplify_derive v4.0.0
Downloaded ahash v0.8.11
Downloaded clap_complete v4.5.60
Downloaded bstr v1.12.0
Downloaded linux-raw-sys v0.4.13
Downloaded libgit2-sys v0.17.0+1.8.1
Downloaded linux-raw-sys v0.9.4
Downloaded libz-sys v1.1.16
Compiling libc v0.2.174
Compiling proc-macro2 v1.0.101
Compiling quote v1.0.41
Compiling unicode-ident v1.0.12
Checking cfg-if v1.0.0
Checking memchr v2.7.2
Compiling version_check v0.9.4
Compiling shlex v1.3.0
Compiling typenum v1.17.0
Checking getrandom v0.2.15
Compiling syn v2.0.106
Compiling jobserver v0.1.31
Compiling generic-array v0.14.7
Checking rand_core v0.6.4
Compiling cc v1.2.2
Compiling serde_core v1.0.228
Checking crypto-common v0.1.6
Checking regex-syntax v0.8.5
Checking aho-corasick v1.1.3
Compiling serde v1.0.228
Checking smallvec v1.15.1
Checking regex-automata v0.4.9
Compiling thiserror v2.0.17
Checking subtle v2.5.0
Checking once_cell v1.21.3
Checking stable_deref_trait v1.2.0
Checking cpufeatures v0.2.12
Checking fastrand v2.3.0
Compiling parking_lot_core v0.9.12
Checking scopeguard v1.2.0
Checking lock_api v0.4.14
Checking block-buffer v0.10.4
Checking digest v0.10.7
Checking parking_lot v0.12.5
Compiling crc32fast v1.5.0
Checking bitflags v2.9.1
Checking byteorder v1.5.0
Checking tinyvec_macros v0.1.1
Checking tinyvec v1.6.0
Checking gix-trace v0.1.13
Checking home v0.5.9
Compiling typeid v1.0.3
Compiling synstructure v0.13.1
Checking unicode-normalization v0.1.23
Checking bstr v1.12.0
Compiling serde_derive v1.0.228
Compiling thiserror-impl v2.0.17
Checking gix-utils v0.3.0
Checking zlib-rs v0.5.2
Checking itoa v1.0.11
Compiling zerofrom-derive v0.1.6
Checking libz-rs-sys v0.5.2
Checking gix-validate v0.10.0
Checking gix-path v0.10.20
Checking same-file v1.0.6
Checking walkdir v2.5.0
Checking flate2 v1.1.1
Compiling yoke-derive v0.7.5
Checking zerofrom v0.1.6
Checking prodash v30.0.1
Compiling zerovec-derive v0.10.3
Checking gix-features v0.43.1
Compiling displaydoc v0.2.5
Checking yoke v0.7.5
Compiling getrandom v0.3.3
Compiling heapless v0.8.0
Checking zerovec v0.10.4
Checking hash32 v0.3.1
Checking zeroize v1.7.0
Checking litemap v0.7.5
Checking erased-serde v0.4.6
Checking serde_fmt v1.0.3
Compiling rustix v1.0.7
Compiling icu_locid_transform_data v1.5.1
Checking tinystr v0.7.6
Checking writeable v0.5.5
Compiling pkg-config v0.3.30
Checking value-bag-serde1 v1.11.1
Checking icu_locid v1.5.0
Checking value-bag v1.11.1
Checking faster-hex v0.10.0
Compiling icu_provider_macros v1.5.0
Checking log v0.4.27
Compiling icu_properties_data v1.5.1
Checking linux-raw-sys v0.9.4
Checking icu_provider v1.5.0
Checking sha1 v0.10.6
Checking block-padding v0.3.3
Compiling icu_normalizer_data v1.5.1
Checking inout v0.1.3
Checking sha1-checked v0.10.0
Checking icu_locid_transform v1.5.0
Checking icu_collections v1.5.0
Compiling syn v1.0.109
Checking gix-hash v0.19.0
Checking cipher v0.4.4
Checking icu_properties v1.5.1
Checking write16 v1.0.0
Checking utf8_iter v1.0.4
Checking utf16_iter v1.0.5
Checking percent-encoding v2.3.1
Compiling thiserror v1.0.69
Compiling thiserror-impl v1.0.69
Checking equivalent v1.0.1
Checking icu_normalizer v1.5.0
Checking hashbrown v0.14.3
Checking idna_adapter v1.2.0
Checking idna v1.0.3
Compiling serde_json v1.0.140
Checking indexmap v2.2.6
Checking form_urlencoded v1.2.1
Checking sha2 v0.10.8
Compiling ref-cast v1.0.24
Compiling vcpkg v0.2.15
Checking ryu v1.0.17
Checking url v2.5.4
Checking tempfile v3.23.0
Compiling libz-sys v1.1.16
Compiling ref-cast-impl v1.0.24
Checking universal-hash v0.5.1
Checking opaque-debug v0.3.1
Compiling autocfg v1.2.0
Checking dyn-clone v1.0.17
Compiling amplify_syn v2.0.1
Compiling libgit2-sys v0.17.0+1.8.1
Compiling num-traits v0.2.19
Checking signature v1.6.4
Checking ed25519 v1.5.3
Compiling serde_derive_internals v0.29.1
Checking aead v0.5.2
Checking ct-codecs v1.1.1
Checking amplify_num v0.5.2
Compiling amplify_derive v4.0.0
Checking ascii v1.1.0
Compiling schemars_derive v1.0.4
Checking ec25519 v0.1.0
Checking amplify v4.6.0
Checking git-ref-format-core v0.6.0
Checking poly1305 v0.8.0
Checking chacha20 v0.9.1
Checking cyphergraphy v0.3.0 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking schemars v1.0.4
Checking polyval v0.6.2
Compiling sqlite3-src v0.5.1
Checking hmac v0.12.1
Checking base64ct v1.6.0
Checking keccak v0.1.5
Checking sha3 v0.10.8
Checking pem-rfc7468 v0.7.0
Checking pbkdf2 v0.12.2
Checking ghash v0.5.1
Checking aes v0.8.4
Checking ctr v0.9.2
Checking rand v0.8.5
Compiling data-encoding v2.5.0
Checking base32 v0.4.0
Checking cypheraddr v0.4.0 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking qcheck v1.0.0
Compiling data-encoding-macro-internal v0.1.12
Checking aes-gcm v0.10.3
Checking ssh-encoding v0.2.0
Checking chacha20poly1305 v0.10.1
Checking blowfish v0.9.1
Checking cbc v0.1.2
Checking ssh-cipher v0.2.0
Checking bcrypt-pbkdf v0.10.0
Checking data-encoding-macro v0.1.14
Checking noise-framework v0.4.0 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking socks5-client v0.4.1 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking base-x v0.2.11
Checking signature v2.2.0
Compiling crossbeam-utils v0.8.19
Checking multibase v0.9.1
Checking ssh-key v0.6.6
Checking cyphernet v0.5.2 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking radicle-ssh v0.10.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-ssh)
Checking lazy_static v1.5.0
Checking crossbeam-channel v0.5.15
Checking jiff v0.2.15
Checking nonempty v0.9.0
Checking siphasher v1.0.1
Checking anstyle-query v1.0.2
Checking radicle-git-metadata v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-git-metadata)
Checking radicle-dag v0.10.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-dag)
Checking winnow v0.7.13
Checking utf8parse v0.2.2
Checking hashbrown v0.15.5
Checking gix-hashtable v0.9.0
Checking anstyle-parse v0.2.3
Checking gix-date v0.10.5
Checking radicle-git-ref-format v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-git-ref-format)
Checking iana-time-zone v0.1.60
Checking gix-actor v0.35.4
Checking colorchoice v1.0.0
Checking is_terminal_polyfill v1.70.2
Checking base64 v0.21.7
Checking anstyle v1.0.13
Checking anstream v0.6.21
Checking gix-object v0.50.2
Checking chrono v0.4.38
Checking colored v2.1.0
Checking radicle-localtime v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-localtime)
Checking serde-untagged v0.1.7
Checking bytesize v2.0.1
Checking memmap2 v0.9.8
Checking fast-glob v0.3.3
Checking tree-sitter-language v0.1.2
Checking dunce v1.0.5
Checking gix-chunk v0.4.11
Checking gix-fs v0.16.1
Checking gix-commitgraph v0.29.0
Checking gix-tempfile v18.0.0
Checking mio v1.0.4
Checking gix-revwalk v0.21.0
Checking gix-quote v0.6.0
Checking sem_safe v0.2.0
Checking errno v0.3.13
Checking either v1.11.0
Checking shell-words v1.1.0
Checking gix-command v0.6.2
Checking signals_receipts v0.2.0
Compiling object v0.37.3
Compiling signal-hook v0.3.18
Checking gix-lock v18.0.0
Checking gix-url v0.32.0
Checking gix-config-value v0.15.1
Checking gix-sec v0.12.0
Checking signal-hook-registry v1.4.5
Checking adler2 v2.0.0
Compiling rustix v0.38.34
Checking gimli v0.32.3
Checking miniz_oxide v0.8.8
Checking gix-prompt v0.11.1
Checking addr2line v0.25.1
Checking radicle-signals v0.11.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-signals)
Checking gix-revision v0.35.0
Checking gix-traverse v0.47.0
Checking gix-diff v0.53.0
Checking mio v0.8.11
Checking gix-packetline v0.19.1
Compiling tree-sitter v0.24.4
Compiling anyhow v1.0.82
Compiling unicode-segmentation v1.11.0
Checking rustc-demangle v0.1.26
Compiling linux-raw-sys v0.4.13
Checking backtrace v0.3.76
Compiling convert_case v0.7.1
Checking gix-transport v0.48.0
Checking signal-hook-mio v0.2.4
Checking gix-pack v0.60.0
Checking gix-refspec v0.31.0
Checking gix-credentials v0.30.0
Checking gix-shallow v0.5.0
Checking gix-ref v0.53.1
Checking gix-negotiate v0.21.0
Compiling maybe-async v0.2.10
Checking regex v1.11.1
Compiling proc-macro-error-attr2 v2.0.0
Compiling portable-atomic v1.11.0
Checking arc-swap v1.7.1
Checking gix-odb v0.70.0
Checking gix-protocol v0.51.0
Compiling proc-macro-error2 v2.0.1
Compiling xattr v1.3.1
Compiling derive_more-impl v2.0.1
Compiling filetime v0.2.23
Checking uuid v1.20.0
Checking unicode-width v0.2.1
Checking bitflags v1.3.2
Checking bytes v1.11.1
Compiling litrs v0.4.1
Compiling document-features v0.2.11
Checking console v0.16.0
Checking crossterm v0.25.0
Checking derive_more v2.0.1
Compiling tar v0.4.40
Compiling git-ref-format-macro v0.6.0
Checking newline-converter v0.3.0
Checking snapbox-macros v0.3.8
Checking salsa20 v0.10.2
Checking fxhash v0.2.1
Checking clap_lex v0.7.5
Checking normalize-line-endings v0.3.0
Checking unit-prefix v0.5.1
Checking unicode-width v0.1.11
Compiling heck v0.5.0
Checking streaming-iterator v0.1.9
Checking siphasher v0.3.11
Checking strsim v0.11.1
Checking similar v2.5.0
Checking clap_builder v4.5.44
Checking snapbox v0.4.17
Checking bloomy v1.2.0
Compiling clap_derive v4.5.41
Checking inquire v0.7.5
Checking indicatif v0.18.0
Checking scrypt v0.11.0
Checking sqlite3-sys v0.15.2
Compiling radicle-surf v0.26.0
Checking sqlite v0.32.0
Checking radicle-crypto v0.14.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-crypto)
Checking git-ref-format v0.6.0
Checking crossterm v0.29.0
Checking unicode-display-width v0.3.0
Checking systemd-journal-logger v2.2.2
Checking toml_datetime v0.7.5+spec-1.1.0
Checking serde_spanned v1.0.4
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-python v0.23.4
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-rust v0.23.2
Checking pin-project-lite v0.2.16
Checking radicle-std-ext v0.2.0
Checking toml_writer v1.0.6+spec-1.1.0
Checking tokio v1.47.1
Checking toml v0.9.12+spec-1.1.0
Checking clap v4.5.44
Checking sysinfo v0.37.2
Checking diff v0.1.13
Checking yansi v0.5.1
Compiling radicle-node v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-node)
Compiling radicle-cli v0.17.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli)
Checking pretty_assertions v1.4.0
Checking human-panic v2.0.6
Checking clap_complete v4.5.60
Checking structured-logger v1.0.4
Checking radicle-systemd v0.11.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-systemd)
Checking tree-sitter-highlight v0.24.4
Checking itertools v0.14.0
Checking num-integer v0.1.46
Compiling qcheck-macros v1.0.0
Checking socket2 v0.5.7
Compiling escargot v0.5.10
Checking timeago v0.4.2
Checking lexopt v0.3.0
Checking bit-vec v0.8.0
Checking bit-set v0.8.0
Checking num-bigint v0.4.6
Checking rand_core v0.9.3
Compiling ahash v0.8.11
Checking num-iter v0.1.45
Checking num-complex v0.4.6
Checking env_filter v0.1.3
Checking borrow-or-share v0.2.2
Checking zerocopy v0.7.35
Checking fluent-uri v0.3.2
Checking num-rational v0.4.2
Checking env_logger v0.11.8
Checking num v0.4.3
Checking phf_shared v0.11.3
Compiling test-log-macros v0.2.19
Checking wait-timeout v0.2.1
Compiling paste v1.0.15
Checking outref v0.5.2
Checking quick-error v1.2.3
Checking vsimd v0.8.0
Checking ppv-lite86 v0.2.17
Checking fnv v1.0.7
Compiling radicle-remote-helper v0.14.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-remote-helper)
Checking rand_chacha v0.9.0
Checking uuid-simd v0.8.0
Checking rusty-fork v0.3.1
Checking test-log v0.2.19
Checking phf v0.11.3
Checking fraction v0.15.3
Checking referencing v0.30.0
Checking rand_xorshift v0.4.0
Checking rand v0.9.2
Checking fancy-regex v0.14.0
Checking email_address v0.2.9
Checking base64 v0.22.1
Checking bytecount v0.6.8
Checking unarray v0.1.4
Checking num-cmp v0.1.0
Checking emojis v0.6.4
Checking proptest v1.9.0
Checking jsonschema v0.30.0
Checking radicle-windows v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-windows)
Checking git2 v0.19.0
Checking radicle-oid v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-oid)
Checking radicle-git-ext v0.11.0
Checking radicle-term v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-term)
Checking radicle-cob v0.17.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cob)
Checking radicle-core v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-core)
Checking radicle v0.20.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle)
Checking radicle-fetch v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-fetch)
Checking radicle-cli-test v0.13.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli-test)
Checking radicle-schemars v0.6.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-schemars)
Checking radicle-protocol v0.4.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-protocol)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 43.88s
+ cargo build --all-targets --workspace
Compiling libc v0.2.174
Compiling cfg-if v1.0.0
Compiling memchr v2.7.2
Compiling shlex v1.3.0
Compiling typenum v1.17.0
Compiling serde_core v1.0.228
Compiling jobserver v0.1.31
Compiling getrandom v0.2.15
Compiling generic-array v0.14.7
Compiling rand_core v0.6.4
Compiling cc v1.2.2
Compiling regex-syntax v0.8.5
Compiling crypto-common v0.1.6
Compiling aho-corasick v1.1.3
Compiling serde v1.0.228
Compiling smallvec v1.15.1
Compiling regex-automata v0.4.9
Compiling thiserror v2.0.17
Compiling subtle v2.5.0
Compiling once_cell v1.21.3
Compiling stable_deref_trait v1.2.0
Compiling fastrand v2.3.0
Compiling cpufeatures v0.2.12
Compiling scopeguard v1.2.0
Compiling lock_api v0.4.14
Compiling parking_lot_core v0.9.12
Compiling block-buffer v0.10.4
Compiling bitflags v2.9.1
Compiling digest v0.10.7
Compiling parking_lot v0.12.5
Compiling tinyvec_macros v0.1.1
Compiling byteorder v1.5.0
Compiling tinyvec v1.6.0
Compiling crc32fast v1.5.0
Compiling gix-trace v0.1.13
Compiling home v0.5.9
Compiling typeid v1.0.3
Compiling zlib-rs v0.5.2
Compiling itoa v1.0.11
Compiling erased-serde v0.4.6
Compiling unicode-normalization v0.1.23
Compiling same-file v1.0.6
Compiling gix-utils v0.3.0
Compiling walkdir v2.5.0
Compiling bstr v1.12.0
Compiling zerofrom v0.1.6
Compiling prodash v30.0.1
Compiling gix-validate v0.10.0
Compiling serde_fmt v1.0.3
Compiling gix-path v0.10.20
Compiling value-bag-serde1 v1.11.1
Compiling yoke v0.7.5
Compiling zerovec v0.10.4
Compiling value-bag v1.11.1
Compiling log v0.4.27
Compiling hash32 v0.3.1
Compiling zeroize v1.7.0
Compiling heapless v0.8.0
Compiling tinystr v0.7.6
Compiling getrandom v0.3.3
Compiling litemap v0.7.5
Compiling writeable v0.5.5
Compiling libz-rs-sys v0.5.2
Compiling flate2 v1.1.1
Compiling icu_locid v1.5.0
Compiling faster-hex v0.10.0
Compiling gix-features v0.43.1
Compiling linux-raw-sys v0.9.4
Compiling icu_locid_transform_data v1.5.1
Compiling sha1 v0.10.6
Compiling icu_provider v1.5.0
Compiling block-padding v0.3.3
Compiling inout v0.1.3
Compiling sha1-checked v0.10.0
Compiling icu_locid_transform v1.5.0
Compiling icu_properties_data v1.5.1
Compiling icu_collections v1.5.0
Compiling gix-hash v0.19.0
Compiling rustix v1.0.7
Compiling icu_properties v1.5.1
Compiling cipher v0.4.4
Compiling icu_normalizer_data v1.5.1
Compiling utf16_iter v1.0.5
Compiling utf8_iter v1.0.4
Compiling write16 v1.0.0
Compiling percent-encoding v2.3.1
Compiling hashbrown v0.14.3
Compiling equivalent v1.0.1
Compiling form_urlencoded v1.2.1
Compiling sha2 v0.10.8
Compiling indexmap v2.2.6
Compiling ryu v1.0.17
Compiling libz-sys v1.1.16
Compiling thiserror v1.0.69
Compiling icu_normalizer v1.5.0
Compiling serde_json v1.0.140
Compiling idna_adapter v1.2.0
Compiling idna v1.0.3
Compiling url v2.5.4
Compiling tempfile v3.23.0
Compiling universal-hash v0.5.1
Compiling opaque-debug v0.3.1
Compiling ref-cast v1.0.24
Compiling dyn-clone v1.0.17
Compiling libgit2-sys v0.17.0+1.8.1
Compiling signature v1.6.4
Compiling ed25519 v1.5.3
Compiling aead v0.5.2
Compiling amplify_num v0.5.2
Compiling ct-codecs v1.1.1
Compiling ascii v1.1.0
Compiling ec25519 v0.1.0
Compiling num-traits v0.2.19
Compiling poly1305 v0.8.0
Compiling git-ref-format-core v0.6.0
Compiling chacha20 v0.9.1
Compiling amplify v4.6.0
Compiling schemars v1.0.4
Compiling cyphergraphy v0.3.0 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Compiling polyval v0.6.2
Compiling sqlite3-src v0.5.1
Compiling hmac v0.12.1
Compiling keccak v0.1.5
Compiling base64ct v1.6.0
Compiling sha3 v0.10.8
Compiling pem-rfc7468 v0.7.0
Compiling pbkdf2 v0.12.2
Compiling ghash v0.5.1
Compiling ctr v0.9.2
Compiling aes v0.8.4
Compiling rand v0.8.5
Compiling base32 v0.4.0
Compiling qcheck v1.0.0
Compiling cypheraddr v0.4.0 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Compiling aes-gcm v0.10.3
Compiling ssh-encoding v0.2.0
Compiling chacha20poly1305 v0.10.1
Compiling blowfish v0.9.1
Compiling cbc v0.1.2
Compiling data-encoding v2.5.0
Compiling ssh-cipher v0.2.0
Compiling data-encoding-macro v0.1.14
Compiling bcrypt-pbkdf v0.10.0
Compiling noise-framework v0.4.0 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Compiling socks5-client v0.4.1 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Compiling signature v2.2.0
Compiling base-x v0.2.11
Compiling ssh-key v0.6.6
Compiling multibase v0.9.1
Compiling cyphernet v0.5.2 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Compiling radicle-ssh v0.10.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-ssh)
Compiling crossbeam-utils v0.8.19
Compiling crossbeam-channel v0.5.15
Compiling jiff v0.2.15
Compiling lazy_static v1.5.0
Compiling nonempty v0.9.0
Compiling siphasher v1.0.1
Compiling anstyle-query v1.0.2
Compiling radicle-dag v0.10.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-dag)
Compiling radicle-git-metadata v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-git-metadata)
Compiling winnow v0.7.13
Compiling utf8parse v0.2.2
Compiling hashbrown v0.15.5
Compiling gix-hashtable v0.9.0
Compiling anstyle-parse v0.2.3
Compiling gix-date v0.10.5
Compiling gix-actor v0.35.4
Compiling radicle-git-ref-format v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-git-ref-format)
Compiling is_terminal_polyfill v1.70.2
Compiling base64 v0.21.7
Compiling iana-time-zone v0.1.60
Compiling anstyle v1.0.13
Compiling colorchoice v1.0.0
Compiling anstream v0.6.21
Compiling chrono v0.4.38
Compiling gix-object v0.50.2
Compiling colored v2.1.0
Compiling radicle-localtime v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-localtime)
Compiling serde-untagged v0.1.7
Compiling bytesize v2.0.1
Compiling memmap2 v0.9.8
Compiling fast-glob v0.3.3
Compiling dunce v1.0.5
Compiling tree-sitter-language v0.1.2
Compiling gix-chunk v0.4.11
Compiling adler2 v2.0.0
Compiling gix-fs v0.16.1
Compiling gix-commitgraph v0.29.0
Compiling gix-tempfile v18.0.0
Compiling gix-revwalk v0.21.0
Compiling mio v1.0.4
Compiling gix-quote v0.6.0
Compiling sem_safe v0.2.0
Compiling errno v0.3.13
Compiling unicode-segmentation v1.11.0
Compiling either v1.11.0
Compiling shell-words v1.1.0
Compiling gix-command v0.6.2
Compiling signals_receipts v0.2.0
Compiling gix-lock v18.0.0
Compiling gix-url v0.32.0
Compiling gix-config-value v0.15.1
Compiling gix-sec v0.12.0
Compiling signal-hook-registry v1.4.5
Compiling gimli v0.32.3
Compiling signal-hook v0.3.18
Compiling gix-prompt v0.11.1
Compiling object v0.37.3
Compiling addr2line v0.25.1
Compiling radicle-signals v0.11.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-signals)
Compiling gix-revision v0.35.0
Compiling gix-traverse v0.47.0
Compiling miniz_oxide v0.8.8
Compiling gix-diff v0.53.0
Compiling gix-packetline v0.19.1
Compiling mio v0.8.11
Compiling tree-sitter v0.24.4
Compiling rustc-demangle v0.1.26
Compiling rustix v0.38.34
Compiling backtrace v0.3.76
Compiling signal-hook-mio v0.2.4
Compiling gix-transport v0.48.0
Compiling gix-pack v0.60.0
Compiling gix-refspec v0.31.0
Compiling sqlite3-sys v0.15.2
Compiling sqlite v0.32.0
Compiling radicle-crypto v0.14.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-crypto)
Compiling gix-credentials v0.30.0
Compiling gix-shallow v0.5.0
Compiling gix-ref v0.53.1
Compiling convert_case v0.7.1
Compiling gix-negotiate v0.21.0
Compiling regex v1.11.1
Compiling arc-swap v1.7.1
Compiling gix-protocol v0.51.0
Compiling gix-odb v0.70.0
Compiling derive_more-impl v2.0.1
Compiling xattr v1.3.1
Compiling uuid v1.20.0
Compiling filetime v0.2.23
Compiling bitflags v1.3.2
Compiling bytes v1.11.1
Compiling unicode-width v0.2.1
Compiling console v0.16.0
Compiling crossterm v0.25.0
Compiling tar v0.4.40
Compiling git-ref-format-macro v0.6.0
Compiling derive_more v2.0.1
Compiling anyhow v1.0.82
Compiling portable-atomic v1.11.0
Compiling newline-converter v0.3.0
Compiling snapbox-macros v0.3.8
Compiling salsa20 v0.10.2
Compiling fxhash v0.2.1
Compiling unicode-width v0.1.11
Compiling similar v2.5.0
Compiling siphasher v0.3.11
Compiling clap_lex v0.7.5
Compiling streaming-iterator v0.1.9
Compiling strsim v0.11.1
Compiling unit-prefix v0.5.1
Compiling normalize-line-endings v0.3.0
Compiling snapbox v0.4.17
Compiling clap_builder v4.5.44
Compiling indicatif v0.18.0
Compiling bloomy v1.2.0
Compiling inquire v0.7.5
Compiling radicle-surf v0.26.0
Compiling scrypt v0.11.0
Compiling crossterm v0.29.0
Compiling git-ref-format v0.6.0
Compiling unicode-display-width v0.3.0
Compiling systemd-journal-logger v2.2.2
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-rust v0.23.2
Compiling tree-sitter-python v0.23.4
Compiling toml_datetime v0.7.5+spec-1.1.0
Compiling serde_spanned v1.0.4
Compiling pin-project-lite v0.2.16
Compiling radicle-std-ext v0.2.0
Compiling toml_writer v1.0.6+spec-1.1.0
Compiling tokio v1.47.1
Compiling toml v0.9.12+spec-1.1.0
Compiling clap v4.5.44
Compiling sysinfo v0.37.2
Compiling diff v0.1.13
Compiling radicle-cli v0.17.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli)
Compiling yansi v0.5.1
Compiling radicle-node v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-node)
Compiling pretty_assertions v1.4.0
Compiling human-panic v2.0.6
Compiling clap_complete v4.5.60
Compiling structured-logger v1.0.4
Compiling radicle-systemd v0.11.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-systemd)
Compiling tree-sitter-highlight v0.24.4
Compiling itertools v0.14.0
Compiling num-integer v0.1.46
Compiling socket2 v0.5.7
Compiling lexopt v0.3.0
Compiling timeago v0.4.2
Compiling bit-vec v0.8.0
Compiling escargot v0.5.10
Compiling bit-set v0.8.0
Compiling num-bigint v0.4.6
Compiling rand_core v0.9.3
Compiling num-iter v0.1.45
Compiling num-complex v0.4.6
Compiling env_filter v0.1.3
Compiling num-rational v0.4.2
Compiling zerocopy v0.7.35
Compiling borrow-or-share v0.2.2
Compiling fluent-uri v0.3.2
Compiling num v0.4.3
Compiling ahash v0.8.11
Compiling env_logger v0.11.8
Compiling phf_shared v0.11.3
Compiling wait-timeout v0.2.1
Compiling fnv v1.0.7
Compiling ppv-lite86 v0.2.17
Compiling vsimd v0.8.0
Compiling radicle-remote-helper v0.14.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-remote-helper)
Compiling quick-error v1.2.3
Compiling outref v0.5.2
Compiling rusty-fork v0.3.1
Compiling uuid-simd v0.8.0
Compiling rand_chacha v0.9.0
Compiling test-log v0.2.19
Compiling phf v0.11.3
Compiling referencing v0.30.0
Compiling fraction v0.15.3
Compiling rand v0.9.2
Compiling rand_xorshift v0.4.0
Compiling fancy-regex v0.14.0
Compiling email_address v0.2.9
Compiling base64 v0.22.1
Compiling bytecount v0.6.8
Compiling num-cmp v0.1.0
Compiling unarray v0.1.4
Compiling proptest v1.9.0
Compiling jsonschema v0.30.0
Compiling emojis v0.6.4
Compiling git2 v0.19.0
Compiling radicle-oid v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-oid)
Compiling radicle-git-ext v0.11.0
Compiling radicle-cob v0.17.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cob)
Compiling radicle-core v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-core)
Compiling radicle-term v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-term)
Compiling radicle v0.20.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle)
Compiling radicle-windows v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-windows)
Compiling radicle-fetch v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-fetch)
Compiling radicle-protocol v0.4.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-protocol)
Compiling radicle-cli-test v0.13.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli-test)
Compiling radicle-schemars v0.6.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-schemars)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 53.06s
+ cargo doc --workspace --no-deps --all-features
Checking regex-automata v0.4.9
Compiling syn v1.0.109
Checking idna v1.0.3
Compiling num-traits v0.2.19
Checking radicle-ssh v0.10.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-ssh)
Checking url v2.5.4
Checking git2 v0.19.0
Checking proptest v1.9.0
Checking bstr v1.12.0
Compiling amplify_syn v2.0.1
Checking gix-validate v0.10.0
Checking gix-path v0.10.20
Checking gix-features v0.43.1
Checking git-ref-format-core v0.6.0
Checking gix-hash v0.19.0
Compiling data-encoding-macro-internal v0.1.12
Checking radicle-git-ref-format v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-git-ref-format)
Checking gix-date v0.10.5
Checking radicle-oid v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-oid)
Compiling amplify_derive v4.0.0
Checking gix-actor v0.35.4
Checking gix-hashtable v0.9.0
Checking data-encoding-macro v0.1.14
Checking radicle-dag v0.10.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-dag)
Checking multibase v0.9.1
Checking gix-object v0.50.2
Checking radicle-git-metadata v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-git-metadata)
Checking chrono v0.4.38
Checking gix-commitgraph v0.29.0
Checking radicle-localtime v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-localtime)
Checking gix-fs v0.16.1
Checking gix-tempfile v18.0.0
Checking gix-revwalk v0.21.0
Checking gix-quote v0.6.0
Checking gix-lock v18.0.0
Checking gix-url v0.32.0
Checking gix-command v0.6.2
Checking gix-config-value v0.15.1
Checking gix-revision v0.35.0
Checking gix-traverse v0.47.0
Checking gix-prompt v0.11.1
Checking radicle-signals v0.11.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-signals)
Checking gix-diff v0.53.0
Checking gix-packetline v0.19.1
Checking amplify v4.6.0
Checking regex v1.11.1
Checking gix-pack v0.60.0
Checking gix-transport v0.48.0
Checking cyphergraphy v0.3.0 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking tree-sitter v0.24.4
Checking gix-credentials v0.30.0
Checking cypheraddr v0.4.0 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking noise-framework v0.4.0 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking git-ref-format v0.6.0
Checking gix-refspec v0.31.0
Checking socks5-client v0.4.1 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking gix-shallow v0.5.0
Checking cyphernet v0.5.2 (https://github.com/lorenzleutgeb/cyphernet.rs.git?branch=push-ooltwtzkpvlk#ca0fedca)
Checking gix-ref v0.53.1
Checking radicle-crypto v0.14.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-crypto)
Checking gix-negotiate v0.21.0
Checking radicle-git-ext v0.11.0
Checking gix-odb v0.70.0
Checking radicle-cob v0.17.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cob)
Checking radicle-core v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-core)
Checking uuid v1.20.0
Checking gix-protocol v0.51.0
Compiling radicle-cli v0.17.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli)
Checking human-panic v2.0.6
Checking radicle-surf v0.26.0
Checking radicle v0.20.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle)
Checking tree-sitter-toml-ng v0.6.0
Checking radicle-term v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-term)
Checking tree-sitter-highlight v0.24.4
Checking radicle-systemd v0.11.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-systemd)
Documenting radicle-systemd v0.11.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-systemd)
Documenting radicle v0.20.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle)
Documenting radicle-core v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-core)
Documenting radicle-cob v0.17.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cob)
Documenting radicle-term v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-term)
Documenting radicle-crypto v0.14.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-crypto)
Documenting radicle-signals v0.11.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-signals)
Documenting radicle-oid v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-oid)
Documenting radicle-git-ref-format v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-git-ref-format)
Documenting radicle-localtime v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-localtime)
Documenting radicle-ssh v0.10.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-ssh)
Documenting radicle-dag v0.10.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-dag)
Documenting radicle-git-metadata v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-git-metadata)
Documenting radicle-windows v0.1.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-windows)
Checking radicle-fetch v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-fetch)
Documenting radicle-cli v0.17.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli)
Documenting radicle-schemars v0.6.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-schemars)
Checking radicle-protocol v0.4.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-protocol)
Documenting radicle-protocol v0.4.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-protocol)
Documenting radicle-node v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-node)
Documenting radicle-fetch v0.16.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-fetch)
Documenting radicle-cli-test v0.13.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli-test)
Documenting radicle-remote-helper v0.14.0 (/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-remote-helper)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 8.94s
Generated /a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/doc/radicle/index.html and 21 other files
+ cargo test --workspace --no-fail-fast
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.13s
Running unittests src/lib.rs (target/debug/deps/radicle-d3b0be90f884b6d9)
running 236 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::tests::test_check_version ... ok
test cob::common::test::test_color ... ok
test cob::cache::migrations::_2::tests::test_patch_json_deserialization ... ok
test cob::common::test::test_title ... ok
test cob::common::test::test_emojis ... 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_remove_delegate_concurrent ... ok
test cob::identity::test::test_identity_reject_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_valid_identity ... ok
test cob::identity::test::test_identity_updates_concurrent ... ok
test cob::issue::test::test_embeds ... ok
test cob::issue::test::test_embeds_edit ... ok
test cob::issue::test::test_invalid_actions ... ok
test cob::identity::test::test_identity_updates_concurrent_outdated ... ok
test cob::issue::test::test_concurrency ... ok
test cob::issue::test::test_invalid_tx ... ok
test cob::issue::test::test_invalid_cob ... ok
test cob::issue::test::test_invalid_tx_reference ... ok
test cob::issue::test::test_issue_all ... ok
test cob::issue::test::test_issue_comment ... ok
test cob::issue::test::test_issue_create_and_assign ... ok
test cob::issue::test::test_issue_comment_redact ... ok
test cob::issue::test::test_issue_create_and_get ... ok
test cob::issue::test::test_issue_create_and_change_state ... 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::issue::test::test_issue_react ... ok
test cob::issue::test::test_issue_reply ... ok
test cob::patch::cache::tests::test_is_empty ... ok
test cob::patch::cache::tests::test_get ... ok
test cob::patch::cache::tests::test_find_by_revision ... 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_with_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_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_list_by_status ... ok
test cob::patch::test::test_patch_create_and_get ... ok
test cob::patch::cache::tests::test_remove ... 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::cache::tests::test_counts ... 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_remove_summary ... ok
test cob::patch::test::test_reactions_json_serialization ... ok
test cob::patch::test::test_patch_review_edit_comment ... ok
test cob::patch::test::test_revision_reaction ... ok
test cob::patch::test::test_revision_edit_redact ... ok
test cob::patch::test::test_revision_review_merge_redacted ... ok
test cob::stream::tests::test_all_from ... ok
test cob::stream::tests::test_all_from_until ... ok
test cob::stream::tests::test_all_until ... ok
test cob::stream::tests::test_regression_from_until ... ok
test cob::stream::tests::test_from_until ... 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::patch::test::test_patch_review_revision_redact ... 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 git::canonical::quorum::test::merge_base_commutative ... ok
test git::canonical::quorum::test::test_merge_bases ... ok
test cob::thread::tests::test_timeline ... ok
test git::canonical::rules::tests::test_deserialization ... ok
test git::canonical::rules::tests::test_deserialize_extensions ... ok
test git::canonical::rules::tests::test_order ... ok
test git::canonical::rules::tests::test_roundtrip ... ok
test git::canonical::rules::tests::test_canonical ... ok
test git::canonical::rules::tests::test_rule_validate_success ... ok
test git::canonical::rules::tests::test_special_branches ... ok
test git::canonical::tests::test_commit_quorum_fork_of_a_fork ... ok
test git::canonical::tests::test_commit_quorum_forked_merge_commits ... ok
test git::canonical::tests::test_commit_quorum_groups ... ok
test git::canonical::tests::test_commit_quorum_linear ... ok
test git::canonical::tests::test_commit_quorum_merges ... ok
test git::canonical::tests::test_commit_quorum_single ... ok
test git::canonical::tests::test_commit_quorum_three_way_fork ... ok
test git::canonical::tests::test_commit_quorum_two_way_fork ... ok
test git::canonical::tests::test_quorum_different_types ... ok
test git::canonical::rules::tests::test_rule_validate_failures ... ok
test git::canonical::tests::test_tag_quorum ... ok
test git::test::test_version_from_str ... ok
test git::test::test_version_ord ... ok
test identity::did::test::test_did_encode_decode ... ok
test identity::did::test::test_did_vectors ... ok
test cob::patch::test::test_patch_update ... ok
test identity::doc::test::test_canonical_doc ... ok
test identity::doc::test::test_canonical_example ... 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::doc::update::test::test_can_update_crefs ... ok
test identity::doc::update::test::test_cannot_include_default_branch_rule ... ok
test identity::doc::update::test::test_default_branch_rule_exists_after_verification ... 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 node::address::store::test::test_disconnected_ban ... ok
test git::canonical::tests::test_quorum_properties ... ok
test node::address::store::test::test_empty ... 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_duplicate ... ok
test node::address::store::test::test_insert_and_update ... ok
test node::address::store::test::test_remove_nothing ... ok
test node::command::test::command_result ... ok
test node::config::test::partial ... ok
test node::db::test::test_version ... ok
test node::features::test::test_operations ... ok
test node::address::store::test::test_node_aliases ... ok
test node::notifications::store::test::test_clear ... ok
test node::notifications::store::test::test_branch_notifications ... ok
test node::notifications::store::test::test_cob_notifications ... ok
test node::notifications::store::test::test_duplicate_notifications ... ok
test node::notifications::store::test::test_counts_by_repo ... 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_policy ... ok
test node::policy::store::test::test_repo_policies ... ok
test node::policy::store::test::test_node_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_duplicate ... ok
test node::routing::test::test_insert_and_remove ... 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_remove_redundant ... ok
test node::routing::test::test_update_existing_multi ... ok
test node::sync::announce::test::all_synced_nodes_are_preferred_seeds ... ok
test node::sync::announce::test::announcer_adapts_target_to_reach ... ok
test node::routing::test::test_prune ... ok
test node::sync::announce::test::announcer_preferred_seeds_or_replica_factor ... 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_synced_with_unknown_node ... ok
test node::sync::announce::test::announcer_reached_preferred_seeds ... ok
test node::sync::announce::test::announcer_with_replication_factor_zero_and_preferred_seeds ... ok
test node::sync::announce::test::announcer_timed_out ... ok
test node::sync::announce::test::construct_node_appears_in_multiple_input_sets ... ok
test node::sync::announce::test::construct_only_preferred_seeds_provided ... ok
test node::sync::announce::test::cannot_construct_announcer ... ok
test node::sync::announce::test::invariant_progress_should_match_state ... ok
test node::sync::announce::test::local_node_in_multiple_sets ... ok
test node::sync::announce::test::local_node_in_preferred_seeds ... ok
test node::sync::announce::test::local_node_in_synced_set ... ok
test node::sync::announce::test::local_node_only_in_all_sets_results_in_no_seeds_error ... ok
test node::sync::announce::test::local_node_in_unsynced_set ... ok
test node::sync::announce::test::preferred_seeds_already_synced ... ok
test node::sync::announce::test::synced_with_local_node_is_ignored ... ok
test node::sync::announce::test::synced_with_same_node_multiple_times ... ok
test node::sync::announce::test::timed_out_after_reaching_success ... ok
test node::sync::fetch::test::all_nodes_are_candidates ... ok
test node::sync::fetch::test::all_nodes_are_fetchable ... ok
test node::sync::fetch::test::could_not_reach_target ... ok
test node::sync::fetch::test::ignores_duplicates_and_local_node ... 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_preferred_seeds ... ok
test node::sync::test::ensure_replicas_construction ... ok
test node::sync::test::replicas_constrain_to ... ok
test node::test::test_alias ... ok
test node::test::test_command_result ... ok
test node::test::test_user_agent ... ok
test node::timestamp::tests::test_timestamp_max ... ok
test node::sync::fetch::test::reaches_target_of_replicas ... ok
test profile::test::canonicalize_home ... ok
test profile::test::test_config ... ok
test cob::thread::tests::prop_ordering ... ok
test rad::tests::test_fork ... ok
test rad::tests::test_checkout ... 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. 236 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.02s
Running unittests src/lib.rs (target/debug/deps/radicle_cli-5ef55ae06e62d51e)
running 46 tests
test commands::block::args::test::should_not_parse ... ok
test commands::block::args::test::should_parse_nid ... ok
test commands::clone::args::test::should_parse_rid_non_urn ... ok
test commands::block::args::test::should_parse_rid ... ok
test commands::clone::args::test::should_parse_rid_url ... ok
test commands::clone::args::test::should_parse_rid_urn ... ok
test commands::cob::args::test::should_allow_log_json_format ... ok
test commands::cob::args::test::should_allow_log_pretty_format ... ok
test commands::cob::args::test::should_allow_show_json_format ... ok
test commands::cob::args::test::should_allow_update_json_format ... ok
test commands::cob::args::test::should_not_allow_show_pretty_format ... ok
test commands::cob::args::test::should_not_allow_update_pretty_format ... ok
test commands::fork::args::test::should_parse_rid_non_urn ... ok
test commands::fork::args::test::should_not_parse_rid_url ... ok
test commands::fork::args::test::should_parse_rid_urn ... ok
test commands::id::args::test::should_not_parse_into_payload - should panic ... ok
test commands::id::args::test::should_not_clobber_payload_args ... ok
test commands::id::args::test::should_not_parse_single_payload ... ok
test commands::id::args::test::should_not_parse_single_payloads ... ok
test commands::id::args::test::should_parse_into_payload ... ok
test commands::init::args::test::should_not_parse_rid_url ... ok
test commands::id::args::test::should_parse_multiple_payloads ... ok
test commands::id::args::test::should_parse_single_payload ... ok
test commands::init::args::test::should_parse_rid_urn ... ok
test commands::init::args::test::should_parse_rid_non_urn ... ok
test commands::patch::review::builder::tests::test_review_comments_multiline ... ok
test commands::inspect::test::test_tree ... ok
test commands::patch::review::builder::tests::test_review_comments_basic ... ok
test commands::patch::review::builder::tests::test_review_comments_before ... ok
test commands::patch::review::builder::tests::test_review_comments_split_hunk ... ok
test commands::publish::args::test::should_not_parse_rid_url ... ok
test commands::publish::args::test::should_parse_rid_non_urn ... ok
test commands::publish::args::test::should_parse_rid_urn ... ok
test commands::watch::args::test::should_parse_ref_str ... ok
test git::pretty_diff::test::test_pretty ... ignored
test git::ddiff::tests::diff_encode_decode_ddiff_hunk ... ok
test terminal::args::test::should_not_parse ... ok
test git::unified_diff::test::test_diff_content_encode_decode_content ... ok
test terminal::args::test::should_parse_nid ... ok
test terminal::args::test::should_parse_rid ... ok
test terminal::format::test::test_bytes ... ok
test terminal::format::test::test_strip_comments ... ok
test terminal::patch::test::test_edit_display_message ... ok
test git::unified_diff::test::test_diff_encode_decode_diff ... ok
test terminal::patch::test::test_create_display_message ... ok
test terminal::patch::test::test_update_display_message ... ok
test result: ok. 45 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running unittests src/main.rs (target/debug/deps/rad-b1867e9acec466ba)
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-6eb1d888a74f688f)
running 111 tests
test framework_home ... ok
test git_push_and_fetch ... ok
test git_push_amend ... ok
test git_push_canonical_annotated_tags ... ok
test git_push_canonical_lightweight_tags ... ok
test git_push_force_with_lease ... 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_clone_bare ... ok
test rad_clean ... ok
test rad_clone_all ... ok
test rad_clone_unknown ... ok
test rad_clone_connect ... ok
test rad_clone_directory ... ok
test rad_cob_multiset ... ok
test rad_cob_log ... ok
test rad_cob_migrate ... ok
test rad_cob_operations ... ok
test rad_clone_partial_fail ... ok
test rad_cob_update_identity ... ok
test rad_config ... ok
test rad_cob_show ... ok
test rad_cob_update ... ok
test rad_diff ... ok
test rad_help ... 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_threshold_soft_fork ... ok
test rad_id_unauthorized_delegate ... ok
test rad_id_unknown_field ... ok
test rad_id_update_delete_field ... ok
test rad_init ... ignored, part of many other tests
test rad_init_bare ... ok
test rad_init_detached_head ... ok
test rad_init_existing ... ok
test rad_init_existing_bare ... ok
test rad_init_no_git ... ok
test rad_init_no_seed ... ok
test rad_init_private ... ok
test rad_inbox ... ok
test rad_fork ... ok
test rad_fetch ... ok
test rad_init_private_clone ... ok
test rad_init_private_no_seed ... ok
test rad_init_sync_not_connected ... ok
test rad_init_private_clone_seed ... ok
test rad_init_private_seed ... ok
test rad_init_with_existing_remote ... ok
test rad_init_sync_preferred ... ok
test rad_inspect ... ok
test rad_issue ... ok
test rad_jj_bare ... ok
test rad_jj_colocated_patch ... ok
test rad_key_mismatch ... ok
test rad_issue_list ... ok
test rad_merge_no_ff ... ok
test rad_merge_after_update ... ok
test rad_merge_via_push ... ok
test rad_node_connect ... ok
test rad_node_connect_without_address ... ok
test rad_patch ... ok
test rad_node ... 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_and_clone ... ok
test rad_patch_diff ... ok
test rad_init_sync_timeout ... ok
test rad_patch_draft ... ok
test rad_patch_edit ... ok
test rad_patch_fetch_2 ... FAILED
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_update ... ok
test rad_patch_via_push ... FAILED
test rad_patch_open_explore ... ok
test rad_publish ... ok
test rad_review_by_hunk ... ok
test rad_seed_and_follow ... ok
test rad_seed_many ... ok
test rad_remote ... ok
test rad_self ... ok
test rad_sync_without_node ... ok
test rad_push_and_pull_patches ... ok
test rad_unseed ... ok
test rad_warn_old_nodes ... ok
test rad_unseed_many ... ok
test rad_watch ... ok
test rad_sync ... 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_patch_fetch_2 stdout ----
1771201839 test: Using PATH ["/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli/target/debug", "/usr/local/cargo/bin", "/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin", "/tmp/.tmpc9kwKo/alice/work"]
1771201839 test: rad-init.md: Running `/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/debug/rad` with ["init", "--name", "heartwood", "--description", "Radicle Heartwood Protocol & Stack", "--no-confirm", "--public", "-v"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201839 test: rad-init.md: Running `/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/debug/rad` with ["init"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201839 test: rad-init.md: Running `/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/debug/rad` with ["ls"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201839 test: rad-init.md: Running `/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/debug/rad` with ["node", "inventory"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201839 test: Using PATH ["/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli/target/debug", "/usr/local/cargo/bin", "/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin", "/tmp/.tmpc9kwKo/alice/work"]
1771201839 test: rad-patch-fetch-2.md: Running `git` with ["checkout", "-b", "alice/1", "-q"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201839 test: rad-patch-fetch-2.md: Running `git` with ["commit", "--allow-empty", "-m", "Changes #1", "-q"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201840 test: rad-patch-fetch-2.md: Running `git` with ["push", "rad", "-o", "patch.message=Changes", "HEAD:refs/patches"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201840 test: rad-patch-fetch-2.md: Running `git` with ["checkout", "master", "-q"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201840 test: rad-patch-fetch-2.md: Running `git` with ["branch", "-D", "alice/1", "-q"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201840 test: rad-patch-fetch-2.md: Running `git` with ["update-ref", "-d", "refs/remotes/rad/alice/1"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201840 test: rad-patch-fetch-2.md: Running `git` with ["update-ref", "-d", "refs/remotes/rad/patches/5e2dedcc5d515fcbc1cca483d3376609fe889bfb"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201840 test: rad-patch-fetch-2.md: Running `git` with ["gc", "--prune=now"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201840 test: rad-patch-fetch-2.md: Running `git` with ["branch", "-r"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201840 test: rad-patch-fetch-2.md: Running `git` with ["pull"] in `/tmp/.tmpc9kwKo/alice/work`..
1771201840 test: rad-patch-fetch-2.md: Running `git` with ["branch", "-r"] in `/tmp/.tmpc9kwKo/alice/work`..
thread 'rad_patch_fetch_2' panicked at crates/radicle-cli-test/src/lib.rs:515:36:
--- Expected
++++ actual: stdout
1 - rad/HEAD -> rad/master
2 1 | rad/master
3 2 | rad/patches/5e2dedcc5d515fcbc1cca483d3376609fe889bfb
Exit status: 0
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
---- rad_patch_via_push stdout ----
1771201840 test: Using PATH ["/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli/target/debug", "/usr/local/cargo/bin", "/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin", "/tmp/.tmpuX9Dkh/alice/work"]
1771201840 test: rad-init.md: Running `/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/debug/rad` with ["init", "--name", "heartwood", "--description", "Radicle Heartwood Protocol & Stack", "--no-confirm", "--public", "-v"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-init.md: Running `/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/debug/rad` with ["init"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-init.md: Running `/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/debug/rad` with ["ls"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-init.md: Running `/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/debug/rad` with ["node", "inventory"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: Using PATH ["/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/crates/radicle-cli/target/debug", "/usr/local/cargo/bin", "/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin", "/tmp/.tmpuX9Dkh/alice/work"]
1771201841 test: rad-patch-via-push.md: Running `git` with ["checkout", "-b", "feature/1"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-patch-via-push.md: Running `git` with ["commit", "-a", "-m", "Add things", "-q", "--allow-empty"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-patch-via-push.md: Running `git` with ["push", "-o", "patch.message=Add things #1", "-o", "patch.message=See commits for details.", "rad", "HEAD:refs/patches"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-patch-via-push.md: Running `/a35f7e74-3dff-44cf-af43-d8ba5b587e38/w/target/debug/rad` with ["patch", "show", "6035d2f582afbe01ff23ea87528ae523d76875b6"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-patch-via-push.md: Running `git` with ["branch", "-vv"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-patch-via-push.md: Running `git` with ["status", "--short", "--branch"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-patch-via-push.md: Running `git` with ["fetch"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-patch-via-push.md: Running `git` with ["push"] in `/tmp/.tmpuX9Dkh/alice/work`..
1771201841 test: rad-patch-via-push.md: Running `git` with ["show-ref"] in `/tmp/.tmpuX9Dkh/alice/work`..
thread 'rad_patch_via_push' panicked at crates/radicle-cli-test/src/lib.rs:515:36:
--- Expected
++++ actual: stdout
1 1 | 42d894a83c9c356552a57af09ccdbd5587a99045 refs/heads/feature/1
2 2 | f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/heads/master
3 - f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/remotes/rad/HEAD
4 3 | f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/remotes/rad/master
5 4 | 42d894a83c9c356552a57af09ccdbd5587a99045 refs/remotes/rad/patches/6035d2f582afbe01ff23ea87528ae523d76875b6
Exit status: 0
failures:
rad_patch_fetch_2
rad_patch_via_push
test result: FAILED. 107 passed; 2 failed; 2 ignored; 0 measured; 0 filtered out; finished in 67.82s
error: test failed, to rerun pass `-p radicle-cli --test commands`
Running unittests src/lib.rs (target/debug/deps/radicle_cli_test-8ac65dc07dd3bb82)
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.00s
Running unittests src/lib.rs (target/debug/deps/radicle_cob-b961c32f9acb7a14)
running 9 tests
test object::tests::test_serde ... ok
test tests::git::roundtrip ... ok
test tests::git::list_cobs ... ok
test tests::git::update_cob ... ok
test type_name::test::invalid_typenames ... ok
test type_name::test::valid_typenames ... ok
test tests::git::traverse_cobs ... ok
test tests::invalid_parse_refstr ... ok
test tests::parse_refstr ... ok
test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running unittests src/lib.rs (target/debug/deps/radicle_core-e74bb77c247762df)
running 4 tests
test repo::test::valid ... ok
test repo::test::invalid ... ok
test repo::serde_impls::test::assert_prop_roundtrip_serde_json ... ok
test repo::test::assert_prop_roundtrip_parse ... ok
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_crypto-f12650156bad3cde)
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.81s
Running unittests src/lib.rs (target/debug/deps/radicle_dag-05f7457e7194a495)
running 20 tests
test tests::test_contains ... ok
test tests::test_dependencies ... ok
test tests::test_cycle ... ok
test tests::test_diamond ... ok
test tests::test_fold_diamond ... ok
test tests::test_fold_multiple_roots ... ok
test tests::test_complex ... ok
test tests::test_fold_reject ... ok
test tests::test_fold_sorting_1 ... ok
test tests::test_fold_sorting_2 ... ok
test tests::test_get ... ok
test tests::test_is_empty ... ok
test tests::test_len ... ok
test tests::test_merge_1 ... ok
test tests::test_merge_2 ... ok
test tests::test_prune_2 ... ok
test tests::test_prune_1 ... ok
test tests::test_prune_by_sorting ... ok
test tests::test_remove ... 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-d4af663fa3135019)
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_git_metadata-ccdb6d430095148e)
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_git_ref_format-09d2e35a065977f7)
running 9 tests
test test::component ... ok
test test::pattern ... ok
test test::qualified ... ok
test test::component_invalid - should panic ... ok
test test::qualified_invalid - should panic ... ok
test test::qualified_pattern_invalid - should panic ... ok
test test::qualified_pattern ... ok
test test::refname ... ok
test test::refname_invalid - should panic ... ok
test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_localtime-4456862f66617725)
running 1 test
test serde_impls::test::test_localtime ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_node-b6e016cb3eff271a)
running 74 tests
test reactor::timer::tests::test_next ... ok
test reactor::timer::tests::test_wake ... ok
test reactor::timer::tests::test_wake_exact ... ok
test control::tests::test_control_socket ... ok
test control::tests::test_seed_unseed ... ok
test fingerprint::tests::matching ... ok
test tests::e2e::missing_default_branch ... ok
test tests::e2e::missing_delegate_default_branch ... ok
test tests::e2e::test_catchup_on_refs_announcements ... ok
test tests::e2e::test_background_foreground_fetch ... ok
test tests::e2e::test_channel_reader_limit ... ok
test tests::e2e::test_clone ... 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_concurrent_fetches ... ok
test tests::e2e::test_fetch_preserve_owned_refs ... 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_fetch_emits_canonical_ref_update ... 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_replication_invalid ... ok
test tests::e2e::test_inventory_sync_bridge ... ok
test tests::e2e::test_replication_ref_in_sigrefs ... ok
test tests::e2e::test_inventory_sync_ring ... 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_rebroadcast_timestamp_filtered ... ok
test tests::test_announcement_relay ... ok
test tests::test_connection_kept_alive ... ok
test tests::test_disconnecting_unresponsive_peer ... ok
test tests::test_fetch_missing_inventory_on_gossip ... 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_maintain_connections_transient ... ok
test tests::test_outbound_connection ... ok
test tests::test_persistent_peer_connect ... ok
test tests::test_inventory_pruning ... 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_announcement_relay_public ... ok
test tests::test_refs_synced_event ... ok
test tests::test_seeding ... ok
test wire::test::test_inventory_ann_with_extension ... ok
test wire::test::test_pong_message_with_extension ... ok
test tests::test_seed_repo_subscribe ... ok
test tests::prop_inventory_exchange_dense ... ok
test tests::test_announcement_message_amplification ... ok
test result: ok. 74 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 16.27s
Running unittests src/main.rs (target/debug/deps/radicle_node-98db3eca10cd1f9a)
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_oid-028cdb253cf60541)
running 10 tests
test fmt::test::fixture ... ok
test git2::test::zero ... ok
test gix::test::zero ... ok
test fmt::test::zero ... ok
test fmt::test::git2 ... ok
test fmt::test::gix ... ok
test str::test::fixture ... ok
test str::test::zero ... ok
test str::test::gix_roundrip ... ok
test str::test::git2_roundtrip ... ok
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_protocol-b42a6c5cfcd48662)
running 100 tests
test deserializer::test::test_decode_next ... ok
test deserializer::test::test_unparsed ... ok
test deserializer::test::prop_decode_next ... ok
test fetcher::service::tests::test_fetch_coalescing_different_refs ... ok
test fetcher::test::queue::properties::capacity::bounded ... ok
test fetcher::test::queue::properties::capacity::rejection ... ok
test fetcher::test::queue::properties::dequeue::empty_queue_returns_none ... ok
test fetcher::test::queue::properties::dequeue::enables_reenqueue ... ok
test fetcher::test::queue::properties::dequeue::drained_queue_returns_none ... ok
test fetcher::test::queue::properties::capacity::capacity_reached_returns_same_item ... ok
test fetcher::test::queue::properties::capacity::restored_after_dequeue ... ok
test fetcher::test::queue::properties::fifo::interleaved_operations ... ok
test fetcher::test::queue::properties::fifo::ordering ... ok
test fetcher::test::queue::properties::equality::reflexive ... ok
test fetcher::test::queue::properties::merge::different_rid_accepted ... ok
test fetcher::test::queue::properties::equality::symmetric ... ok
test fetcher::test::queue::properties::merge::combines_refs ... ok
test fetcher::test::queue::properties::merge::longer_timeout_preserved ... ok
test fetcher::test::queue::properties::equality::transitive ... ok
test fetcher::test::queue::properties::merge::does_not_increase_queue_length ... ok
test fetcher::test::queue::unit::capacity_takes_precedence_over_merge_for_new_items ... ok
test fetcher::test::queue::unit::empty_refs_items_can_be_equal ... ok
test fetcher::test::queue::unit::max_timeout_accepted ... ok
test fetcher::test::queue::unit::merge_preserves_position_in_queue ... ok
test fetcher::test::queue::unit::zero_timeout_accepted ... ok
test fetcher::test::state::command::cancel::cancellation_is_isolated ... ok
test fetcher::test::state::command::cancel::non_existent_returns_unexpected ... ok
test fetcher::test::state::command::cancel::ongoing_and_queued ... ok
test fetcher::test::state::command::cancel::single_ongoing ... ok
test fetcher::test::state::command::fetch::fetch_after_previous_completed ... ok
test fetcher::test::state::command::fetch::fetch_at_capacity_enqueues ... ok
test fetcher::test::state::command::fetch::fetch_different_repo_same_node_within_capacity ... ok
test fetcher::test::state::command::fetch::fetch_duplicate_returns_already_fetching ... ok
test fetcher::test::state::command::fetch::fetch_queue_merge_empty_refs_fetches_all ... ok
test fetcher::test::state::command::fetch::fetch_queue_merge_takes_longer_timeout ... ok
test fetcher::test::state::command::fetch::fetch_queue_merges_already_queued ... ok
test fetcher::test::state::command::fetch::fetch_queue_rejected_capacity_reached ... ok
test fetcher::test::state::command::fetch::fetch_same_repo_different_nodes_queues_second ... ok
test fetcher::test::state::command::fetch::fetch_same_repo_different_refs_enqueues ... ok
test fetcher::test::state::command::fetch::fetch_start_first_fetch_for_node ... ok
test fetcher::test::state::command::fetched::complete_one_of_multiple ... ok
test fetcher::test::state::command::fetched::complete_single_ongoing ... ok
test fetcher::test::state::command::fetched::complete_then_dequeue_fifo ... ok
test fetcher::test::state::command::fetched::non_existent_returns_not_found ... ok
test fetcher::test::queue::properties::merge::empty_refs_fetches_all ... ok
test fetcher::test::state::concurrent::fetched_then_cancel ... ok
test fetcher::test::state::concurrent::interleaved_operations ... ok
test fetcher::test::state::config::min_queue_size ... ok
test fetcher::test::state::dequeue::cannot_dequeue_while_node_at_capacity ... ok
test fetcher::test::state::dequeue::empty_queue_returns_none ... ok
test fetcher::test::state::dequeue::maintains_fifo_order ... ok
test fetcher::test::state::invariant::queue_integrity_after_merge ... ok
test fetcher::test::queue::properties::merge::succeed_when_at_capacity ... ok
test fetcher::test::state::multinode::independent_queues ... ok
test service::filter::test::compatible ... ok
test service::filter::test::test_parameters ... ok
test fetcher::test::queue::properties::merge::same_rid_merges_anywhere_in_queue ... ok
test service::filter::test::test_sizes ... ok
test service::limiter::test::test_limitter_different_rates ... ok
test service::limiter::test::test_limitter_multi ... ok
test service::limiter::test::test_limitter_refill ... ok
test fetcher::test::state::config::high_concurrency ... ok
test service::gossip::store::test::test_announced ... ok
test service::message::tests::test_inventory_limit ... ok
test service::message::tests::test_ref_remote_limit ... ok
test wire::frame::test::test_encode_git_large ... ok
test wire::frame::test::test_stream_id ... ok
test fetcher::test::state::multinode::high_count ... ok
test wire::message::tests::prop_roundtrip_address ... ok
test service::message::tests::prop_refs_announcement_signing ... 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_ping_encode_size_overflow - should panic ... ok
test wire::message::tests::test_pingpong_encode_max_size ... ok
test wire::message::tests::test_pong_encode_size_overflow - should panic ... ok
test wire::message::tests::prop_roundtrip_message ... ok
test wire::tests::prop_oid ... ok
test wire::tests::prop_roundtrip_filter ... ok
test wire::tests::prop_roundtrip_publickey ... ok
test wire::tests::prop_roundtrip_refs ... ok
test wire::tests::prop_roundtrip_repoid ... ok
test wire::tests::prop_roundtrip_signed_refs ... ok
test wire::tests::prop_roundtrip_tuple ... ok
test wire::tests::prop_roundtrip_u16 ... ok
test wire::tests::prop_roundtrip_u32 ... ok
test wire::tests::prop_roundtrip_u64 ... ok
test wire::tests::prop_roundtrip_vec ... ok
test wire::tests::prop_signature ... ok
test wire::tests::prop_string ... ok
test wire::tests::test_alias ... ok
test wire::tests::test_bounded_vec_limit ... ok
test wire::tests::test_filter_invalid ... ok
test wire::tests::test_string ... ok
test wire::varint::test::prop_roundtrip_varint ... ok
test wire::varint::test::test_encode_overflow - should panic ... ok
test wire::varint::test::test_encoding ... ok
test wire::message::tests::test_refs_ann_max_size ... ok
test wire::message::tests::prop_message_decoder ... ok
test service::message::tests::test_node_announcement_validate ... ok
test result: ok. 100 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.57s
Running unittests src/main.rs (target/debug/deps/git_remote_rad-46389fb626688d18)
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-5e502d0a53fe1524)
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-bb66f1d798396f61)
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-ced840136c32d8e4)
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-26fc537364dfeb10)
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-84e75e992d83bd33)
running 21 tests
test ansi::tests::colors_enabled ... ok
test cell::test::test_width ... ok
test ansi::tests::wrapping ... ok
test element::test::test_spaced ... ok
test element::test::test_truncate ... ok
test ansi::tests::colors_disabled ... ok
test element::test::test_width ... ok
test table::test::test_table ... ok
test table::test::test_table_border ... ok
test table::test::test_table_border_maximized ... ok
test table::test::test_table_truncate ... ok
test table::test::test_table_unicode ... ok
test table::test::test_table_border_truncated ... ok
test table::test::test_table_unicode_truncate ... ok
test table::test::test_truncate ... ok
test textarea::test::test_wrapping ... ok
test textarea::test::test_wrapping_code_block ... ok
test textarea::test::test_wrapping_fenced_block ... ok
test vstack::test::test_vstack ... ok
test vstack::test::test_vstack_maximize ... ok
test textarea::test::test_wrapping_paragraphs ... ok
test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_windows-2c067555aa9e0165)
running 0 tests
test result: ok. 0 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) ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
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/stable.rs - backend::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_core
running 0 tests
test result: ok. 0 passed; 0 failed; 0 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_git_metadata
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_git_ref_format
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_localtime
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 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_oid
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_protocol
running 6 tests
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::max (line 96) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::truncate (line 50) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::push (line 122) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::collect_from (line 30) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::with_capacity (line 66) ... ok
test crates/radicle-protocol/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.30s
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.13s
Doc-tests radicle_windows
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
error: 1 target failed:
`-p radicle-cli --test commands`
Exit code: 101
{
"response": "finished",
"result": "failure"
}