rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood8a428e55f8a346cf81b8a39f953b8f516363d462
{
"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:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
]
},
"action": "Created",
"patch": {
"id": "a2abb3386e7085ed8a21d0041f660151f4f32fab",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"title": "fetch: improve the fetch protocol",
"state": {
"status": "merged",
"conflicts": []
},
"before": "a48081f2717f069d456ec09f31d9e639b232dbed",
"after": "8a428e55f8a346cf81b8a39f953b8f516363d462",
"commits": [
"8a428e55f8a346cf81b8a39f953b8f516363d462",
"5636f4a55eff64f87c3398643e3ab14b2112eff3",
"abdb57c44dbb43b3315c83f91185574c771f0c2d",
"ecb69a45b9d6167b19131bd2411358fbcc7d418d",
"336ac1f52747bc8b2ddb5d8bf98960458b6728d4",
"83b1d66671b609cfd38d58b95cf56cfc207e71d2"
],
"target": "3fc92f83fe089263c470b328414d923227cf0e4a",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "a2abb3386e7085ed8a21d0041f660151f4f32fab",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"description": "Logging the stages of the fetch protocol is added to get some insight\nof how far a fetch gets, while also providing some simple timings\nusing `Instant::elapsed`.\n\nThis allowed me to run a local client version of this fetch protocol\nand see what was happening. The 9s timeout was hit for the channel\nmethods. So this was increased to 30s.\n\nFrom there, I was able to see that a `rad clone` of an offending\nrepository was actually \"finishing\" but the final error would say that\nthe other side had disconnected. This lead to the realisation that the\ncall to `done` can be a fire and forget -- log the error and continue\non with validation and refdb updates. I was then able to confirm that\nthe clone of the offending repository was able to be performed.",
"base": "a48081f2717f069d456ec09f31d9e639b232dbed",
"oid": "dadd98eb701eb635308bccd8001ba9b40f1f436b",
"timestamp": 1709811527
},
{
"id": "89f9c3f20c7c6e351d8163d23eaa154af6b54442",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"description": "Changes:\n- Change timings from seconds to milliseconds\n- Downgrade noisy debug logs to trace",
"base": "a48081f2717f069d456ec09f31d9e639b232dbed",
"oid": "8a428e55f8a346cf81b8a39f953b8f516363d462",
"timestamp": 1709817965
},
{
"id": "678067c6d51f994d6fabe96ddc99623c48965a71",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"description": "Rebase, fix logs.",
"base": "87d1cb50a0cb59cc0428425d1afb0ccfd889b36e",
"oid": "a8b233f4774ac5517aa69297b315e7176b87ce83",
"timestamp": 1710153609
},
{
"id": "f3453a88d3f7badafa20943f5777f2ed4d83e0a2",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"description": "Fix commit authorship.",
"base": "87d1cb50a0cb59cc0428425d1afb0ccfd889b36e",
"oid": "b1435629f9b2e5d592971350d15162cc1e9b427d",
"timestamp": 1710153776
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "88620ec2-b3b5-47d0-bf77-530adfe6738d"
},
"info_url": "https://cci.rad.levitte.org//88620ec2-b3b5-47d0-bf77-530adfe6738d.html"
}
Started at: 2026-09-08 01:53:28.468650+02:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ 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/88620ec2-b3b5-47d0-bf77-530adfe6738d/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 189 issues · 38 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout a2abb3386e7085ed8a21d0041f660151f4f32fab
✓ Switched to branch patch/a2abb33 at revision 89f9c3f
✓ Branch patch/a2abb33 setup to track rad/patches/a2abb3386e7085ed8a21d0041f660151f4f32fab
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 8a428e55f8a346cf81b8a39f953b8f516363d462
HEAD is now at 8a428e55 fetch: re-work transport::done signal call
Exit code: 0
$ rad patch show a2abb3386e7085ed8a21d0041f660151f4f32fab -p
╭────────────────────────────────────────────────────────────────────────────────╮
│ Title fetch: improve the fetch protocol │
│ Patch a2abb3386e7085ed8a21d0041f660151f4f32fab │
│ Author fintohaps z6Mkire…SQZ3voM │
│ Head 8a428e55f8a346cf81b8a39f953b8f516363d462 │
│ Base a48081f2717f069d456ec09f31d9e639b232dbed │
│ Target master │
│ Branches patch/a2abb33 │
│ Commits ahead 6, behind 1584 │
│ Status merged │
│ │
│ Logging the stages of the fetch protocol is added to get some insight │
│ of how far a fetch gets, while also providing some simple timings │
│ using `Instant::elapsed`. │
│ │
│ This allowed me to run a local client version of this fetch protocol │
│ and see what was happening. The 9s timeout was hit for the channel │
│ methods. So this was increased to 30s. │
│ │
│ From there, I was able to see that a `rad clone` of an offending │
│ repository was actually "finishing" but the final error would say that │
│ the other side had disconnected. This lead to the realisation that the │
│ call to `done` can be a fire and forget -- log the error and continue │
│ on with validation and refdb updates. I was then able to confirm that │
│ the clone of the offending repository was able to be performed. │
├────────────────────────────────────────────────────────────────────────────────┤
│ 8a428e5 fetch: re-work transport::done signal call │
│ 5636f4a fetch: log handshake error │
│ abdb57c fetch: add logging for stages │
│ ecb69a4 node: downgrade log statements │
│ 336ac1f node: increase timeouts │
│ 83b1d66 node: remove unused timeout │
├────────────────────────────────────────────────────────────────────────────────┤
│ ● Revision a2abb33 @ a48081f..dadd98e by fintohaps z6Mkire…SQZ3voM 2 years ago │
│ ↑ Revision 89f9c3f @ a48081f..8a428e5 by fintohaps z6Mkire…SQZ3voM 2 years ago │
│ ↑ Revision 678067c @ 87d1cb5..a8b233f by cloudhead z6MksFq…bS9wzpT 2 years ago │
│ ↑ Revision f3453a8 @ 87d1cb5..b143562 by cloudhead z6MksFq…bS9wzpT 2 years ago │
│ └─ ✓ merged by cloudhead z6MksFq…bS9wzpT │
╰────────────────────────────────────────────────────────────────────────────────╯
commit 8a428e55f8a346cf81b8a39f953b8f516363d462
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Thu Mar 7 11:29:28 2024 +0000
fetch: re-work transport::done signal call
The protocol requires that the fetcher signals to the remote that it
is done with the fetching process, so that the remote can exit out of
its upload-pack process.
The first change is that the `done` signal can happen before the
validation, since nothing else needs to be fetched.
The second change is that the fetcher does not care if the remote
responds to this signal since it has the data required for validation
and applying the changes to its refdb. Thus, if an error is
encountered then it is logged, but the rest of the process proceeds as
normal.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-fetch/src/state.rs b/radicle-fetch/src/state.rs
index 1035e40a3..c35ba91aa 100644
--- a/radicle-fetch/src/state.rs
+++ b/radicle-fetch/src/state.rs
@@ -441,6 +441,16 @@ impl FetchState {
start.elapsed().as_millis()
);
+ // N.b. signal to exit the upload-pack sequence
+ // We're finished fetching on this side, and all that's left
+ // is validation.
+ match handle.transport.done() {
+ Ok(()) => log::debug!(target: "fetch", "sent done signal to remote"),
+ Err(err) => {
+ log::warn!(target: "fetch", "attempted to send done to remote {remote}: {err}")
+ }
+ }
+
// Run validation of signed refs, pruning any offending
// remotes from the tips, thus not updating the production Git
// repository.
@@ -543,9 +553,6 @@ impl FetchState {
}
}
}
- // N.b. signal to exit the upload-pack sequence
- handle.transport.done()?;
-
log::debug!(
target: "fetch",
"validated {} remotes ({}ms)",
commit 5636f4a55eff64f87c3398643e3ab14b2112eff3
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Thu Mar 7 11:28:10 2024 +0000
fetch: log handshake error
When performing a handshake, the error source is hidden in the error
variant and never shown.
To get insight as to what the error was, it is logged when it is
encounterd.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-fetch/src/lib.rs b/radicle-fetch/src/lib.rs
index cbb6dbddd..cb78b1046 100644
--- a/radicle-fetch/src/lib.rs
+++ b/radicle-fetch/src/lib.rs
@@ -9,6 +9,7 @@ mod refs;
mod stage;
mod state;
+use gix_protocol::handshake;
pub use handle::Handle;
pub use policy::{Allowed, BlockList, Scope};
use radicle::storage::ReadRepository as _;
@@ -62,10 +63,7 @@ where
if local == remote {
return Err(Error::ReplicateSelf);
}
- let handshake = handle
- .transport
- .handshake()
- .map_err(|err| Error::Handshake { err })?;
+ let handshake = perform_handshake(handle)?;
let state = FetchState::default();
// N.b. ensure that we ignore the local peer's key.
@@ -99,10 +97,7 @@ where
if *handle.local() == remote {
return Err(Error::ReplicateSelf);
}
- let handshake = handle
- .transport
- .handshake()
- .map_err(|err| Error::Handshake { err })?;
+ let handshake = perform_handshake(handle)?;
let state = FetchState::default();
let result = state
.run(handle, &handshake, limit, remote, None)
@@ -116,3 +111,13 @@ where
);
result
}
+
+fn perform_handshake<S>(handle: &mut Handle<S>) -> Result<handshake::Outcome, Error>
+where
+ S: transport::ConnectionStream,
+{
+ handle.transport.handshake().map_err(|err| {
+ log::warn!(target: "fetch", "failed to perform handshake: {err}");
+ Error::Handshake { err }
+ })
+}
commit abdb57c44dbb43b3315c83f91185574c771f0c2d
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Thu Mar 7 09:42:43 2024 +0000
fetch: add logging for stages
Log when different stages of the fetch have completed, while also
providing the elapsed time, in seconds.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-fetch/src/lib.rs b/radicle-fetch/src/lib.rs
index 376e2bb22..cbb6dbddd 100644
--- a/radicle-fetch/src/lib.rs
+++ b/radicle-fetch/src/lib.rs
@@ -11,10 +11,12 @@ mod state;
pub use handle::Handle;
pub use policy::{Allowed, BlockList, Scope};
+use radicle::storage::ReadRepository as _;
pub use state::{FetchLimit, FetchResult};
pub use transport::Transport;
use std::io;
+use std::time::Instant;
use radicle::crypto::PublicKey;
use radicle::storage::refs::RefsAt;
@@ -55,6 +57,7 @@ pub fn pull<S>(
where
S: transport::ConnectionStream,
{
+ let start = Instant::now();
let local = *handle.local();
if local == remote {
return Err(Error::ReplicateSelf);
@@ -67,9 +70,17 @@ where
// N.b. ensure that we ignore the local peer's key.
handle.blocked.extend([local]);
- state
+ let result = state
.run(handle, &handshake, limit, remote, refs_at)
- .map_err(Error::Protocol)
+ .map_err(Error::Protocol);
+
+ log::debug!(
+ target: "fetch",
+ "finished pull of {} ({}ms)",
+ handle.repo.id(),
+ start.elapsed().as_millis()
+ );
+ result
}
/// Clone changes from the `remote`.
@@ -84,6 +95,7 @@ pub fn clone<S>(
where
S: transport::ConnectionStream,
{
+ let start = Instant::now();
if *handle.local() == remote {
return Err(Error::ReplicateSelf);
}
@@ -92,7 +104,15 @@ where
.handshake()
.map_err(|err| Error::Handshake { err })?;
let state = FetchState::default();
- state
+ let result = state
.run(handle, &handshake, limit, remote, None)
- .map_err(Error::Protocol)
+ .map_err(Error::Protocol);
+
+ log::debug!(
+ target: "fetch",
+ "finished clone of {} ({}ms)",
+ handle.repo.id(),
+ start.elapsed().as_millis(),
+ );
+ result
}
diff --git a/radicle-fetch/src/state.rs b/radicle-fetch/src/state.rs
index fd82cd364..1035e40a3 100644
--- a/radicle-fetch/src/state.rs
+++ b/radicle-fetch/src/state.rs
@@ -1,4 +1,5 @@
use std::collections::{BTreeMap, BTreeSet};
+use std::time::Instant;
use gix_protocol::handshake;
use radicle::crypto::PublicKey;
@@ -378,6 +379,7 @@ impl FetchState {
where
S: transport::ConnectionStream,
{
+ let start = Instant::now();
// N.b. we always fetch the `rad/id` since our delegate set
// might be further ahead than theirs, e.g. we are the
// deciding vote on adding a delegate.
@@ -389,6 +391,7 @@ impl FetchState {
limit: limit.special,
},
)?;
+ log::debug!(target: "fetch", "fetched rad/id ({}ms)", start.elapsed().as_millis());
// N.b. The error case here should not happen. In the case of
// a `clone` we have asked for refs/rad/id and ensured it was
@@ -418,6 +421,12 @@ impl FetchState {
remote,
refs_at,
)?;
+ log::debug!(
+ target: "fetch",
+ "fetched rad/sigrefs for {} remotes ({}ms)",
+ signed_refs.len(),
+ start.elapsed().as_millis()
+ );
let data_refs = stage::DataRefs {
remote,
@@ -425,6 +434,12 @@ impl FetchState {
limit: limit.refs,
};
self.run_stage(handle, handshake, &data_refs)?;
+ log::debug!(
+ target: "fetch",
+ "fetched data refs for {} remotes ({}ms)",
+ data_refs.remotes.len(),
+ start.elapsed().as_millis()
+ );
// Run validation of signed refs, pruning any offending
// remotes from the tips, thus not updating the production Git
@@ -528,9 +543,15 @@ impl FetchState {
}
}
}
-
// N.b. signal to exit the upload-pack sequence
handle.transport.done()?;
+
+ log::debug!(
+ target: "fetch",
+ "validated {} remotes ({}ms)",
+ remotes.len(),
+ start.elapsed().as_millis()
+ );
// N.b. only apply to Git repository if no delegates have failed verification.
if failures.is_empty() {
@@ -541,12 +562,20 @@ impl FetchState {
.into_values()
.flat_map(|ups| ups.into_iter()),
)?;
+ log::debug!(target: "fetch", "applied updates ({}ms)", start.elapsed().as_millis());
Ok(FetchResult::Success {
applied,
remotes,
warnings,
})
} else {
+ log::debug!(
+ target: "fetch",
+ "fetch failed {} warnings and {} failures ({}ms)",
+ warnings.len(),
+ failures.len(),
+ start.elapsed().as_millis()
+ );
Ok(FetchResult::Failed { warnings, failures })
}
}
commit ecb69a45b9d6167b19131bd2411358fbcc7d418d
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Thu Mar 7 13:23:56 2024 +0000
node: downgrade log statements
Announcement are logged at the debug level and are very frequent. This
causes a lot of noisy logging in a node.
Downgrade the log levels for these messages from debug to trace.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-node/src/service.rs b/radicle-node/src/service.rs
index 22f6c38be..b6775b588 100644
--- a/radicle-node/src/service.rs
+++ b/radicle-node/src/service.rs
@@ -1268,7 +1268,7 @@ where
match self.db.addresses().get(announcer) {
Ok(node) => {
if node.is_none() {
- debug!(target: "service", "Ignoring announcement from unknown node {announcer}");
+ trace!(target: "service", "Ignoring announcement from unknown node {announcer}");
return Ok(false);
}
}
@@ -1600,7 +1600,7 @@ where
trace!(target: "service", "Rate limiting message from {remote} ({})", peer.addr);
return Ok(());
}
- message.log(log::Level::Debug, remote, Link::Inbound);
+ message.log(log::Level::Trace, remote, Link::Inbound);
trace!(target: "service", "Received message {:?} from {}", &message, peer.id);
diff --git a/radicle-node/src/service/io.rs b/radicle-node/src/service/io.rs
index 9251aa26a..a4c9fc58c 100644
--- a/radicle-node/src/service/io.rs
+++ b/radicle-node/src/service/io.rs
@@ -57,7 +57,7 @@ impl Outbox {
}
pub fn write(&mut self, remote: &Session, msg: Message) {
- msg.log(log::Level::Debug, &remote.id, Link::Outbound);
+ msg.log(log::Level::Trace, &remote.id, Link::Outbound);
trace!(target: "service", "Write {:?} to {}", &msg, remote);
self.io.push_back(Io::Write(remote.id, vec![msg]));
@@ -101,7 +101,7 @@ impl Outbox {
ix + 1,
msgs.len()
);
- msg.log(log::Level::Debug, &remote.id, Link::Outbound);
+ msg.log(log::Level::Trace, &remote.id, Link::Outbound);
}
self.io.push_back(Io::Write(remote.id, msgs));
}
commit 336ac1f52747bc8b2ddb5d8bf98960458b6728d4
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Thu Mar 7 11:24:36 2024 +0000
node: increase timeouts
For larger fetches, a timeout for the channels and socket control are
required. Bump the timeout from 9s to 30s.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-node/src/wire/protocol.rs b/radicle-node/src/wire/protocol.rs
index e0de97145..e68e82882 100644
--- a/radicle-node/src/wire/protocol.rs
+++ b/radicle-node/src/wire/protocol.rs
@@ -44,7 +44,7 @@ pub const NOISE_XK: HandshakePattern = HandshakePattern {
/// Default time to wait to receive something from a worker channel. Applies to
/// workers waiting for data from remotes as well.
-pub const DEFAULT_CHANNEL_TIMEOUT: time::Duration = time::Duration::from_secs(9);
+pub const DEFAULT_CHANNEL_TIMEOUT: time::Duration = time::Duration::from_secs(30);
/// Default time to wait until a network connection is considered inactive.
pub const DEFAULT_CONNECTION_TIMEOUT: time::Duration = time::Duration::from_secs(30);
diff --git a/radicle/src/node.rs b/radicle/src/node.rs
index a61b1c895..96d476aff 100644
--- a/radicle/src/node.rs
+++ b/radicle/src/node.rs
@@ -46,7 +46,7 @@ pub const DEFAULT_SOCKET_NAME: &str = "control.sock";
/// Default radicle protocol port.
pub const DEFAULT_PORT: u16 = 8776;
/// Default timeout when waiting for the node to respond with data.
-pub const DEFAULT_TIMEOUT: time::Duration = time::Duration::from_secs(9);
+pub const DEFAULT_TIMEOUT: time::Duration = time::Duration::from_secs(30);
/// Maximum length in bytes of a node alias.
pub const MAX_ALIAS_LENGTH: usize = 32;
/// Penalty threshold at which point we avoid connecting to this node.
commit 83b1d66671b609cfd38d58b95cf56cfc207e71d2
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Thu Mar 7 09:41:59 2024 +0000
node: remove unused timeout
The timeout was never being used, so it is being removed for the time
being.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-node/src/runtime.rs b/radicle-node/src/runtime.rs
index 97cdab946..bd6be433e 100644
--- a/radicle-node/src/runtime.rs
+++ b/radicle-node/src/runtime.rs
@@ -4,7 +4,7 @@ pub mod thread;
use std::os::unix::net::UnixListener;
use std::path::PathBuf;
use std::sync::{Arc, Mutex};
-use std::{fs, io, net, time};
+use std::{fs, io, net};
use crossbeam_channel as chan;
use cyphernet::Ecdh;
@@ -262,7 +262,6 @@ impl Runtime {
cobs_cache,
worker::Config {
capacity: 8,
- timeout: time::Duration::from_secs(9),
storage: storage.clone(),
fetch,
policy,
diff --git a/radicle-node/src/worker.rs b/radicle-node/src/worker.rs
index 41dbc7a41..2db99c89f 100644
--- a/radicle-node/src/worker.rs
+++ b/radicle-node/src/worker.rs
@@ -29,8 +29,6 @@ pub use channels::{ChannelEvent, Channels};
pub struct Config {
/// Number of worker threads.
pub capacity: usize,
- /// Timeout for all operations.
- pub timeout: time::Duration,
/// Git storage.
pub storage: Storage,
/// Configuration for performing fetched.
Exit code: 0
shell: 'cargo --version rustc --version cargo fmt --check cargo clippy --all-targets --workspace -- --deny clippy::all cargo build --all-targets --workspace cargo doc --workspace cargo test --workspace --no-fail-fast '
Commands:
$ podman run --name 88620ec2-b3b5-47d0-bf77-530adfe6738d -v /opt/radcis/ci.rad.levitte.org/cci/state/88620ec2-b3b5-47d0-bf77-530adfe6738d/s:/88620ec2-b3b5-47d0-bf77-530adfe6738d/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/88620ec2-b3b5-47d0-bf77-530adfe6738d/w:/88620ec2-b3b5-47d0-bf77-530adfe6738d/w -w /88620ec2-b3b5-47d0-bf77-530adfe6738d/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /88620ec2-b3b5-47d0-bf77-530adfe6738d/s/script.sh
+ cargo --version
info: syncing channel updates for '1.74-x86_64-unknown-linux-gnu'
info: latest update on 2023-12-07, rust version 1.74.1 (a28077b28 2023-12-04)
info: downloading component 'cargo'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: installing component 'cargo'
info: installing component 'rust-std'
info: installing component 'rustc'
cargo 1.74.1 (ecb9851af 2023-10-18)
+ rustc --version
rustc 1.74.1 (a28077b28 2023-12-04)
+ cargo fmt --check
error: 'cargo-fmt' is not installed for the toolchain '1.74-x86_64-unknown-linux-gnu'.
To install, run `rustup component add --toolchain 1.74-x86_64-unknown-linux-gnu rustfmt`
Exit code: 1
{
"response": "finished",
"result": "failure"
}