Radicle repository id rad:zwTxygwuz5LDGBq255RA2CbNGrz8
[2025-10-10T05:57:03Z INFO ambient] ambient starts
deprecated: the `cpus` field is replaced by `qemu.cpus`
deprecated: the `memory` field is replaced by `qemu.memory`
[2J[01;01H[=3h[2J[01;01H[2J[01;01H[=3h[2J[01;01HBdsDxe: failed to load Boot0001 "UEFI QEMU DVD-ROM QM00005 " from PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x2,0xFFFF,0x0): Not Found
BdsDxe: loading Boot0002 "UEFI Misc Device" from PciRoot(0x0)/Pci(0x2,0x0)
BdsDxe: starting Boot0002 "UEFI Misc Device" from PciRoot(0x0)/Pci(0x2,0x0)
[0m[30m[47mWelcome to GRUB!
[0m[37m[40m[0m[30m[40m[2J[01;01H[0m[37m[40mINFO: Block devices
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 254:0 0 100G 0 disk
├─vda1 254:1 0 953M 0 part
└─vda2 254:2 0 99.1G 0 part /
vdb 254:16 0 6.1M 1 disk
vdc 254:32 0 9M 1 disk
vdd 254:48 0 953.7M 0 disk
vde 254:64 0 27.9G 0 disk
vdf 254:80 0 896.3M 1 disk
INFO: Extracting tar archive from /dev/vdb
drwxr-xr-x _rad/_rad 0 2025-10-10 05:56 ./
-rw-r--r-- _rad/_rad 1789 2025-10-10 05:56 ./plan.yaml
-rwxr-xr-x _rad/_rad 6369536 2025-10-10 05:56 ./run-ci
INFO: Extracted files:
3538954 4 drwxr-xr-x 2 1000 1000 4096 Oct 10 05:56 .
3538955 4 -rw-r--r-- 1 1000 1000 1789 Oct 10 05:56 ./plan.yaml
3538956 6224 -rwxr-xr-x 1 1000 1000 6369536 Oct 10 05:56 ./run-ci
INFO: Running run-ci from /dev/vdb
================================ BEGIN ================================
[2025-10-10T05:56:48Z TRACE ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z DEBUG ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z INFO ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z WARN ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z ERROR ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
RunnablePlan::from_file: filename=plan.yaml
steps:
- action: mkdir
pathname: /workspace
- action: mkdir
pathname: /workspace/artifacts
- action: tar_extract
archive: /dev/vdc
directory: /workspace/src
- action: tar_extract
archive: /dev/vdf
directory: /workspace/deps
- action: tar_extract
archive: /dev/vde
directory: /workspace/cache
- action: spawn
argv:
- find
- /workspace
- -maxdepth
- '2'
- -ls
- action: cargo_fmt
- action: cargo_clippy
- action: shell
shell: |
export CARGO_TARGET_DIR=/workspace/cache
export CARGO_HOME=/workspace/deps
export HOME=/root
export PATH="/root/.cargo/bin:/root/.radicle/bin:$PATH"
# Check that `rad` is there.
rad --help >/dev/null || (echo rad is not there; exit 1)
cargo doc --workspace --no-deps
# FIXME: We can't run upgrade tests from older versions because
# Ambient only fetches dependencies for the current version.
# Thus, we can't build the old versions. This is an Ambient
# problem that we can't fix here. So we skip the upgrade tests.
cargo test --workspace --no-fail-fast -- --skip upgrade --test-threads 2
subplot docgen ci-broker.subplot -o doc/ci-broker.html
subplot docgen doc/userguide.subplot -o doc/userguide.html
make -C doc
cp doc/*.html /workspace/artifacts/.
- action: custom
name: dch
args:
debemail: liw@liw.fi
debfullname: Lars Wirzenius
- action: deb
- action: tar_create
archive: /dev/vde
directory: /workspace/cache
- action: tar_create
archive: /dev/vdd
directory: /workspace/artifacts
executor_drive: /dev/vdb
source_drive: /dev/vdc
artifact_drive: /dev/vdd
cache_drive: /dev/vde
deps_drive: /dev/vdf
workspace_dir: /workspace
source_dir: /workspace/src
deps_dir: /workspace/deps
cache_dir: /workspace/cache
artifacts_dir: /workspace/artifacts
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
pathname: "/workspace",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
pathname: "/workspace",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
pathname: "/workspace/artifacts",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
pathname: "/workspace/artifacts",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
archive: "/dev/vdc",
directory: "/workspace/src",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
archive: "/dev/vdc",
directory: "/workspace/src",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extracting /dev/vdc to /workspace/src
[2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
archive: "/dev/vdf",
directory: "/workspace/deps",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
archive: "/dev/vdf",
directory: "/workspace/deps",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extracting /dev/vdf to /workspace/deps
[2025-10-10T05:56:50Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-10T05:56:50Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:50Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
archive: "/dev/vde",
directory: "/workspace/cache",
}
[2025-10-10T05:56:50Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
archive: "/dev/vde",
directory: "/workspace/cache",
}
[2025-10-10T05:56:51Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:51Z TRACE ambient_ci::vdrive] extracting /dev/vde to /workspace/cache
[2025-10-10T05:56:59Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action Spawn {
argv: [
"find",
"/workspace",
"-maxdepth",
"2",
"-ls",
],
}
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: plan=Spawn {
argv: [
"find",
"/workspace",
"-maxdepth",
"2",
"-ls",
],
}
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
SPAWN: argv=["find", "/workspace", "-maxdepth", "2", "-ls"]
cwd=/workspace/src (exists? true)
5242881 4 drwxr-xr-x 6 root root 4096 Oct 10 05:56 /workspace
5242882 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/artifacts
5243191 4 drwxr-xr-x 3 root root 4096 Oct 10 05:56 /workspace/deps
5243192 4 drwxr-xr-x 5 root root 4096 Sep 10 13:33 /workspace/deps/registry
5271461 0 -rw-r--r-- 1 root root 0 Sep 10 13:33 /workspace/deps/.package-cache-mutate
5271460 120 -rw-r--r-- 1 root root 122880 Oct 10 05:56 /workspace/deps/.global-cache
5271462 0 -rw-r--r-- 1 root root 0 Sep 10 13:33 /workspace/deps/.package-cache
5271463 4 drwxr-xr-x 6 root root 4096 Sep 20 06:05 /workspace/cache
5276158 4 -rw-r--r-- 1 root root 218 Sep 20 05:56 /workspace/cache/.rustdoc_fingerprint.json
5271464 4 -rw-r--r-- 1 root root 1038 Oct 10 05:56 /workspace/cache/.rustc_info.json
5276159 4 drwxr-xr-x 7 root root 4096 Oct 8 05:48 /workspace/cache/debug
5271465 4 drwxr-xr-x 7 root root 4096 Oct 8 05:49 /workspace/cache/release
5276157 4 drwxr-xr-x 2 root root 4096 Sep 20 05:52 /workspace/cache/tmp
5275606 4 drwxr-xr-x 12 root root 4096 Oct 8 05:45 /workspace/cache/doc
5242883 4 drwxr-xr-x 10 root root 4096 Oct 10 05:56 /workspace/src
5242978 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/.cargo
5242959 4 -rw-r--r-- 1 root root 386 Oct 10 05:56 /workspace/src/cibtool.1
5242981 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/.ambient
5242970 4 -rw-r--r-- 1 root root 1079 Oct 10 05:56 /workspace/src/LICENSE-MIT
5242976 4 -rw-r--r-- 1 root root 44 Oct 10 05:56 /workspace/src/.gitignore
5242971 12 -rw-r--r-- 1 root root 9723 Oct 10 05:56 /workspace/src/LICENSE-APACHE
5242888 4 -rw-r--r-- 1 root root 469 Oct 10 05:56 /workspace/src/test.yaml
5242947 4 drwxr-xr-x 3 root root 4096 Oct 10 05:56 /workspace/src/debian
5242983 4 drwxr-xr-x 8 root root 4096 Oct 10 05:56 /workspace/src/.git
5242960 4 -rw-r--r-- 1 root root 440 Oct 10 05:56 /workspace/src/cib.1
5242934 8 -rw-r--r-- 1 root root 5951 Oct 10 05:56 /workspace/src/flake.nix
5242966 4 -rw-r--r-- 1 root root 2245 Oct 10 05:56 /workspace/src/RELEASE.md
5242964 2932 -rw-r--r-- 1 root root 3002368 Oct 10 05:56 /workspace/src/ci-broker.db
5242885 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/tests
5242974 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/.radicle
5242968 40 -rw-r--r-- 1 root root 37786 Oct 10 05:56 /workspace/src/NEWS.md
5242884 4 -rw-r--r-- 1 root root 1716 Oct 10 05:56 /workspace/src/Cargo.toml
5242961 4 -rw-r--r-- 1 root root 732 Oct 10 05:56 /workspace/src/ci-broker.yaml
5242969 4 -rw-r--r-- 1 root root 334 Oct 10 05:56 /workspace/src/Makefile
5242967 8 -rw-r--r-- 1 root root 4796 Oct 10 05:56 /workspace/src/README.md
5242963 92 -rw-r--r-- 1 root root 92634 Oct 10 05:56 /workspace/src/ci-broker.md
5242965 4 -rw-r--r-- 1 root root 802 Oct 10 05:56 /workspace/src/build.rs
5242977 4 -rw-r--r-- 1 root root 10 Oct 10 05:56 /workspace/src/.envrc
5242973 4 -rw-r--r-- 1 root root 1188 Oct 10 05:56 /workspace/src/CONTRIBUTING.md
5242972 100 -rw-r--r-- 1 root root 98580 Oct 10 05:56 /workspace/src/Cargo.lock
5242962 4 -rw-r--r-- 1 root root 257 Oct 10 05:56 /workspace/src/ci-broker.subplot
5242936 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/doc
5242935 8 -rw-r--r-- 1 root root 6528 Oct 10 05:56 /workspace/src/flake.lock
5242887 4 -rw-r--r-- 1 root root 905 Oct 10 05:56 /workspace/src/test2.yaml
5242889 4 drwxr-xr-x 4 root root 4096 Oct 10 05:56 /workspace/src/src
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action CargoFmt
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: plan=CargoFmt
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
SPAWN: argv=["cargo", "--version"]
cwd=/workspace/src (exists? true)
cargo 1.90.0 (840b83a10 2025-07-30)
SPAWN: argv=["cargo", "clippy", "--version"]
cwd=/workspace/src (exists? true)
clippy 0.1.90 (1159e78c47 2025-09-14)
SPAWN: argv=["rustc", "--version"]
cwd=/workspace/src (exists? true)
rustc 1.90.0 (1159e78c4 2025-09-14)
SPAWN: argv=["cargo", "fmt", "--check"]
cwd=/workspace/src (exists? true)
Diff in /workspace/src/src/bin/cibtool.rs:18:
use clap::Parser;
-use radicle::{git::Oid, prelude::NodeId, Profile};
+use radicle::{Profile, git::Oid, prelude::NodeId};
use radicle_ci_broker::{
broker::BrokerError,
Diff in /workspace/src/src/bin/cibtool.rs:335:
#[error("when adding a branch-update event, the --base option is required")]
BaseRequired,
- #[error(
- "when adding a patch-create or patch--update event, the --patch-id option is required"
- )]
+ #[error("when adding a patch-create or patch--update event, the --patch-id option is required")]
PatchIdRequired,
#[error("failed to construct a CI event")]
Diff in /workspace/src/src/bin/cibtoolcmd/log.rs:1:
use std::{
convert::TryFrom,
- fs::{read, File},
+ fs::{File, read},
io::{Read, Write},
path::{Path, PathBuf},
};
Diff in /workspace/src/src/bin/synthetic-events.rs:7:
use std::{
env::current_exe,
- fs::{read, remove_file, File, OpenOptions},
+ fs::{File, OpenOptions, read, remove_file},
io::{Read, Write},
net::Shutdown,
os::unix::net::{UnixListener, UnixStream},
Diff in /workspace/src/src/adapter.rs:17:
};
use serde::Serialize;
-use tempfile::{tempdir, TempDir};
+use tempfile::{TempDir, tempdir};
use url::Url;
use crate::{
Diff in /workspace/src/src/adapter.rs:454:
mod test {
use std::{fs::write, io::ErrorKind, path::PathBuf, time::Duration};
- use tempfile::{tempdir, NamedTempFile, TempDir};
+ use tempfile::{NamedTempFile, TempDir, tempdir};
use radicle::git::Oid;
use radicle::prelude::RepoId;
Diff in /workspace/src/src/adapter.rs:465:
msg::{MessageError, Response, RunId, RunResult},
notif::NotificationChannel,
run::{RunBuilder, Whence},
- test::{mock_adapter, trigger_request, TestResult},
+ test::{TestResult, mock_adapter, trigger_request},
};
const MAX: Duration = Duration::from_secs(10);
Diff in /workspace/src/src/broker.rs:8:
time::Duration,
};
-use time::{macros::format_description, OffsetDateTime};
-use tracing::{span, Level};
+use time::{OffsetDateTime, macros::format_description};
+use tracing::{Level, span};
use radicle::prelude::RepoId;
Diff in /workspace/src/src/broker.rs:205:
msg::{RunId, RunResult},
notif::NotificationChannel,
run::RunState,
- test::{mock_adapter, trigger_request, TestResult},
+ test::{TestResult, mock_adapter, trigger_request},
};
fn broker(filename: &Path) -> anyhow::Result<Broker> {
Diff in /workspace/src/src/ci_event.rs:12:
storage::RefUpdate,
};
-use crate::refs::{ref_string, GenericRefName, TagName};
+use crate::refs::{GenericRefName, TagName, ref_string};
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
#[non_exhaustive]
Diff in /workspace/src/src/ci_event.rs:423:
const MAIN_BRANCH_REF_NAME: &str =
"refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/main";
- const PATCH_REF_NAME: &str =
- "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/patches/f9fa90725474de9002be503ae3cda4670c9a174";
+ const PATCH_REF_NAME: &str = "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/patches/f9fa90725474de9002be503ae3cda4670c9a174";
const PATCH_ID: &str = "f9fa90725474de9002be503ae3cda4670c9a174";
fn nid() -> NodeId {
Diff in /workspace/src/src/cob.rs:13:
use radicle::{
git::Oid,
node::{
- sync::{Announcer, AnnouncerConfig, ReplicationFactor},
Handle, Node,
+ sync::{Announcer, AnnouncerConfig, ReplicationFactor},
},
prelude::{Profile, ReadStorage, RepoId},
storage::git::Repository,
Diff in /workspace/src/src/db.rs:18:
use serde::{Deserialize, Serialize};
use sqlite::{Connection, State, Statement};
-use time::{macros::format_description, OffsetDateTime};
+use time::{OffsetDateTime, macros::format_description};
use uuid::Uuid;
use crate::{ci_event::CiEvent, msg::RunId, run::Run};
Diff in /workspace/src/src/ergo.rs:8:
use std::str::FromStr;
use radicle::{
- cob::patch::{cache::Patches, Patch, PatchId},
+ cob::patch::{Patch, PatchId, cache::Patches},
git::Oid,
identity::{Project, RepoId},
profile::Profile,
Diff in /workspace/src/src/ergo.rs:15:
- storage::{git::Repository, ReadStorage, RepositoryInfo},
+ storage::{ReadStorage, RepositoryInfo, git::Repository},
};
/// A Radicle node.
Diff in /workspace/src/src/filter.rs:5:
use radicle::{
cob::patch::PatchId,
- git::{raw::ObjectType, BranchName, Oid},
+ git::{BranchName, Oid, raw::ObjectType},
node::NodeId,
prelude::{Profile, RepoId},
storage::git::Repository,
Diff in /workspace/src/src/filter.rs:418:
use qcheck_macros::quickcheck;
use radicle::prelude::{Did, RepoId};
- use crate::refs::{branch_from_str, TagName};
+ use crate::refs::{TagName, branch_from_str};
use super::*;
Diff in /workspace/src/src/logger.rs:4:
use clap::ValueEnum;
use serde_json::Value;
-use tracing::{debug, error, info, trace, warn, Level};
-use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
+use tracing::{Level, debug, error, info, trace, warn};
+use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
use uuid::Uuid;
use radicle::{git::Oid, identity::RepoId, node::Event, patch::PatchId};
Diff in /workspace/src/src/msg.rs:20:
use serde_json::Value;
use uuid::Uuid;
-pub use radicle::{
- cob::patch::PatchId,
- git::Oid,
- prelude::{NodeId, RepoId},
-};
use radicle::{
+ Profile,
identity::Did,
node::{Alias, AliasStore},
patch::{self, RevisionId},
Diff in /workspace/src/src/msg.rs:32:
- storage::{git::paths, ReadRepository, ReadStorage},
- Profile,
+ storage::{ReadRepository, ReadStorage, git::paths},
};
+pub use radicle::{
+ cob::patch::PatchId,
+ git::Oid,
+ prelude::{NodeId, RepoId},
+};
use crate::{
ci_event::{CiEvent, CiEventV1},
Diff in /workspace/src/src/msg.rs:1266:
process::Command,
};
- use nonempty::{nonempty, NonEmpty};
+ use nonempty::{NonEmpty, nonempty};
use radicle::prelude::{Profile, RepoId};
- use time::{macros::format_description, OffsetDateTime};
+ use time::{OffsetDateTime, macros::format_description};
use super::{MessageError, Oid, Request, Response, RunId, RunResult};
Diff in /workspace/src/src/node_event_source.rs:3:
use std::{fmt, path::PathBuf, time};
use radicle::{
- node::{Event, Handle},
Profile,
+ node::{Event, Handle},
};
use crate::logger;
Diff in /workspace/src/src/notif.rs:1:
//! Notification channel between threads.
use std::{
- sync::mpsc::{channel, Receiver, RecvTimeoutError, Sender},
+ sync::mpsc::{Receiver, RecvTimeoutError, Sender, channel},
time::Duration,
};
Diff in /workspace/src/src/pages.rs:16:
use html_page::{Element, HtmlPage, Tag};
use rss::{Channel, ChannelBuilder, Guid, Item, ItemBuilder};
use serde::Serialize;
-use time::{macros::format_description, OffsetDateTime};
+use time::{OffsetDateTime, macros::format_description};
use radicle::{
+ Profile,
git::Oid,
prelude::RepoId,
storage::{ReadRepository, ReadStorage},
Diff in /workspace/src/src/pages.rs:25:
- Profile,
};
use crate::{
Diff in /workspace/src/src/sensitive.rs:17:
use std::fmt;
-use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
+use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
const PLACEHOLDER: &str = "<REDACTED>";
Diff in /workspace/src/src/test.rs:7:
use crate::adapter::Adapter;
use crate::ci_event::{CiEvent, CiEventV1};
use crate::msg::{Request, RequestBuilder};
+use radicle::Profile;
use radicle::crypto::ssh::Keystore;
use radicle::crypto::test::signer::MockSigner;
use radicle::git::RefString;
Diff in /workspace/src/src/test.rs:13:
use radicle::profile::{Config, Home};
use radicle::storage::ReadRepository;
use radicle::test::setup::Node;
-use radicle::Profile;
use tempfile::tempdir;
Diff in /workspace/src/src/timeoutcmd.rs:50:
io::{Read, Seek, Write},
process::{Child, Command, ExitStatus, Stdio},
sync::{
+ Arc, Condvar, Mutex, MutexGuard,
mpsc::{
- channel, sync_channel, Receiver, RecvTimeoutError, Sender, SyncSender, TryRecvError,
+ Receiver, RecvTimeoutError, Sender, SyncSender, TryRecvError, channel, sync_channel,
},
- Arc, Condvar, Mutex, MutexGuard,
},
- thread::{sleep, spawn, JoinHandle},
+ thread::{JoinHandle, sleep, spawn},
time::{Duration, Instant},
};
Diff in /workspace/src/src/timeoutcmd.rs:705:
}
#[test]
- fn sleep_for_too_long_while_reading_with_realtimelines(
- ) -> Result<(), Box<dyn std::error::Error>> {
+ fn sleep_for_too_long_while_reading_with_realtimelines()
+ -> Result<(), Box<dyn std::error::Error>> {
let (running, mut stdout) = setup("exec sleep 1000", SHORT_TIMEOUT, None)?;
while stdout.line().is_some() {}
let result = running.wait();
Diff in /workspace/src/src/util.rs:8:
use tempfile::NamedTempFile;
use time::{
- format_description::{well_known::Rfc2822, FormatItem},
+ OffsetDateTime, PrimitiveDateTime,
+ format_description::{FormatItem, well_known::Rfc2822},
macros::format_description,
parsing::Parsable,
- OffsetDateTime, PrimitiveDateTime,
};
use radicle::{
Diff in /workspace/src/src/util.rs:18:
+ Profile, Storage,
cob::ObjectId,
git::Oid,
prelude::{NodeId, RepoId},
Diff in /workspace/src/src/util.rs:21:
storage::ReadStorage,
- Profile, Storage,
};
pub fn lookup_repo(profile: &Profile, wanted: &str) -> Result<(RepoId, String), UtilError> {
Diff in /workspace/src/src/worker.rs:4:
//! are implemented and used, as well as logging. A worker thread does
//! what it does. The abstraction is not meant to constrain that.
-use std::thread::{spawn, JoinHandle};
+use std::thread::{JoinHandle, spawn};
/// Start a new thread. Caller must catch the thread handle and
/// join it to wait for thread to end.
[2025-10-10T05:57:00Z ERROR ambient_ci::plan] ERROR: Action failed: failed to execute cargo
[2025-10-10T05:57:00Z ERROR ambient_ci::plan] caused by: command failed: "cargo": exit code 1
ERROR: failed to execute cargo
caused by: command failed: "cargo": exit code 1
EXIT CODE: 1
[2025-10-10T05:57:03Z INFO ambient] ambient ends successfully
{
"request": "trigger",
"version": 1,
"event_type": "patch",
"repository": {
"id": "rad:zwTxygwuz5LDGBq255RA2CbNGrz8",
"name": "radicle-ci-broker",
"description": "Radicle CI broker",
"private": false,
"default_branch": "main",
"delegates": [
"did:key:z6MkgEMYod7Hxfy9qCvDv5hYHkZ4ciWmLFgfvm3Wn1b2w2FV",
"did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT"
]
},
"action": "Created",
"patch": {
"id": "ec247266bdb98d0b4ca2093188d97a9389f3c635",
"author": {
"id": "did:key:z6MkgEMYod7Hxfy9qCvDv5hYHkZ4ciWmLFgfvm3Wn1b2w2FV",
"alias": "liw"
},
"title": "refactor(src/queueproc.rs): simplify thread structure",
"state": {
"status": "open",
"conflicts": []
},
"before": "5379b676d52127a5c828eb488fb4e67d5f382850",
"after": "dd9347b8acdce0022f0d8eb6378de849ba830834",
"commits": [
"dd9347b8acdce0022f0d8eb6378de849ba830834"
],
"target": "5379b676d52127a5c828eb488fb4e67d5f382850",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "ec247266bdb98d0b4ca2093188d97a9389f3c635",
"author": {
"id": "did:key:z6MkgEMYod7Hxfy9qCvDv5hYHkZ4ciWmLFgfvm3Wn1b2w2FV",
"alias": "liw"
},
"description": "Change the queue processing to spawn a new thread for each new event\nto process (run adapters for).\n\nPreviously we had N long-lived threads, where N is set in the\nconfiguration setting `concurrent_adapters`. This is awkward if we\nwant to reload configuration, which is an open feature request.\n\nThe new structure is also a lot simpler, which hopefully means it'll\nbe more reliable.",
"base": "5379b676d52127a5c828eb488fb4e67d5f382850",
"oid": "dd9347b8acdce0022f0d8eb6378de849ba830834",
"timestamp": 1760075796
}
]
}
}[2025-10-10T05:56:40Z INFO ambient] ambient starts
[2025-10-10T05:56:40Z DEBUG ambient] load default configuration file /home/_rad/.config/ambient/config.yaml if it exists
deprecated: the `cpus` field is replaced by `qemu.cpus`
deprecated: the `memory` field is replaced by `qemu.memory`
[2025-10-10T05:56:40Z DEBUG ambient] complete configuration: Config {
tmpdir: "/home/_rad/tmp",
image_store: "/home/_rad/ambient-images",
projects: "/dev/null",
state: "/home/_rad/ambient-state",
rsync_target: None,
rsync_target_base: None,
rsync_target_map: None,
dput_target: None,
executor: Some(
"/usr/bin/ambient-execute-plan",
),
artifacts_max_size: Byte(
1000000000,
),
cache_max_size: Byte(
30000000000,
),
qemu: QemuConfig {
cpus: 2,
memory: Byte(
12000000000,
),
kvm_binary: "/usr/bin/kvm",
ovmf_vars_file: "/usr/share/ovmf/OVMF.fd",
ovmf_code_file: "/usr/share/ovmf/OVMF.fd",
},
}
[2025-10-10T05:56:40Z DEBUG ambient] configuration: Config {
tmpdir: "/home/_rad/tmp",
image_store: "/home/_rad/ambient-images",
projects: "/dev/null",
state: "/home/_rad/ambient-state",
rsync_target: None,
rsync_target_base: None,
rsync_target_map: None,
dput_target: None,
executor: Some(
"/usr/bin/ambient-execute-plan",
),
artifacts_max_size: Byte(
1000000000,
),
cache_max_size: Byte(
30000000000,
),
qemu: QemuConfig {
cpus: 2,
memory: Byte(
12000000000,
),
kvm_binary: "/usr/bin/kvm",
ovmf_vars_file: "/usr/share/ovmf/OVMF.fd",
ovmf_code_file: "/usr/share/ovmf/OVMF.fd",
},
}
[2025-10-10T05:56:40Z DEBUG ambient_ci::project] load project state from /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/meta.yaml
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] latest commit: "5379b676d52127a5c828eb488fb4e67d5f382850"
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] is a git repository
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] git repository is clean
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] current (HEAD) commit: dd9347b8acdce0022f0d8eb6378de849ba830834
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] no dry run requested
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] forced run requested
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] run? true
[2025-10-10T05:56:40Z INFO ambient_ci::run] project rad:zwTxygwuz5LDGBq255RA2CbNGrz8: running CI
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] Executing pre-plan steps
[2025-10-10T05:56:40Z DEBUG ambient_ci::plan] RUN: Action CargoFetch {
sourcedir: "/tmp/.tmpirAEHm/src",
}
[2025-10-10T05:56:40Z DEBUG ambient_ci::action] Plan::execute: plan=CargoFetch {
sourcedir: "/tmp/.tmpirAEHm/src",
}
[2025-10-10T05:56:40Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_HOME": "/home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/dependencies",
"CARGO_TARGET_DIR": "/home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/cache",
"PATH": "/root/.cargo/bin:/bin:/home/_rad/.radicle/bin:/home/_rad/.cargo/bin",
},
source_dir: "/tmp/.tmpirAEHm/src",
}
SPAWN: argv=["cargo", "--version"]
cwd=/tmp/.tmpirAEHm/src (exists? true)
cargo 1.90.0 (840b83a10 2025-07-30)
SPAWN: argv=["cargo", "clippy", "--version"]
cwd=/tmp/.tmpirAEHm/src (exists? true)
clippy 0.1.90 (1159e78c47 2025-09-14)
SPAWN: argv=["rustc", "--version"]
cwd=/tmp/.tmpirAEHm/src (exists? true)
rustc 1.90.0 (1159e78c4 2025-09-14)
SPAWN: argv=["cargo", "fetch"]
cwd=/tmp/.tmpirAEHm/src (exists? true)
[2025-10-10T05:56:41Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:41Z DEBUG ambient_ci::plan] All actions were performed successfully
[2025-10-10T05:56:41Z DEBUG ambient_ci::run] create virtual drive /home/_rad/tmp/.tmpC1780l/src.tar
[2025-10-10T05:56:41Z DEBUG ambient_ci::run] create virtual drive /home/_rad/tmp/.tmpC1780l/deps.tar
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] create_executor_vdrive: executor="/usr/bin/ambient-execute-plan"
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] create_executor_vdrive: plan=RunnablePlan {
steps: [
Mkdir {
pathname: "/workspace",
},
Mkdir {
pathname: "/workspace/artifacts",
},
TarExtract {
archive: "/dev/vdc",
directory: "/workspace/src",
},
TarExtract {
archive: "/dev/vdf",
directory: "/workspace/deps",
},
TarExtract {
archive: "/dev/vde",
directory: "/workspace/cache",
},
Spawn {
argv: [
"find",
"/workspace",
"-maxdepth",
"2",
"-ls",
],
},
CargoFmt,
CargoClippy,
Shell {
shell: "export CARGO_TARGET_DIR=/workspace/cache\nexport CARGO_HOME=/workspace/deps\nexport HOME=/root\nexport PATH=\"/root/.cargo/bin:/root/.radicle/bin:$PATH\"\n\n# Check that `rad` is there.\nrad --help >/dev/null || (echo rad is not there; exit 1)\n\ncargo doc --workspace --no-deps\n\n# FIXME: We can't run upgrade tests from older versions because\n# Ambient only fetches dependencies for the current version.\n# Thus, we can't build the old versions. This is an Ambient\n# problem that we can't fix here. So we skip the upgrade tests.\ncargo test --workspace --no-fail-fast -- --skip upgrade --test-threads 2\n\nsubplot docgen ci-broker.subplot -o doc/ci-broker.html\nsubplot docgen doc/userguide.subplot -o doc/userguide.html\nmake -C doc\ncp doc/*.html /workspace/artifacts/.\n",
},
Custom(
Custom {
name: "dch",
args: {
"debemail": String("liw@liw.fi"),
"debfullname": String("Lars Wirzenius"),
},
},
),
Deb,
TarCreate {
archive: "/dev/vde",
directory: "/workspace/cache",
},
TarCreate {
archive: "/dev/vdd",
directory: "/workspace/artifacts",
},
],
executor_drive: Some(
"/dev/vdb",
),
source_drive: Some(
"/dev/vdc",
),
artifact_drive: Some(
"/dev/vdd",
),
cache_drive: Some(
"/dev/vde",
),
deps_drive: Some(
"/dev/vdf",
),
workspace_dir: Some(
"/workspace",
),
source_dir: Some(
"/workspace/src",
),
deps_dir: Some(
"/workspace/deps",
),
cache_dir: Some(
"/workspace/cache",
),
artifacts_dir: Some(
"/workspace/artifacts",
),
}
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] executor bin /usr/bin/ambient-execute-plan
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] copying /usr/bin/ambient-execute-plan to /home/_rad/tmp/.tmpC1780l/ambient-execute-plan/run-ci
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] copy OK: true
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] create virtual drive /home/_rad/tmp/.tmpC1780l/executor.tar
[2025-10-10T05:56:46Z DEBUG ambient_ci::project] removing run log file /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::project] statedir is /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8, exists? true
[2025-10-10T05:56:46Z DEBUG ambient_ci::project] creating run log file /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::project] created run log file /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log OK
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] with_hostname called: "ambient"
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] with_runcmd called: "echo xyzzy > /dev/ttyS1"
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] with_runcmd called: "\n(set -xeu\nenv\ndir=\"$(mktemp -d)\"\ncd \"$dir\"\ntar -xvf /dev/vdb\nfind -ls || true\nldd ./run-ci || true\necho ================================ BEGIN ================================\nexport RUST_BACKTRACE=1\nif ./run-ci; then\n echo \"EXIT CODE: 0\"\nelse\n echo \"EXIT CODE: $?\"\nfi) > /dev/ttyS1 2>&1\n"
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] with_runcmd called: "poweroff"
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] LocalDataStoreBuilder: LocalDataStoreBuilder {
hostname: Some(
"ambient",
),
network: false,
bootcmd: [],
runcmd: [
"echo xyzzy > /dev/ttyS1",
"\n(set -xeu\nenv\ndir=\"$(mktemp -d)\"\ncd \"$dir\"\ntar -xvf /dev/vdb\nfind -ls || true\nldd ./run-ci || true\necho ================================ BEGIN ================================\nexport RUST_BACKTRACE=1\nif ./run-ci; then\n echo \"EXIT CODE: 0\"\nelse\n echo \"EXIT CODE: $?\"\nfi) > /dev/ttyS1 2>&1\n",
"poweroff",
],
}
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] run QEMU
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] create copy-on-write image and UEFI vars file
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu_utils] qemu-img create /home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/vm.qcow2 backing on /home/_rad/ambient.qcow2
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] create cloud-init ISO file
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] LocalDataStore: LocalDataStore {
hostname: "ambient",
network: false,
bootcmd: [],
runcmd: [
"echo xyzzy > /dev/ttyS1",
"\n(set -xeu\nenv\ndir=\"$(mktemp -d)\"\ncd \"$dir\"\ntar -xvf /dev/vdb\nfind -ls || true\nldd ./run-ci || true\necho ================================ BEGIN ================================\nexport RUST_BACKTRACE=1\nif ./run-ci; then\n echo \"EXIT CODE: 0\"\nelse\n echo \"EXIT CODE: $?\"\nfi) > /dev/ttyS1 2>&1\n",
"poweroff",
],
}
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] write /tmp/.tmpEsjznh/meta-data
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] write /tmp/.tmpEsjznh/user-data
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] set console log file to /home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/console.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::util] create file /home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/console.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] set run file to /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::util] create file /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] run QEMU: QemuArgs {
args: [
"-m",
"11444",
"-smp",
"cpus=2",
"-cpu",
"kvm64",
"-machine",
"type=q35,accel=kvm,usb=off",
"-uuid",
"a85c9de7-edc0-4e54-bead-112e5733582c",
"-boot",
"strict=on",
"-name",
"ambient-ci-vm",
"-rtc",
"base=utc,driftfix=slew",
"-display",
"none",
"-device",
"virtio-rng-pci",
"-serial",
"file:/home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/console.log",
"-serial",
"file:/home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log",
"-drive",
"if=pflash,format=raw,unit=0,file=/usr/share/ovmf/OVMF.fd,readonly=on",
"-drive",
"if=pflash,format=raw,unit=1,file=/home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/vars.fd",
"-drive",
"format=qcow2,if=virtio,file=/home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/vm.qcow2",
"-drive",
"format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/executor.tar,readonly=on",
"-cdrom",
"/home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/cloud_init.iso",
"-drive",
"format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/src.tar,readonly=on",
"-drive",
"format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/artifacts.tar",
"-drive",
"format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/cache.tar",
"-drive",
"format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/deps.tar,readonly=on",
"-nodefaults",
"-no-user-config",
],
}
[2025-10-10T05:57:02Z DEBUG ambient_ci::qemu] QEMU finished OK
[2025-10-10T05:57:02Z DEBUG ambient_ci::qemu] run log:
--------------------==========
[2025-10-10T05:56:48Z TRACE ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z DEBUG ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z INFO ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z WARN ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z ERROR ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
RunnablePlan::from_file: filename=plan.yaml
steps:
- action: mkdir
pathname: /workspace
- action: mkdir
pathname: /workspace/artifacts
- action: tar_extract
archive: /dev/vdc
directory: /workspace/src
- action: tar_extract
archive: /dev/vdf
directory: /workspace/deps
- action: tar_extract
archive: /dev/vde
directory: /workspace/cache
- action: spawn
argv:
- find
- /workspace
- -maxdepth
- '2'
- -ls
- action: cargo_fmt
- action: cargo_clippy
- action: shell
shell: |
export CARGO_TARGET_DIR=/workspace/cache
export CARGO_HOME=/workspace/deps
export HOME=/root
export PATH="/root/.cargo/bin:/root/.radicle/bin:$PATH"
# Check that `rad` is there.
rad --help >/dev/null || (echo rad is not there; exit 1)
cargo doc --workspace --no-deps
# FIXME: We can't run upgrade tests from older versions because
# Ambient only fetches dependencies for the current version.
# Thus, we can't build the old versions. This is an Ambient
# problem that we can't fix here. So we skip the upgrade tests.
cargo test --workspace --no-fail-fast -- --skip upgrade --test-threads 2
subplot docgen ci-broker.subplot -o doc/ci-broker.html
subplot docgen doc/userguide.subplot -o doc/userguide.html
make -C doc
cp doc/*.html /workspace/artifacts/.
- action: custom
name: dch
args:
debemail: liw@liw.fi
debfullname: Lars Wirzenius
- action: deb
- action: tar_create
archive: /dev/vde
directory: /workspace/cache
- action: tar_create
archive: /dev/vdd
directory: /workspace/artifacts
executor_drive: /dev/vdb
source_drive: /dev/vdc
artifact_drive: /dev/vdd
cache_drive: /dev/vde
deps_drive: /dev/vdf
workspace_dir: /workspace
source_dir: /workspace/src
deps_dir: /workspace/deps
cache_dir: /workspace/cache
artifacts_dir: /workspace/artifacts
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
pathname: "/workspace",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
pathname: "/workspace",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
pathname: "/workspace/artifacts",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
pathname: "/workspace/artifacts",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
archive: "/dev/vdc",
directory: "/workspace/src",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
archive: "/dev/vdc",
directory: "/workspace/src",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extracting /dev/vdc to /workspace/src
[2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
archive: "/dev/vdf",
directory: "/workspace/deps",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
archive: "/dev/vdf",
directory: "/workspace/deps",
}
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extracting /dev/vdf to /workspace/deps
[2025-10-10T05:56:50Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-10T05:56:50Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:50Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
archive: "/dev/vde",
directory: "/workspace/cache",
}
[2025-10-10T05:56:50Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
archive: "/dev/vde",
directory: "/workspace/cache",
}
[2025-10-10T05:56:51Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
[2025-10-10T05:56:51Z TRACE ambient_ci::vdrive] extracting /dev/vde to /workspace/cache
[2025-10-10T05:56:59Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action Spawn {
argv: [
"find",
"/workspace",
"-maxdepth",
"2",
"-ls",
],
}
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: plan=Spawn {
argv: [
"find",
"/workspace",
"-maxdepth",
"2",
"-ls",
],
}
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
SPAWN: argv=["find", "/workspace", "-maxdepth", "2", "-ls"]
cwd=/workspace/src (exists? true)
5242881 4 drwxr-xr-x 6 root root 4096 Oct 10 05:56 /workspace
5242882 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/artifacts
5243191 4 drwxr-xr-x 3 root root 4096 Oct 10 05:56 /workspace/deps
5243192 4 drwxr-xr-x 5 root root 4096 Sep 10 13:33 /workspace/deps/registry
5271461 0 -rw-r--r-- 1 root root 0 Sep 10 13:33 /workspace/deps/.package-cache-mutate
5271460 120 -rw-r--r-- 1 root root 122880 Oct 10 05:56 /workspace/deps/.global-cache
5271462 0 -rw-r--r-- 1 root root 0 Sep 10 13:33 /workspace/deps/.package-cache
5271463 4 drwxr-xr-x 6 root root 4096 Sep 20 06:05 /workspace/cache
5276158 4 -rw-r--r-- 1 root root 218 Sep 20 05:56 /workspace/cache/.rustdoc_fingerprint.json
5271464 4 -rw-r--r-- 1 root root 1038 Oct 10 05:56 /workspace/cache/.rustc_info.json
5276159 4 drwxr-xr-x 7 root root 4096 Oct 8 05:48 /workspace/cache/debug
5271465 4 drwxr-xr-x 7 root root 4096 Oct 8 05:49 /workspace/cache/release
5276157 4 drwxr-xr-x 2 root root 4096 Sep 20 05:52 /workspace/cache/tmp
5275606 4 drwxr-xr-x 12 root root 4096 Oct 8 05:45 /workspace/cache/doc
5242883 4 drwxr-xr-x 10 root root 4096 Oct 10 05:56 /workspace/src
5242978 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/.cargo
5242959 4 -rw-r--r-- 1 root root 386 Oct 10 05:56 /workspace/src/cibtool.1
5242981 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/.ambient
5242970 4 -rw-r--r-- 1 root root 1079 Oct 10 05:56 /workspace/src/LICENSE-MIT
5242976 4 -rw-r--r-- 1 root root 44 Oct 10 05:56 /workspace/src/.gitignore
5242971 12 -rw-r--r-- 1 root root 9723 Oct 10 05:56 /workspace/src/LICENSE-APACHE
5242888 4 -rw-r--r-- 1 root root 469 Oct 10 05:56 /workspace/src/test.yaml
5242947 4 drwxr-xr-x 3 root root 4096 Oct 10 05:56 /workspace/src/debian
5242983 4 drwxr-xr-x 8 root root 4096 Oct 10 05:56 /workspace/src/.git
5242960 4 -rw-r--r-- 1 root root 440 Oct 10 05:56 /workspace/src/cib.1
5242934 8 -rw-r--r-- 1 root root 5951 Oct 10 05:56 /workspace/src/flake.nix
5242966 4 -rw-r--r-- 1 root root 2245 Oct 10 05:56 /workspace/src/RELEASE.md
5242964 2932 -rw-r--r-- 1 root root 3002368 Oct 10 05:56 /workspace/src/ci-broker.db
5242885 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/tests
5242974 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/.radicle
5242968 40 -rw-r--r-- 1 root root 37786 Oct 10 05:56 /workspace/src/NEWS.md
5242884 4 -rw-r--r-- 1 root root 1716 Oct 10 05:56 /workspace/src/Cargo.toml
5242961 4 -rw-r--r-- 1 root root 732 Oct 10 05:56 /workspace/src/ci-broker.yaml
5242969 4 -rw-r--r-- 1 root root 334 Oct 10 05:56 /workspace/src/Makefile
5242967 8 -rw-r--r-- 1 root root 4796 Oct 10 05:56 /workspace/src/README.md
5242963 92 -rw-r--r-- 1 root root 92634 Oct 10 05:56 /workspace/src/ci-broker.md
5242965 4 -rw-r--r-- 1 root root 802 Oct 10 05:56 /workspace/src/build.rs
5242977 4 -rw-r--r-- 1 root root 10 Oct 10 05:56 /workspace/src/.envrc
5242973 4 -rw-r--r-- 1 root root 1188 Oct 10 05:56 /workspace/src/CONTRIBUTING.md
5242972 100 -rw-r--r-- 1 root root 98580 Oct 10 05:56 /workspace/src/Cargo.lock
5242962 4 -rw-r--r-- 1 root root 257 Oct 10 05:56 /workspace/src/ci-broker.subplot
5242936 4 drwxr-xr-x 2 root root 4096 Oct 10 05:56 /workspace/src/doc
5242935 8 -rw-r--r-- 1 root root 6528 Oct 10 05:56 /workspace/src/flake.lock
5242887 4 -rw-r--r-- 1 root root 905 Oct 10 05:56 /workspace/src/test2.yaml
5242889 4 drwxr-xr-x 4 root root 4096 Oct 10 05:56 /workspace/src/src
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action CargoFmt
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: plan=CargoFmt
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
envs: {
"CARGO_TARGET_DIR": "/workspace/cache",
"CARGO_HOME": "/workspace/deps",
"PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
},
source_dir: "/workspace/src",
}
SPAWN: argv=["cargo", "--version"]
cwd=/workspace/src (exists? true)
cargo 1.90.0 (840b83a10 2025-07-30)
SPAWN: argv=["cargo", "clippy", "--version"]
cwd=/workspace/src (exists? true)
clippy 0.1.90 (1159e78c47 2025-09-14)
SPAWN: argv=["rustc", "--version"]
cwd=/workspace/src (exists? true)
rustc 1.90.0 (1159e78c4 2025-09-14)
SPAWN: argv=["cargo", "fmt", "--check"]
cwd=/workspace/src (exists? true)
Diff in /workspace/src/src/bin/cibtool.rs:18:
use clap::Parser;
-use radicle::{git::Oid, prelude::NodeId, Profile};
+use radicle::{Profile, git::Oid, prelude::NodeId};
use radicle_ci_broker::{
broker::BrokerError,
Diff in /workspace/src/src/bin/cibtool.rs:335:
#[error("when adding a branch-update event, the --base option is required")]
BaseRequired,
- #[error(
- "when adding a patch-create or patch--update event, the --patch-id option is required"
- )]
+ #[error("when adding a patch-create or patch--update event, the --patch-id option is required")]
PatchIdRequired,
#[error("failed to construct a CI event")]
Diff in /workspace/src/src/bin/cibtoolcmd/log.rs:1:
use std::{
convert::TryFrom,
- fs::{read, File},
+ fs::{File, read},
io::{Read, Write},
path::{Path, PathBuf},
};
Diff in /workspace/src/src/bin/synthetic-events.rs:7:
use std::{
env::current_exe,
- fs::{read, remove_file, File, OpenOptions},
+ fs::{File, OpenOptions, read, remove_file},
io::{Read, Write},
net::Shutdown,
os::unix::net::{UnixListener, UnixStream},
Diff in /workspace/src/src/adapter.rs:17:
};
use serde::Serialize;
-use tempfile::{tempdir, TempDir};
+use tempfile::{TempDir, tempdir};
use url::Url;
use crate::{
Diff in /workspace/src/src/adapter.rs:454:
mod test {
use std::{fs::write, io::ErrorKind, path::PathBuf, time::Duration};
- use tempfile::{tempdir, NamedTempFile, TempDir};
+ use tempfile::{NamedTempFile, TempDir, tempdir};
use radicle::git::Oid;
use radicle::prelude::RepoId;
Diff in /workspace/src/src/adapter.rs:465:
msg::{MessageError, Response, RunId, RunResult},
notif::NotificationChannel,
run::{RunBuilder, Whence},
- test::{mock_adapter, trigger_request, TestResult},
+ test::{TestResult, mock_adapter, trigger_request},
};
const MAX: Duration = Duration::from_secs(10);
Diff in /workspace/src/src/broker.rs:8:
time::Duration,
};
-use time::{macros::format_description, OffsetDateTime};
-use tracing::{span, Level};
+use time::{OffsetDateTime, macros::format_description};
+use tracing::{Level, span};
use radicle::prelude::RepoId;
Diff in /workspace/src/src/broker.rs:205:
msg::{RunId, RunResult},
notif::NotificationChannel,
run::RunState,
- test::{mock_adapter, trigger_request, TestResult},
+ test::{TestResult, mock_adapter, trigger_request},
};
fn broker(filename: &Path) -> anyhow::Result<Broker> {
Diff in /workspace/src/src/ci_event.rs:12:
storage::RefUpdate,
};
-use crate::refs::{ref_string, GenericRefName, TagName};
+use crate::refs::{GenericRefName, TagName, ref_string};
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
#[non_exhaustive]
Diff in /workspace/src/src/ci_event.rs:423:
const MAIN_BRANCH_REF_NAME: &str =
"refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/main";
- const PATCH_REF_NAME: &str =
- "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/patches/f9fa90725474de9002be503ae3cda4670c9a174";
+ const PATCH_REF_NAME: &str = "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/patches/f9fa90725474de9002be503ae3cda4670c9a174";
const PATCH_ID: &str = "f9fa90725474de9002be503ae3cda4670c9a174";
fn nid() -> NodeId {
Diff in /workspace/src/src/cob.rs:13:
use radicle::{
git::Oid,
node::{
- sync::{Announcer, AnnouncerConfig, ReplicationFactor},
Handle, Node,
+ sync::{Announcer, AnnouncerConfig, ReplicationFactor},
},
prelude::{Profile, ReadStorage, RepoId},
storage::git::Repository,
Diff in /workspace/src/src/db.rs:18:
use serde::{Deserialize, Serialize};
use sqlite::{Connection, State, Statement};
-use time::{macros::format_description, OffsetDateTime};
+use time::{OffsetDateTime, macros::format_description};
use uuid::Uuid;
use crate::{ci_event::CiEvent, msg::RunId, run::Run};
Diff in /workspace/src/src/ergo.rs:8:
use std::str::FromStr;
use radicle::{
- cob::patch::{cache::Patches, Patch, PatchId},
+ cob::patch::{Patch, PatchId, cache::Patches},
git::Oid,
identity::{Project, RepoId},
profile::Profile,
Diff in /workspace/src/src/ergo.rs:15:
- storage::{git::Repository, ReadStorage, RepositoryInfo},
+ storage::{ReadStorage, RepositoryInfo, git::Repository},
};
/// A Radicle node.
Diff in /workspace/src/src/filter.rs:5:
use radicle::{
cob::patch::PatchId,
- git::{raw::ObjectType, BranchName, Oid},
+ git::{BranchName, Oid, raw::ObjectType},
node::NodeId,
prelude::{Profile, RepoId},
storage::git::Repository,
Diff in /workspace/src/src/filter.rs:418:
use qcheck_macros::quickcheck;
use radicle::prelude::{Did, RepoId};
- use crate::refs::{branch_from_str, TagName};
+ use crate::refs::{TagName, branch_from_str};
use super::*;
Diff in /workspace/src/src/logger.rs:4:
use clap::ValueEnum;
use serde_json::Value;
-use tracing::{debug, error, info, trace, warn, Level};
-use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
+use tracing::{Level, debug, error, info, trace, warn};
+use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
use uuid::Uuid;
use radicle::{git::Oid, identity::RepoId, node::Event, patch::PatchId};
Diff in /workspace/src/src/msg.rs:20:
use serde_json::Value;
use uuid::Uuid;
-pub use radicle::{
- cob::patch::PatchId,
- git::Oid,
- prelude::{NodeId, RepoId},
-};
use radicle::{
+ Profile,
identity::Did,
node::{Alias, AliasStore},
patch::{self, RevisionId},
Diff in /workspace/src/src/msg.rs:32:
- storage::{git::paths, ReadRepository, ReadStorage},
- Profile,
+ storage::{ReadRepository, ReadStorage, git::paths},
};
+pub use radicle::{
+ cob::patch::PatchId,
+ git::Oid,
+ prelude::{NodeId, RepoId},
+};
use crate::{
ci_event::{CiEvent, CiEventV1},
Diff in /workspace/src/src/msg.rs:1266:
process::Command,
};
- use nonempty::{nonempty, NonEmpty};
+ use nonempty::{NonEmpty, nonempty};
use radicle::prelude::{Profile, RepoId};
- use time::{macros::format_description, OffsetDateTime};
+ use time::{OffsetDateTime, macros::format_description};
use super::{MessageError, Oid, Request, Response, RunId, RunResult};
Diff in /workspace/src/src/node_event_source.rs:3:
use std::{fmt, path::PathBuf, time};
use radicle::{
- node::{Event, Handle},
Profile,
+ node::{Event, Handle},
};
use crate::logger;
Diff in /workspace/src/src/notif.rs:1:
//! Notification channel between threads.
use std::{
- sync::mpsc::{channel, Receiver, RecvTimeoutError, Sender},
+ sync::mpsc::{Receiver, RecvTimeoutError, Sender, channel},
time::Duration,
};
Diff in /workspace/src/src/pages.rs:16:
use html_page::{Element, HtmlPage, Tag};
use rss::{Channel, ChannelBuilder, Guid, Item, ItemBuilder};
use serde::Serialize;
-use time::{macros::format_description, OffsetDateTime};
+use time::{OffsetDateTime, macros::format_description};
use radicle::{
+ Profile,
git::Oid,
prelude::RepoId,
storage::{ReadRepository, ReadStorage},
Diff in /workspace/src/src/pages.rs:25:
- Profile,
};
use crate::{
Diff in /workspace/src/src/sensitive.rs:17:
use std::fmt;
-use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
+use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
const PLACEHOLDER: &str = "<REDACTED>";
Diff in /workspace/src/src/test.rs:7:
use crate::adapter::Adapter;
use crate::ci_event::{CiEvent, CiEventV1};
use crate::msg::{Request, RequestBuilder};
+use radicle::Profile;
use radicle::crypto::ssh::Keystore;
use radicle::crypto::test::signer::MockSigner;
use radicle::git::RefString;
Diff in /workspace/src/src/test.rs:13:
use radicle::profile::{Config, Home};
use radicle::storage::ReadRepository;
use radicle::test::setup::Node;
-use radicle::Profile;
use tempfile::tempdir;
Diff in /workspace/src/src/timeoutcmd.rs:50:
io::{Read, Seek, Write},
process::{Child, Command, ExitStatus, Stdio},
sync::{
+ Arc, Condvar, Mutex, MutexGuard,
mpsc::{
- channel, sync_channel, Receiver, RecvTimeoutError, Sender, SyncSender, TryRecvError,
+ Receiver, RecvTimeoutError, Sender, SyncSender, TryRecvError, channel, sync_channel,
},
- Arc, Condvar, Mutex, MutexGuard,
},
- thread::{sleep, spawn, JoinHandle},
+ thread::{JoinHandle, sleep, spawn},
time::{Duration, Instant},
};
Diff in /workspace/src/src/timeoutcmd.rs:705:
}
#[test]
- fn sleep_for_too_long_while_reading_with_realtimelines(
- ) -> Result<(), Box<dyn std::error::Error>> {
+ fn sleep_for_too_long_while_reading_with_realtimelines()
+ -> Result<(), Box<dyn std::error::Error>> {
let (running, mut stdout) = setup("exec sleep 1000", SHORT_TIMEOUT, None)?;
while stdout.line().is_some() {}
let result = running.wait();
Diff in /workspace/src/src/util.rs:8:
use tempfile::NamedTempFile;
use time::{
- format_description::{well_known::Rfc2822, FormatItem},
+ OffsetDateTime, PrimitiveDateTime,
+ format_description::{FormatItem, well_known::Rfc2822},
macros::format_description,
parsing::Parsable,
- OffsetDateTime, PrimitiveDateTime,
};
use radicle::{
Diff in /workspace/src/src/util.rs:18:
+ Profile, Storage,
cob::ObjectId,
git::Oid,
prelude::{NodeId, RepoId},
Diff in /workspace/src/src/util.rs:21:
storage::ReadStorage,
- Profile, Storage,
};
pub fn lookup_repo(profile: &Profile, wanted: &str) -> Result<(RepoId, String), UtilError> {
Diff in /workspace/src/src/worker.rs:4:
//! are implemented and used, as well as logging. A worker thread does
//! what it does. The abstraction is not meant to constrain that.
-use std::thread::{spawn, JoinHandle};
+use std::thread::{JoinHandle, spawn};
/// Start a new thread. Caller must catch the thread handle and
/// join it to wait for thread to end.
[2025-10-10T05:57:00Z ERROR ambient_ci::plan] ERROR: Action failed: failed to execute cargo
[2025-10-10T05:57:00Z ERROR ambient_ci::plan] caused by: command failed: "cargo": exit code 1
ERROR: failed to execute cargo
caused by: command failed: "cargo": exit code 1
EXIT CODE: 1
====================
[2025-10-10T05:57:02Z DEBUG ambient_ci::qemu] QEMU: CI run under exit code 1
[2025-10-10T05:57:03Z DEBUG ambient_ci::run] CI run exit code from QEMU: 1
[2025-10-10T05:57:03Z DEBUG ambient_ci::project] write project state to /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/meta.yaml
ERROR: CI run failed inside QEMU
<empty log>