rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwoodf74bb2262ab9028c5c094f7fbec53b81a757afa5
{
"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": "Created",
"patch": {
"id": "ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"title": "I2P Support",
"state": {
"status": "draft",
"conflicts": []
},
"before": "c06b00e330d82c8b8221cc8f8776c883208d159f",
"after": "f74bb2262ab9028c5c094f7fbec53b81a757afa5",
"commits": [
"f74bb2262ab9028c5c094f7fbec53b81a757afa5",
"1e90ee862042cd408908d2321e5529cdc7a29087"
],
"target": "c06b00e330d82c8b8221cc8f8776c883208d159f",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "",
"base": "c06b00e330d82c8b8221cc8f8776c883208d159f",
"oid": "f74bb2262ab9028c5c094f7fbec53b81a757afa5",
"timestamp": 1771118763
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "55a67d4d-9838-44f4-8893-28ed011702dd"
},
"info_url": "https://cci.rad.levitte.org//55a67d4d-9838-44f4-8893-28ed011702dd.html"
}
Started at: 2026-02-15 02:34:00.495252+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/55a67d4d-9838-44f4-8893-28ed011702dd/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 137 issues · 26 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25
✓ Switched to branch patch/ec8bf7a at revision ec8bf7a
✓ Branch patch/ec8bf7a setup to track rad/patches/ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout f74bb2262ab9028c5c094f7fbec53b81a757afa5
HEAD is now at f74bb226 I2P Support
Exit code: 0
$ rad patch show ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25 -p
╭──────────────────────────────────────────────────────────────────────╮
│ Title I2P Support │
│ Patch ec8bf7a23c4f1df9f4c548bc07ba234b0ad08c25 │
│ Author lorenz z6MkkPv…WX5sTEz │
│ Head f74bb2262ab9028c5c094f7fbec53b81a757afa5 │
│ Base c06b00e330d82c8b8221cc8f8776c883208d159f │
│ Branches patch/ec8bf7a │
│ Commits ahead 2, behind 0 │
│ Status draft │
├──────────────────────────────────────────────────────────────────────┤
│ f74bb22 I2P Support │
│ 1e90ee8 cargo: Add feature for Tor support │
├──────────────────────────────────────────────────────────────────────┤
│ ● Revision ec8bf7a @ f74bb22 by lorenz z6MkkPv…WX5sTEz 7 minutes ago │
╰──────────────────────────────────────────────────────────────────────╯
commit f74bb2262ab9028c5c094f7fbec53b81a757afa5
Author: Lorenz Leutgeb <lorenz.leutgeb@radicle.xyz>
Date: Sun Feb 15 02:13:04 2026 +0100
I2P Support
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 178073d68..2664a832b 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: Option<&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.
+ Some(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.
+ Some(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.
+ None => 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,13 @@ 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.
- Some(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) => {
- 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.
- None => {
- return Err(io::Error::new(
- io::ErrorKind::Unsupported,
- "no configuration found for .onion addresses",
- ));
- }
- },
+ (HostName::Tor(onion), proxy) => {
+ proxy_or_forward(config.onion.as_ref(), proxy, onion, remote_addr.port)?
+ }
+ #[cfg(feature = "i2p")]
+ (HostName::I2p(i2p), proxy) => {
+ proxy_or_forward(config.i2p.as_ref(), 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..2daa0f3dc 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"]
diff --git a/crates/radicle-protocol/src/service.rs b/crates/radicle-protocol/src/service.rs
index 916226640..c6fdefe4e 100644
--- a/crates/radicle-protocol/src/service.rs
+++ b/crates/radicle-protocol/src/service.rs
@@ -2630,6 +2630,8 @@ where
// Only consider onion addresses if configured.
#[cfg(feature = "tor")]
AddressType::Onion => self.config.onion.is_some(),
+ #[cfg(feature = "i2p")]
+ AddressType::I2p => self.config.i2p.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 65e17f4e2..6bdc5a199 100644
--- a/crates/radicle-protocol/src/wire.rs
+++ b/crates/radicle-protocol/src/wire.rs
@@ -62,6 +62,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] cyphernet::addr::i2p::I2pAddrParseError),
#[error("invalid timestamp: {actual_millis} millis")]
Timestamp { actual_millis: u64 },
@@ -266,6 +269,13 @@ impl Encode for cyphernet::addr::tor::OnionAddrV3 {
}
}
+#[cfg(feature = "i2p")]
+impl Encode for cyphernet::addr::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 +559,16 @@ impl Decode for tor::OnionAddrV3 {
}
}
+#[cfg(feature = "i2p")]
+impl Decode for cyphernet::addr::i2p::I2pAddr {
+ fn decode(buf: &mut impl Buf) -> Result<Self, Error> {
+ let s = String::decode(buf)?;
+ let addr = cyphernet::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..f6f11bd6a 100644
--- a/crates/radicle-protocol/src/wire/message.rs
+++ b/crates/radicle-protocol/src/wire/message.rs
@@ -83,6 +83,8 @@ pub enum AddressType {
Dns = 3,
#[cfg(feature = "tor")]
Onion = 4,
+ #[cfg(feature = "i2p")]
+ I2p = 5,
}
impl From<AddressType> for u8 {
@@ -99,6 +101,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 +118,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),
}
}
@@ -366,6 +372,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 +416,12 @@ impl wire::Decode for Address {
HostName::Tor(onion)
}
+ #[cfg(feature = "i2p")]
+ Ok(AddressType::I2p) => {
+ let i2p: cyphernet::addr::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/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 31dea336d..17d522507 100644
--- a/crates/radicle/src/node/config.rs
+++ b/crates/radicle/src/node/config.rs
@@ -355,7 +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")]
+#[cfg(any(feature = "tor", feature = "i2p"))]
pub enum AddressConfig {
/// Proxy connections to this address type.
Proxy {
@@ -436,6 +436,10 @@ pub struct Config {
#[cfg(feature = "tor")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub onion: Option<AddressConfig>,
+ /// I2P address config.
+ #[cfg(feature = "i2p")]
+ #[serde(default, skip_serializing_if = "Option::is_none")]
+ pub i2p: Option<AddressConfig>,
/// Peer-to-peer network.
#[serde(default)]
pub network: Network,
@@ -486,6 +490,8 @@ impl Config {
proxy: None,
#[cfg(feature = "tor")]
onion: None,
+ #[cfg(feature = "i2p")]
+ i2p: None,
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 88a9ee590..638fb1056 100644
--- a/crates/radicle/src/test/arbitrary.rs
+++ b/crates/radicle/src/test/arbitrary.rs
@@ -301,6 +301,10 @@ impl Arbitrary for Address {
);
cyphernet::addr::HostName::Tor(addr)
}
+ #[cfg(feature = "i2p")]
+ AddressType::I2p => {
+ todo!()
+ }
};
Address::from(cyphernet::addr::NetAddr {
commit 1e90ee862042cd408908d2321e5529cdc7a29087
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 55a67d4d-9838-44f4-8893-28ed011702dd -v /opt/radcis/ci.rad.levitte.org/cci/state/55a67d4d-9838-44f4-8893-28ed011702dd/s:/55a67d4d-9838-44f4-8893-28ed011702dd/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/55a67d4d-9838-44f4-8893-28ed011702dd/w:/55a67d4d-9838-44f4-8893-28ed011702dd/w -w /55a67d4d-9838-44f4-8893-28ed011702dd/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /55a67d4d-9838-44f4-8893-28ed011702dd/s/script.sh
+ export 'RUSTDOCFLAGS=-D warnings'
+ RUSTDOCFLAGS='-D warnings'
+ cargo --version
info: syncing channel updates for '1.90-x86_64-unknown-linux-gnu'
info: latest update on 2025-09-18, rust version 1.90.0 (1159e78c4 2025-09-14)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-src'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-src'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'
cargo 1.90.0 (840b83a10 2025-07-30)
+ rustc --version
rustc 1.90.0 (1159e78c4 2025-09-14)
+ cargo fmt --check
+ cargo clippy --all-targets --workspace -- --deny warnings
Updating crates.io index
Downloading crates ...
Downloaded home v0.5.9
Downloaded amplify_num v0.5.2
Downloaded bitflags v2.9.1
Downloaded ec25519 v0.1.0
Downloaded base-x v0.2.11
Downloaded env_filter v0.1.3
Downloaded gix-commitgraph v0.29.0
Downloaded idna_adapter v1.2.0
Downloaded document-features v0.2.11
Downloaded elliptic-curve v0.13.8
Downloaded fastrand v2.3.0
Downloaded errno v0.3.13
Downloaded either v1.11.0
Downloaded icu_properties v1.5.1
Downloaded newline-converter v0.3.0
Downloaded console v0.16.0
Downloaded generic-array v0.14.7
Downloaded lazy_static v1.5.0
Downloaded nu-ansi-term v0.50.3
Downloaded multibase v0.9.1
Downloaded radicle-std-ext v0.2.0
Downloaded once_cell v1.21.3
Downloaded paste v1.0.15
Downloaded pem-rfc7468 v0.7.0
Downloaded quick-error v1.2.3
Downloaded proc-macro-error-attr2 v2.0.0
Downloaded parking_lot_core v0.9.12
Downloaded serde-untagged v0.1.7
Downloaded quote v1.0.41
Downloaded rand_xorshift v0.4.0
Downloaded scrypt v0.11.0
Downloaded rfc6979 v0.4.0
Downloaded scopeguard v1.2.0
Downloaded schemars_derive v1.0.4
Downloaded serde_spanned v1.0.4
Downloaded serde_derive_internals v0.29.1
Downloaded signal-hook-mio v0.2.4
Downloaded rusty-fork v0.3.1
Downloaded signature v1.6.4
Downloaded shlex v1.3.0
Downloaded sval_dynamic v2.14.1
Downloaded signature v2.2.0
Downloaded siphasher v1.0.1
Downloaded sha2 v0.10.8
Downloaded socks5-client v0.4.1
Downloaded sval_json v2.14.1
Downloaded sval_fmt v2.14.1
Downloaded ssh-encoding v0.2.0
Downloaded sval_serde v2.14.1
Downloaded structured-logger v1.0.4
Downloaded sval_nested v2.14.1
Downloaded matchers v0.2.0
Downloaded sval_ref v2.14.1
Downloaded tempfile v3.23.0
Downloaded tinyvec_macros v0.1.1
Downloaded thread_local v1.1.9
Downloaded toml_datetime v0.7.5+spec-1.1.0
Downloaded thiserror-impl v2.0.17
Downloaded tree-sitter-highlight v0.24.4
Downloaded toml_writer v1.0.6+spec-1.1.0
Downloaded tree-sitter-json v0.24.8
Downloaded tree-sitter-html v0.23.2
Downloaded unarray v0.1.4
Downloaded unicode-display-width v0.3.0
Downloaded git-ref-format-core v0.6.0
Downloaded utf8_iter v1.0.4
Downloaded unit-prefix v0.5.1
Downloaded tinyvec v1.6.0
Downloaded value-bag-serde1 v1.11.1
Downloaded uuid-simd v0.8.0
Downloaded proptest v1.9.0
Downloaded zerofrom-derive v0.1.6
Downloaded zerovec-derive v0.10.3
Downloaded zeroize v1.7.0
Downloaded yoke-derive v0.7.5
Downloaded yoke v0.7.5
Downloaded gix-chunk v0.4.11
Downloaded regex v1.11.1
Downloaded uuid v1.20.0
Downloaded object v0.37.3
Downloaded unicode-segmentation v1.11.0
Downloaded keccak v0.1.5
Downloaded tree-sitter-python v0.23.4
Downloaded zerovec v0.10.4
Downloaded tracing-subscriber v0.3.22
Downloaded zerocopy v0.7.35
Downloaded write16 v1.0.0
Downloaded zlib-rs v0.5.2
Downloaded vcpkg v0.2.15
Downloaded tree-sitter-toml-ng v0.6.0
Downloaded tree-sitter-rust v0.23.2
Downloaded icu_provider v1.5.0
Downloaded indicatif v0.18.0
Downloaded libm v0.2.8
Downloaded inquire v0.7.5
Downloaded tracing v0.1.44
Downloaded tree-sitter-bash v0.23.3
Downloaded itertools v0.14.0
Downloaded winnow v0.7.13
Downloaded sysinfo v0.37.2
Downloaded tree-sitter-ruby v0.23.1
Downloaded icu_properties_data v1.5.1
Downloaded git2 v0.19.0
Downloaded gimli v0.32.3
Downloaded regex-automata v0.4.9
Downloaded hashbrown v0.15.5
Downloaded jsonschema v0.30.0
Downloaded hashbrown v0.14.3
Downloaded gix-pack v0.60.0
Downloaded sha1-checked v0.10.0
Downloaded icu_collections v1.5.0
Downloaded heapless v0.8.0
Downloaded sha3 v0.10.8
Downloaded indexmap v2.2.6
Downloaded idna v1.0.3
Downloaded gix-transport v0.48.0
Downloaded gix-ref v0.53.1
Downloaded getrandom v0.3.3
Downloaded fraction v0.15.3
Downloaded flate2 v1.1.1
Downloaded icu_normalizer_data v1.5.1
Downloaded icu_normalizer v1.5.0
Downloaded icu_locid v1.5.0
Downloaded gix-revision v0.35.0
Downloaded gix-protocol v0.51.0
Downloaded gix-odb v0.70.0
Downloaded gix-object v0.50.2
Downloaded gix-features v0.43.1
Downloaded jiff v0.2.15
Downloaded gix-diff v0.53.0
Downloaded fluent-uri v0.3.2
Downloaded libc v0.2.174
Downloaded tree-sitter-typescript v0.23.2
Downloaded tree-sitter-css v0.23.1
Downloaded tokio v1.47.1
Downloaded pkcs1 v0.7.5
Downloaded maybe-async v0.2.10
Downloaded libz-rs-sys v0.5.2
Downloaded jiff-static v0.2.15
Downloaded icu_locid_transform_data v1.5.1
Downloaded hmac v0.12.1
Downloaded group v0.13.0
Downloaded gix-traverse v0.47.0
Downloaded gix-tempfile v18.0.0
Downloaded gix-path v0.10.20
Downloaded gix-fs v0.16.1
Downloaded gix-command v0.6.2
Downloaded getrandom v0.2.15
Downloaded tree-sitter-md v0.3.2
Downloaded timeago v0.4.2
Downloaded spki v0.7.3
Downloaded pkcs8 v0.10.2
Downloaded pbkdf2 v0.12.2
Downloaded log v0.4.27
Downloaded lock_api v0.4.14
Downloaded litrs v0.4.1
Downloaded litemap v0.7.5
Downloaded lexopt v0.3.0
Downloaded jobserver v0.1.31
Downloaded gix-revwalk v0.21.0
Downloaded gix-refspec v0.31.0
Downloaded unicode-width v0.2.1
Downloaded rustix v1.0.7
Downloaded gix-sec v0.12.0
Downloaded rustix v0.38.34
Downloaded ff v0.13.0
Downloaded value-bag-sval2 v1.11.1
Downloaded utf8parse v0.2.2
Downloaded universal-hash v0.5.1
Downloaded tree-sitter-c v0.23.2
Downloaded syn v2.0.106
Downloaded linux-raw-sys v0.4.13
Downloaded iana-time-zone v0.1.60
Downloaded human-panic v2.0.6
Downloaded gix-url v0.32.0
Downloaded gix-credentials v0.30.0
Downloaded typeid v1.0.3
Downloaded tree-sitter-language v0.1.2
Downloaded libgit2-sys v0.17.0+1.8.1
Downloaded regex-syntax v0.8.5
Downloaded syn v1.0.109
Downloaded tree-sitter v0.24.4
Downloaded sha1 v0.10.6
Downloaded serde_fmt v1.0.3
Downloaded salsa20 v0.10.2
Downloaded unicode-normalization v0.1.23
Downloaded git-ref-format-macro v0.6.0
Downloaded url v2.5.4
Downloaded tree-sitter-go v0.23.4
Downloaded icu_locid_transform v1.5.0
Downloaded gix-packetline v0.19.1
Downloaded gix-hash v0.19.0
Downloaded heck v0.5.0
Downloaded yansi v0.5.1
Downloaded writeable v0.5.5
Downloaded walkdir v2.5.0
Downloaded wait-timeout v0.2.1
Downloaded vsimd v0.8.0
Downloaded value-bag v1.11.1
Downloaded ssh-key v0.6.6
Downloaded p384 v0.13.0
Downloaded zerofrom v0.1.6
Downloaded xattr v1.3.1
Downloaded version_check v0.9.4
Downloaded unicode-ident v1.0.12
Downloaded tracing-core v0.1.36
Downloaded gix-date v0.10.5
Downloaded utf16_iter v1.0.5
Downloaded linux-raw-sys v0.9.4
Downloaded unicode-width v0.1.11
Downloaded typenum v1.17.0
Downloaded toml v0.9.12+spec-1.1.0
Downloaded serde_json v1.0.140
Downloaded tracing-log v0.2.0
Downloaded thiserror v1.0.69
Downloaded tar v0.4.40
Downloaded fnv v1.0.7
Downloaded tinystr v0.7.6
Downloaded systemd-journal-logger v2.2.2
Downloaded thiserror-impl v1.0.69
Downloaded sqlite3-src v0.5.1
Downloaded is_terminal_polyfill v1.70.2
Downloaded thiserror v2.0.17
Downloaded test-log-macros v0.2.19
Downloaded test-log v0.2.19
Downloaded synstructure v0.13.1
Downloaded radicle-surf v0.26.0
Downloaded sval v2.14.1
Downloaded portable-atomic v1.11.0
Downloaded streaming-iterator v0.1.9
Downloaded gix-utils v0.3.0
Downloaded gix-quote v0.6.0
Downloaded gix-prompt v0.11.1
Downloaded sval_buffer v2.14.1
Downloaded socket2 v0.5.7
Downloaded snapbox v0.4.17
Downloaded gix-trace v0.1.13
Downloaded ssh-cipher v0.2.0
Downloaded sqlite v0.32.0
Downloaded serde v1.0.228
Downloaded similar v2.5.0
Downloaded schemars v1.0.4
Downloaded rsa v0.9.6
Downloaded rand v0.9.2
Downloaded rand v0.8.5
Downloaded git-ref-format v0.6.0
Downloaded subtle v2.5.0
Downloaded strsim v0.11.1
Downloaded stable_deref_trait v1.2.0
Downloaded sqlite3-sys v0.15.2
Downloaded spin v0.9.8
Downloaded smallvec v1.15.1
Downloaded signals_receipts v0.2.0
Downloaded signal-hook-registry v1.4.5
Downloaded sharded-slab v0.1.7
Downloaded bstr v1.12.0
Downloaded snapbox-macros v0.3.8
Downloaded signal-hook v0.3.18
Downloaded serde_core v1.0.228
Downloaded icu_provider_macros v1.5.0
Downloaded filetime v0.2.23
Downloaded rustc-demangle v0.1.26
Downloaded form_urlencoded v1.2.1
Downloaded p521 v0.13.3
Downloaded siphasher v0.3.11
Downloaded serde_derive v1.0.228
Downloaded gix-negotiate v0.21.0
Downloaded sec1 v0.7.3
Downloaded gix-validate v0.10.0
Downloaded prodash v30.0.1
Downloaded shell-words v1.1.0
Downloaded pretty_assertions v1.4.0
Downloaded num-bigint-dig v0.8.4
Downloaded sem_safe v0.2.0
Downloaded ryu v1.0.17
Downloaded inout v0.1.3
Downloaded gix-shallow v0.5.0
Downloaded ghash v0.5.1
Downloaded rand_core v0.9.3
Downloaded proc-macro2 v1.0.101
Downloaded gix-config-value v0.15.1
Downloaded referencing v0.30.0
Downloaded itoa v1.0.11
Downloaded same-file v1.0.6
Downloaded rand_chacha v0.9.0
Downloaded proc-macro-error2 v2.0.1
Downloaded rand_core v0.6.4
Downloaded qcheck v1.0.0
Downloaded num-bigint v0.4.6
Downloaded poly1305 v0.8.0
Downloaded memchr v2.7.2
Downloaded gix-actor v0.35.4
Downloaded ref-cast-impl v1.0.24
Downloaded ref-cast v1.0.24
Downloaded rand_chacha v0.3.1
Downloaded radicle-git-ext v0.11.0
Downloaded qcheck-macros v1.0.0
Downloaded pkg-config v0.3.30
Downloaded gix-lock v18.0.0
Downloaded num-traits v0.2.19
Downloaded mio v0.8.11
Downloaded ppv-lite86 v0.2.17
Downloaded pin-project-lite v0.2.16
Downloaded opaque-debug v0.3.1
Downloaded num v0.4.3
Downloaded hash32 v0.3.1
Downloaded chrono v0.4.38
Downloaded primeorder v0.13.6
Downloaded polyval v0.6.2
Downloaded libz-sys v1.1.16
Downloaded phf_shared v0.11.3
Downloaded phf v0.11.3
Downloaded percent-encoding v2.3.1
Downloaded p256 v0.13.2
Downloaded num-integer v0.1.46
Downloaded num-complex v0.4.6
Downloaded nonempty v0.9.0
Downloaded mio v1.0.4
Downloaded cc v1.2.2
Downloaded num-iter v0.1.45
Downloaded crossterm v0.29.0
Downloaded clap_builder v4.5.44
Downloaded parking_lot v0.12.5
Downloaded outref v0.5.2
Downloaded miniz_oxide v0.8.8
Downloaded gix-hashtable v0.9.0
Downloaded num-rational v0.4.2
Downloaded emojis v0.6.4
Downloaded num-cmp v0.1.0
Downloaded amplify v4.6.0
Downloaded memmap2 v0.9.8
Downloaded cypheraddr v0.4.0
Downloaded chacha20poly1305 v0.10.1
Downloaded normalize-line-endings v0.3.0
Downloaded noise-framework v0.4.0
Downloaded fancy-regex v0.14.0
Downloaded derive_more-impl v2.0.1
Downloaded crypto-bigint v0.5.5
Downloaded crossbeam-channel v0.5.15
Downloaded clap v4.5.44
Downloaded bytes v1.11.1
Downloaded email_address v0.2.9
Downloaded cyphernet v0.5.2
Downloaded crc32fast v1.5.0
Downloaded colored v2.1.0
Downloaded clap_derive v4.5.41
Downloaded cbc v0.1.2
Downloaded faster-hex v0.10.0
Downloaded ed25519 v1.5.3
Downloaded der v0.7.9
Downloaded cfg-if v1.0.0
Downloaded erased-serde v0.4.6
Downloaded ecdsa v0.16.9
Downloaded dyn-clone v1.0.17
Downloaded displaydoc v0.2.5
Downloaded bytesize v2.0.1
Downloaded byteorder v1.5.0
Downloaded bytecount v0.6.8
Downloaded anstream v0.6.21
Downloaded digest v0.10.7
Downloaded data-encoding-macro v0.1.14
Downloaded convert_case v0.7.1
Downloaded cipher v0.4.4
Downloaded borrow-or-share v0.2.2
Downloaded dunce v1.0.5
Downloaded cyphergraphy v0.3.0
Downloaded cpufeatures v0.2.12
Downloaded blowfish v0.9.1
Downloaded bitflags v1.3.2
Downloaded base32 v0.4.0
Downloaded base16ct v0.2.0
Downloaded equivalent v1.0.1
Downloaded env_logger v0.11.8
Downloaded diff v0.1.13
Downloaded data-encoding-macro-internal v0.1.12
Downloaded ct-codecs v1.1.1
Downloaded crypto-common v0.1.6
Downloaded crossbeam-utils v0.8.19
Downloaded clap_complete v4.5.60
Downloaded anyhow v1.0.82
Downloaded chacha20 v0.9.1
Downloaded bloomy v1.2.0
Downloaded data-encoding v2.5.0
Downloaded clap_lex v0.7.5
Downloaded aes-gcm v0.10.3
Downloaded fxhash v0.2.1
Downloaded fast-glob v0.3.3
Downloaded escargot v0.5.10
Downloaded crossterm v0.25.0
Downloaded bcrypt-pbkdf v0.10.0
Downloaded base64 v0.22.1
Downloaded const-oid v0.9.6
Downloaded block-buffer v0.10.4
Downloaded bit-vec v0.8.0
Downloaded base64ct v1.6.0
Downloaded arc-swap v1.7.1
Downloaded anstyle-query v1.0.2
Downloaded anstyle-parse v0.2.3
Downloaded anstyle v1.0.13
Downloaded derive_more v2.0.1
Downloaded ctr v0.9.2
Downloaded colorchoice v1.0.0
Downloaded block-padding v0.3.3
Downloaded base64 v0.21.7
Downloaded ahash v0.8.11
Downloaded aho-corasick v1.1.3
Downloaded aes v0.8.4
Downloaded aead v0.5.2
Downloaded adler2 v2.0.0
Downloaded autocfg v1.2.0
Downloaded addr2line v0.25.1
Downloaded bit-set v0.8.0
Downloaded backtrace v0.3.76
Downloaded ascii v1.1.0
Downloaded amplify_syn v2.0.1
Downloaded amplify_derive v4.0.0
Compiling libc v0.2.174
Compiling proc-macro2 v1.0.101
Compiling unicode-ident v1.0.12
Compiling quote v1.0.41
Checking cfg-if v1.0.0
Compiling shlex v1.3.0
Checking memchr v2.7.2
Compiling version_check v0.9.4
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
Compiling thiserror v2.0.17
Checking regex-automata v0.4.9
Checking subtle v2.5.0
Checking stable_deref_trait v1.2.0
Checking once_cell v1.21.3
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 parking_lot v0.12.5
Checking digest v0.10.7
Compiling crc32fast v1.5.0
Checking byteorder v1.5.0
Checking tinyvec_macros v0.1.1
Checking bitflags v2.9.1
Checking tinyvec v1.6.0
Checking gix-trace v0.1.13
Compiling typeid v1.0.3
Checking home v0.5.9
Compiling synstructure v0.13.1
Checking unicode-normalization v0.1.23
Checking gix-utils v0.3.0
Checking zlib-rs v0.5.2
Checking itoa v1.0.11
Checking bstr v1.12.0
Checking same-file v1.0.6
Compiling serde_derive v1.0.228
Compiling thiserror-impl v2.0.17
Compiling zerofrom-derive v0.1.6
Checking libz-rs-sys v0.5.2
Checking flate2 v1.1.1
Checking walkdir v2.5.0
Compiling yoke-derive v0.7.5
Checking zerofrom v0.1.6
Checking gix-validate v0.10.0
Checking prodash v30.0.1
Checking gix-path v0.10.20
Compiling zerovec-derive v0.10.3
Checking gix-features v0.43.1
Compiling displaydoc v0.2.5
Checking yoke v0.7.5
Compiling heapless v0.8.0
Compiling getrandom v0.3.3
Checking hash32 v0.3.1
Checking zeroize v1.7.0
Checking zerovec v0.10.4
Compiling pkg-config v0.3.30
Checking litemap v0.7.5
Compiling rustix v1.0.7
Checking writeable v0.5.5
Checking tinystr v0.7.6
Compiling icu_locid_transform_data v1.5.1
Checking icu_locid v1.5.0
Checking faster-hex v0.10.0
Compiling icu_provider_macros v1.5.0
Compiling icu_properties_data v1.5.1
Checking erased-serde v0.4.6
Checking serde_fmt v1.0.3
Checking linux-raw-sys v0.9.4
Checking icu_provider v1.5.0
Checking sha1 v0.10.6
Checking block-padding v0.3.3
Checking value-bag-serde1 v1.11.1
Checking value-bag v1.11.1
Compiling icu_normalizer_data v1.5.1
Checking icu_locid_transform v1.5.0
Checking inout v0.1.3
Checking log v0.4.27
Checking sha1-checked v0.10.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 utf8_iter v1.0.4
Checking utf16_iter v1.0.5
Checking write16 v1.0.0
Checking percent-encoding v2.3.1
Compiling thiserror v1.0.69
Compiling thiserror-impl v1.0.69
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 equivalent v1.0.1
Checking indexmap v2.2.6
Checking form_urlencoded v1.2.1
Checking sha2 v0.10.8
Compiling vcpkg v0.2.15
Compiling ref-cast v1.0.24
Checking ryu v1.0.17
Checking url v2.5.4
Compiling libz-sys v1.1.16
Checking tempfile v3.23.0
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
Checking signature v1.6.4
Compiling num-traits v0.2.19
Checking ed25519 v1.5.3
Compiling serde_derive_internals v0.29.1
Checking aead v0.5.2
Checking amplify_num v0.5.2
Compiling amplify_derive v4.0.0
Checking ct-codecs v1.1.1
Checking ascii v1.1.0
Checking ec25519 v0.1.0
Compiling schemars_derive v1.0.4
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
Checking polyval v0.6.2
Compiling sqlite3-src v0.5.1
Checking hmac v0.12.1
Checking keccak v0.1.5
Checking base64ct v1.6.0
Checking schemars v1.0.4
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
Compiling data-encoding-macro-internal v0.1.12
Checking qcheck v1.0.0
Checking aes-gcm v0.10.3
Checking ssh-encoding v0.2.0
Checking chacha20poly1305 v0.10.1
Checking cbc v0.1.2
Checking blowfish v0.9.1
Checking bcrypt-pbkdf v0.10.0
Checking ssh-cipher v0.2.0
Checking data-encoding-macro v0.1.14
Checking noise-framework v0.4.0
Checking socks5-client v0.4.1
Checking base-x v0.2.11
Checking signature v2.2.0
Compiling crossbeam-utils v0.8.19
Checking ssh-key v0.6.6
Checking multibase v0.9.1
Checking cyphernet v0.5.2
Checking radicle-ssh v0.10.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-ssh)
Checking lazy_static v1.5.0
Checking jiff v0.2.15
Checking crossbeam-channel v0.5.15
Checking nonempty v0.9.0
Checking siphasher v1.0.1
Checking anstyle-query v1.0.2
Checking radicle-git-metadata v0.1.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-git-metadata)
Checking radicle-dag v0.10.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-dag)
Checking winnow v0.7.13
Checking utf8parse v0.2.2
Checking hashbrown v0.15.5
Checking gix-date v0.10.5
Checking gix-hashtable v0.9.0
Checking anstyle-parse v0.2.3
Checking gix-actor v0.35.4
Checking radicle-git-ref-format v0.1.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-git-ref-format)
Checking is_terminal_polyfill v1.70.2
Checking base64 v0.21.7
Checking colorchoice v1.0.0
Checking iana-time-zone v0.1.60
Checking anstyle v1.0.13
Checking chrono v0.4.38
Checking anstream v0.6.21
Checking gix-object v0.50.2
Checking colored v2.1.0
Checking radicle-localtime v0.1.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/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 errno v0.3.13
Checking sem_safe v0.2.0
Checking either v1.11.0
Checking shell-words v1.1.0
Checking gix-command v0.6.2
Checking signals_receipts v0.2.0
Compiling signal-hook v0.3.18
Compiling object v0.37.3
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 (/55a67d4d-9838-44f4-8893-28ed011702dd/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 linux-raw-sys v0.4.13
Checking rustc-demangle v0.1.26
Compiling anyhow v1.0.82
Compiling unicode-segmentation v1.11.0
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-ref v0.53.1
Checking gix-shallow v0.5.0
Checking gix-negotiate v0.21.0
Compiling maybe-async v0.2.10
Checking regex v1.11.1
Compiling proc-macro-error-attr2 v2.0.0
Compiling portable-atomic v1.11.0
Checking arc-swap v1.7.1
Checking gix-odb v0.70.0
Compiling proc-macro-error2 v2.0.1
Checking gix-protocol v0.51.0
Compiling xattr v1.3.1
Compiling derive_more-impl v2.0.1
Compiling filetime v0.2.23
Checking uuid v1.20.0
Checking bytes v1.11.1
Checking bitflags v1.3.2
Compiling litrs v0.4.1
Checking unicode-width v0.2.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 unicode-width v0.1.11
Compiling heck v0.5.0
Checking normalize-line-endings v0.3.0
Checking strsim v0.11.1
Checking siphasher v0.3.11
Checking similar v2.5.0
Checking unit-prefix v0.5.1
Checking clap_lex v0.7.5
Checking sqlite3-sys v0.15.2
Checking streaming-iterator v0.1.9
Checking sqlite v0.32.0
Checking snapbox v0.4.17
Checking radicle-crypto v0.14.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-crypto)
Checking clap_builder v4.5.44
Checking indicatif v0.18.0
Checking bloomy v1.2.0
Compiling clap_derive v4.5.41
Checking inquire v0.7.5
Compiling radicle-surf v0.26.0
Checking scrypt v0.11.0
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 serde_spanned v1.0.4
Checking toml_datetime v0.7.5+spec-1.1.0
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-python v0.23.4
Compiling tree-sitter-rust v0.23.2
Checking toml_writer v1.0.6+spec-1.1.0
Checking radicle-std-ext v0.2.0
Checking pin-project-lite v0.2.16
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
Compiling radicle-node v0.16.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-node)
Checking yansi v0.5.1
Compiling radicle-cli v0.17.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/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 (/55a67d4d-9838-44f4-8893-28ed011702dd/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 num v0.4.3
Checking env_logger v0.11.8
Checking phf_shared v0.11.3
Compiling test-log-macros v0.2.19
Checking wait-timeout v0.2.1
Checking fnv v1.0.7
Checking vsimd v0.8.0
Compiling radicle-remote-helper v0.14.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-remote-helper)
Checking outref v0.5.2
Compiling paste v1.0.15
Checking quick-error v1.2.3
Checking ppv-lite86 v0.2.17
Checking rusty-fork v0.3.1
Checking uuid-simd v0.8.0
Checking test-log v0.2.19
Checking phf v0.11.3
Checking referencing v0.30.0
Checking rand_chacha v0.9.0
Checking fraction v0.15.3
Checking rand_xorshift v0.4.0
Checking rand v0.9.2
Checking fancy-regex v0.14.0
Checking email_address v0.2.9
Checking unarray v0.1.4
Checking num-cmp v0.1.0
Checking base64 v0.22.1
Checking bytecount v0.6.8
Checking proptest v1.9.0
Checking emojis v0.6.4
Checking jsonschema v0.30.0
Checking radicle-windows v0.1.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-windows)
Checking git2 v0.19.0
Checking radicle-oid v0.1.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-oid)
Checking radicle-git-ext v0.11.0
Checking radicle-term v0.16.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-term)
Checking radicle-cob v0.17.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-cob)
Checking radicle-core v0.1.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-core)
Checking radicle v0.20.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle)
Checking radicle-fetch v0.16.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-fetch)
Checking radicle-cli-test v0.13.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-cli-test)
Checking radicle-schemars v0.6.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-schemars)
Checking radicle-protocol v0.4.0 (/55a67d4d-9838-44f4-8893-28ed011702dd/w/crates/radicle-protocol)
error[E0412]: cannot find type `I2pAddrParseError` in module `cyphernet::addr::i2p`
--> crates/radicle-protocol/src/wire.rs:67:43
|
67 | I2pAddr(#[from] cyphernet::addr::i2p::I2pAddrParseError),
| ^^^^^^^^^^^^^^^^^ not found in `cyphernet::addr::i2p`
For more information about this error, try `rustc --explain E0412`.
error: could not compile `radicle-protocol` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...
error: could not compile `radicle-protocol` (lib test) due to 1 previous error
Exit code: 101
{
"response": "finished",
"result": "failure"
}