Radish alpha
r
rad:zwTxygwuz5LDGBq255RA2CbNGrz8
Radicle CI broker
Radicle
Git
update CI broker to depend on current Radicle crate versions
Merged liw opened 3 months ago
7 files changed +132 -78 b6efecdd 13a68607
modified Cargo.lock
@@ -735,9 +735,9 @@ dependencies = [

[[package]]
name = "descape"
-
version = "2.0.3"
+
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7c1113b908df80c963b107424498e37fba986b424b605729d1492dfbe4b2a630"
+
checksum = "700357d9fb22b5232a85e34a413c1a76ae649f532c31107e402dc84e9c03bfb2"

[[package]]
name = "deunicode"
@@ -784,10 +784,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9"

[[package]]
+
name = "dunce"
+
version = "1.0.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
+

+
[[package]]
name = "duration-str"
-
version = "0.12.0"
+
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "64ad6b66883f70e2f38f1ee99e3797b9d7e7b7fb051ed2e23e027c81753056c8"
+
checksum = "e6eb193f176998d2f9fed5cfea52af8237f86a03fe66b85f96ad75d890a85299"
dependencies = [
 "chrono",
 "rust_decimal",
@@ -1063,12 +1069,12 @@ dependencies = [

[[package]]
name = "git-ref-format"
-
version = "0.4.0"
+
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "c6162eaa58800412e548ab9e0d06dce1e30033b86c0d76ec533ce0268808da8e"
+
checksum = "ed6913a77cee9e231cab93577c9a5eea84a1344ab39294d91dc075b3c24499d0"
dependencies = [
-
 "git-ref-format-core 0.4.0",
-
 "git-ref-format-macro 0.4.0",
+
 "git-ref-format-core 0.6.0",
+
 "git-ref-format-macro 0.6.0",
]

[[package]]
@@ -1083,9 +1089,9 @@ dependencies = [

[[package]]
name = "git-ref-format-core"
-
version = "0.4.0"
+
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ed188b0784192e09c03f731d5a9ca4066cae0578e71c041b235b9e233582d1de"
+
checksum = "1955ef3abddd586f24c834d28f959d610157ab5cb71f2200911932a0018d0364"
dependencies = [
 "serde",
 "thiserror 1.0.69",
@@ -1105,11 +1111,11 @@ dependencies = [

[[package]]
name = "git-ref-format-macro"
-
version = "0.4.0"
+
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "6ff61d62c2c3b3735d20d45db285bf471c39f2bab7ec5e993ac9df7786d56bdf"
+
checksum = "4e730f09c82961c28f5465b83da0aa5c2716156ce57da33a1fa51bbd560aa5f7"
dependencies = [
-
 "git-ref-format-core 0.4.0",
+
 "git-ref-format-core 0.6.0",
 "proc-macro-error2",
 "quote",
 "syn 2.0.111",
@@ -1646,6 +1652,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "549e471b99ccaf2f89101bec68f4d244457d5a95a9c3d0672e9564124397741d"

[[package]]
+
name = "nonempty"
+
version = "0.12.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9737e026353e5cd0736f98eddae28665118eb6f6600902a7f50db585621fecb6"
+

+
[[package]]
name = "normpath"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2058,15 +2070,16 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"

[[package]]
name = "radicle"
-
version = "0.18.0"
+
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "d7619819155800f9a358b19f42ba07f878c9af017fa1ed92a59fbf3ab21c3aa6"
+
checksum = "91edce404aa2177a9687c66f2fbdad78d98b77aad1992728f05eba4c559dd007"
dependencies = [
 "amplify",
 "base64 0.21.7",
 "bytesize",
 "crossbeam-channel",
 "cyphernet",
+
 "dunce",
 "fast-glob",
 "fastrand",
 "git2",
@@ -2101,12 +2114,11 @@ dependencies = [
 "duration-str",
 "html-page",
 "libc",
-
 "nonempty 0.11.0",
+
 "nonempty 0.12.0",
 "qcheck",
 "qcheck-macros",
 "radicle",
 "radicle-crypto",
-
 "radicle-git-ext 0.9.0",
 "radicle-job",
 "radicle-surf",
 "regex",
@@ -2117,7 +2129,7 @@ dependencies = [
 "sqlite",
 "subplotlib",
 "tempfile",
-
 "thiserror 1.0.69",
+
 "thiserror 2.0.17",
 "time",
 "tracing",
 "tracing-subscriber",
@@ -2127,9 +2139,9 @@ dependencies = [

[[package]]
name = "radicle-cob"
-
version = "0.15.0"
+
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5514b7b58e4300a766132905486ebb743248ee0444fbaf38af05f501851b7d89"
+
checksum = "672f459d736dcd68f970bc3140adb1c1c9c8399a15b9c2b3ff58a682bbfad92a"
dependencies = [
 "fastrand",
 "git2",
@@ -2146,9 +2158,9 @@ dependencies = [

[[package]]
name = "radicle-crypto"
-
version = "0.13.0"
+
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8cd6a14a4326268a9504e0018f1afb100fda7932342a85bd2a06e19b20e84eaa"
+
checksum = "c811eab805f7a5ac5205773314f64e53658b713bfc2ee8984bfb8b8184a79773"
dependencies = [
 "amplify",
 "cyphernet",
@@ -2184,29 +2196,30 @@ dependencies = [
 "git-ref-format 0.3.1",
 "git2",
 "percent-encoding",
-
 "radicle-std-ext",
+
 "radicle-std-ext 0.1.1",
 "serde",
 "thiserror 1.0.69",
]

[[package]]
name = "radicle-git-ext"
-
version = "0.9.0"
+
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "46d0fcd9103cb66d5450aed216bffb4c8458ede46aeef9ec77c649b93d29d99b"
+
checksum = "71a5fbca2ee3fc61a6b467e0b85da7c092421afc2538feb0023ad6792d6e39d0"
dependencies = [
-
 "git-ref-format 0.4.0",
+
 "git-ref-format 0.6.0",
 "git2",
 "percent-encoding",
-
 "radicle-std-ext",
+
 "radicle-std-ext 0.2.0",
+
 "serde",
 "thiserror 1.0.69",
]

[[package]]
name = "radicle-job"
-
version = "0.3.0"
+
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "0ed32cf4f87836a54cce564f90c28cf57f96decc294e0ffd50c53e5475d4fb99"
+
checksum = "0985025a171487350c663884a5384694787cb09137160878640290a80e8af52f"
dependencies = [
 "clap",
 "indexmap",
@@ -2239,10 +2252,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5310e7a04506b6ce92dc9c47b26bd24c1c680937a3dcd13cd20847f89dbda32a"

[[package]]
+
name = "radicle-std-ext"
+
version = "0.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "fb935931bdd2a2966f3b584f3031d9d54ec0713ddbc563a0193d54e62a88ec73"
+

+
[[package]]
name = "radicle-surf"
-
version = "0.22.1"
+
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "0bf6aff57520e8e7200bf7826ddc5ccf8d4612dd880497a4f256c3d272eeb805"
+
checksum = "4c814514d0bf56fbec811099eaa14da1349639b04b8317746c9cd9e6b0f02196"
dependencies = [
 "anyhow",
 "base64 0.21.7",
@@ -2250,8 +2269,8 @@ dependencies = [
 "git2",
 "log",
 "nonempty 0.9.0",
-
 "radicle-git-ext 0.8.1",
-
 "radicle-std-ext",
+
 "radicle-git-ext 0.11.0",
+
 "radicle-std-ext 0.2.0",
 "serde",
 "tar",
 "thiserror 1.0.69",
@@ -2409,9 +2428,9 @@ dependencies = [

[[package]]
name = "rustix"
-
version = "1.1.2"
+
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
+
checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
dependencies = [
 "bitflags",
 "errno",
@@ -2761,9 +2780,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"

[[package]]
name = "subplot"
-
version = "0.13.0"
+
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7a2d7d684d11cc4256f675dd026f2999762fdd407dcdfae7ed06005370359dc6"
+
checksum = "ce52f92afd3620741f37196d9bb141af4f39c41d052c17d31c6cc986f0a4e4a1"
dependencies = [
 "anyhow",
 "base64 0.22.1",
@@ -2788,9 +2807,9 @@ dependencies = [

[[package]]
name = "subplotlib"
-
version = "0.13.0"
+
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e975eda1ad88fef962133294b2bfee9e3a586b92e2f57b4d7c7544485199f042"
+
checksum = "480982d1f71ebb62f403d5397f8450ea34f60d21fee6b15f78918975d54ddc52"
dependencies = [
 "base64 0.22.1",
 "culpa",
@@ -2808,9 +2827,9 @@ dependencies = [

[[package]]
name = "subplotlib-derive"
-
version = "0.13.0"
+
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "bd444e7bcbeb865f8337901f7266b9d6175b36cd16c4950fe2a49f4dbdbc7785"
+
checksum = "8e0ca8189bc1404ea9047db21d2185920577efcca981f2128f3232a5d2d02381"
dependencies = [
 "culpa",
 "proc-macro2",
@@ -2877,9 +2896,9 @@ dependencies = [

[[package]]
name = "tempfile"
-
version = "3.23.0"
+
version = "3.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
+
checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"
dependencies = [
 "fastrand",
 "getrandom 0.3.4",
@@ -3659,9 +3678,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"

[[package]]
name = "winnow"
-
version = "0.6.26"
+
version = "0.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28"
+
checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"
dependencies = [
 "memchr",
]
modified Cargo.toml
@@ -12,32 +12,28 @@ categories = ["development-tools::build-utils"]

[dependencies]
clap = { version = "4.5.11", features = ["derive", "wrap_help"] }
-
duration-str = "0.12.0"
+
duration-str = "0.18.0"
html-page = "0.4.0"
libc = "0.2.175"
-
nonempty = "0.11.0"
-
radicle-crypto = "0.13.0"
-
radicle-git-ext = "0.9.0"
-
radicle-job = "0.3.0"
-
radicle-surf = { version = "0.22.0", default-features = false, features = ["serde"] }
-
regex = "1.10.5"
+
nonempty = "0.12.0"
+
radicle = { version = "0.20.0", features = ["default", "test"] }
+
radicle-crypto = "0.14.0"
+
radicle-job = "0.4.0"
+
radicle-surf = { version = "0.26.0", default-features = false, features = ["serde"] }
+
regex = "1.12.2"
rss = "2.0.9"
serde = { version = "1.0.204", features = ["derive"] }
serde_json = "1.0.121"
serde_norway = "0.9.42"
sqlite = "0.32.0"
-
subplotlib = "0.13.0"
-
tempfile = { version = "3.10.1" }
-
thiserror = "1.0.63"
+
subplotlib = "0.14.0"
+
tempfile = { version = "3.24.0" }
+
thiserror = "2.0.0"
time = { version = "0.3.36", features = ["formatting", "macros"] }
tracing = { version = "0.1.40", features = ["max_level_trace", "release_max_level_trace", "valuable"] }
tracing-subscriber = { version = "0.3.18", features = ["env-filter", "fmt", "json", "valuable"] }
url = "2.5.4"
-
uuid = { version = "1.10.0", features = ["v4"] }
-

-
[dependencies.radicle]
-
version = "0.18.0"
-
features = ["default", "test"]
+
uuid = { version = "1.19.0", features = ["v4"] }

[dev-dependencies]
culpa = "1.0.2"
modified src/bin/cibtoolcmd/message.rs
@@ -1,5 +1,6 @@
use clap::ValueEnum;

+
use radicle::cob::Title;
use radicle_ci_broker::msg::{Request, RequestBuilder, Response, RunId, RunResult};
use radicle_ci_broker::test::MockNode;

@@ -97,7 +98,7 @@ fn patch() -> Result<Request, MessageError> {
    let mut cache = radicle::cob::cache::NoCache;
    let patch_cob = patches
        .create(
-
            "my patch title",
+
            Title::new("my patch title")?,
            "my patch description",
            MergeTarget::Delegates,
            repo_head,
@@ -155,4 +156,7 @@ pub enum MessageError {

    #[error(transparent)]
    Patch(#[from] radicle::patch::Error),
+

+
    #[error(transparent)]
+
    Title(#[from] radicle::cob::common::TitleError),
}
modified src/ci_event.rs
@@ -13,6 +13,7 @@ use radicle::{
};

use crate::{
+
    logger,
    msg::RunId,
    refs::{GenericRefName, TagName, ref_string},
};
@@ -335,16 +336,10 @@ impl CiEvent {
                }
                Ok(events)
            }
-
            Event::RefsSynced { .. }
-
            | Event::RefsAnnounced { .. }
-
            | Event::NodeAnnounced { .. }
-
            | Event::SeedDiscovered { .. }
-
            | Event::SeedDropped { .. }
-
            | Event::PeerConnected { .. }
-
            | Event::PeerDisconnected { .. }
-
            | Event::LocalRefsAnnounced { .. }
-
            | Event::UploadPack { .. }
-
            | Event::InventoryAnnounced { .. } => Ok(vec![]),
+
            _ => {
+
                logger::node_event_not_handled(event);
+
                Ok(vec![])
+
            }
        }
    }

modified src/cob.rs
@@ -320,7 +320,7 @@ impl JobError {
        Self::CreateJob(Box::new(err))
    }

-
    fn signer(err: radicle::profile::Error) -> Self {
+
    fn signer(err: radicle::profile::SignerError) -> Self {
        Self::Signer(Box::new(err))
    }

modified src/logger.rs
@@ -141,6 +141,7 @@ enum Id {
    JobRunCreate,
    JobRunFinished,

+
    NodeEventNotHandled,
    NodeEventSourceCreated,
    NodeEventSourceDisconnected,
    NodeEventSourceEnd,
@@ -355,6 +356,15 @@ pub fn node_event_source_eof(source: &NodeEventSource) {
    );
}

+
pub fn node_event_not_handled(event: &Event) {
+
    debug!(
+
        msg_id = ?Id::NodeEventNotHandled,
+
        kind = %Kind::Debug,
+
        ?event,
+
        "node events of this type are not handled"
+
    );
+
}
+

pub fn ci_event_source_created(source: &CiEventSource) {
    debug!(
        msg_id = ?Id::CiEventSourceCreated,
modified src/msg.rs
@@ -32,6 +32,7 @@ pub use radicle::{
    git::Oid,
    prelude::{NodeId, RepoId},
};
+
pub use radicle_surf::Commit;

use crate::{
    ci_event::{CiEvent, CiEventV1},
@@ -157,7 +158,6 @@ impl<'a> RequestBuilder<'a> {
                }
                Ok(x) => x,
            };
-

            let identity = rad_repo
                .identity()
                .map_err(MessageError::repository_error)?;
@@ -202,10 +202,39 @@ impl<'a> RequestBuilder<'a> {
            tip: Oid,
            base: Oid,
        ) -> Result<Vec<Oid>, radicle_surf::Error> {
+
            // We have an object ID from the `radicle` crate. We need to
+
            // convert into a value of the type `radicle-surf` wants, which
+
            // is from `radicle-git-ext`. As of 2026-01-16, we have multiple
+
            // versions of `radicle-git-ext` in our dependency graph: the latest
+
            // version of `radicle-surf` depends on an older version of `radicle-git-ext`
+
            // thatn `radicle` itself does.
+

+
            // Unwrapping is OK here, because we know `tip` is OK.
+
            #[allow(clippy::unwrap_used)]
+
            let commit = {
+
                let ext_oid = radicle_surf::Oid::try_from(tip.as_bytes()).unwrap();
+
                git_repo.commit(ext_oid).unwrap()
+
            };
            git_repo
-
                .history(tip)?
-
                .take_while(|c| if let Ok(c) = c { c.id != base } else { false })
-
                .map(|r| r.map(|c| c.id))
+
                .history(commit)?
+
                .take_while(|c| {
+
                    if let Ok(c) = c {
+
                        c.id.as_bytes() != base.as_bytes()
+
                    } else {
+
                        false
+
                    }
+
                })
+
                .filter_map(|result| {
+
                    if let Ok(commit) = result {
+
                        if let Ok(id) = Oid::try_from(commit.id.as_bytes()) {
+
                            Some(Ok(id))
+
                        } else {
+
                            None
+
                        }
+
                    } else {
+
                        None
+
                    }
+
                })
                .collect::<Result<Vec<Oid>, _>>()
        }

@@ -1053,6 +1082,7 @@ impl MessageError {
pub mod trigger_from_ci_event_tests {
    use crate::ci_event::{CiEvent, CiEventV1};
    use crate::msg::{EventType, Request, RequestBuilder};
+
    use radicle::cob::Title;
    use radicle::git::RefString;
    use radicle::patch::{MergeTarget, Patches};
    use radicle::prelude::Did;
@@ -1177,7 +1207,7 @@ pub mod trigger_from_ci_event_tests {
        let mut patches = Patches::open(&project.repo)?;
        let mut cache = radicle::cob::cache::NoCache;
        let patch_cob = patches.create(
-
            "my patch title",
+
            Title::new("my patch title").unwrap(),
            "my patch description",
            MergeTarget::Delegates,
            repo_head,
@@ -1249,7 +1279,7 @@ pub mod trigger_from_ci_event_tests {
        let mut patches = Patches::open(&project.repo)?;
        let mut cache = radicle::cob::cache::NoCache;
        let patch_cob = patches.create(
-
            "my patch title",
+
            Title::new("my patch title").unwrap(),
            "my patch description",
            MergeTarget::Delegates,
            repo_head,