Log from Radicle native CI

Request message

{
  "request": "trigger",
  "version": 1,
  "event_type": "push",
  "repository": {
    "id": "rad:zwTxygwuz5LDGBq255RA2CbNGrz8",
    "name": "radicle-ci-broker",
    "description": "Radicle CI broker",
    "private": false,
    "default_branch": "main",
    "delegates": [
      "did:key:z6MkgEMYod7Hxfy9qCvDv5hYHkZ4ciWmLFgfvm3Wn1b2w2FV",
      "did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT"
    ]
  },
  "pusher": {
    "id": "did:key:z6MkgEMYod7Hxfy9qCvDv5hYHkZ4ciWmLFgfvm3Wn1b2w2FV",
    "alias": "liw"
  },
  "before": "d537fd39d134550a61e8f83b1554d1235c280f2a",
  "after": "d537fd39d134550a61e8f83b1554d1235c280f2a",
  "branch": "",
  "commits": [
    "d537fd39d134550a61e8f83b1554d1235c280f2a"
  ]
}

.radicle/native.yaml

shell: |
  cargo --version
  rustc --version

  cargo fmt --check
  cargo clippy --all-targets --workspace -- -Dwarnings
  cargo build --all-targets --workspace
  cargo doc --workspace
  cargo test --workspace --no-fail-fast

  subplot docgen ci-broker.subplot -o doc/ci-broker.html
  subplot docgen doc/userguide.subplot -o doc/userguide.html
  make -C doc publish

Table of contents

Run: git clone /home/_rad/.radicle/storage/zwTxygwuz5LDGBq255RA2CbNGrz8 /srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src

Command arguments:

In directory: /

Exit code: 0

Output (stdout and stderr):

Cloning into '/srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src'...
done.

Run: git config advice.detachedHead false

Command arguments:

In directory: /srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src

Exit code: 0

Run: git checkout d537fd39d134550a61e8f83b1554d1235c280f2a

Command arguments:

In directory: /srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src

Exit code: 0

Output (stdout and stderr):

HEAD is now at d537fd3 feat: filter on originating node for an event

Run: git show d537fd39d134550a61e8f83b1554d1235c280f2a

Command arguments:

In directory: /srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src

Exit code: 0

Output (stdout and stderr):

commit d537fd39d134550a61e8f83b1554d1235c280f2a
Author: Lars Wirzenius <liw@liw.fi>
Date:   Mon Oct 21 13:48:47 2024 +0300

    feat: filter on originating node for an event
    
    Add the `Node(nid)` event filter.
    
    Add the `from_node` field to the `BranchDeleted` event so that it too
    can be filtered based on node.
    
    Adjust debug logging for event filtering so that it reports the
    filtering decision.
    
    Signed-off-by: Lars Wirzenius <liw@liw.fi>

diff --git a/doc/userguide.md b/doc/userguide.md
index 0f8d40f..04a9992 100644
--- a/doc/userguide.md
+++ b/doc/userguide.md
@@ -76,11 +76,12 @@ A branch has been updated.
 
 A branch has been deleted.
 
-| Event           | fields              | field types |
-|:----------------|:--------------------|:------------|
-| `BranchDeleted` | `repo`              | `RepoId`    |
-|                 | `branch`            | `RefString` |
-|                 | `tip`               | ` Oid`      |
+| Event           | fields      | field types |
+|:----------------|:------------|:------------|
+| `BranchDeleted` | `from_node` | `NodeId`    |
+|                 | `repo`      | `RepoId`    |
+|                 | `branch`    | `RefString` |
+|                 | `tip`       | ` Oid`      |
 
 ## `PatchCreated`
 
@@ -114,6 +115,7 @@ Otherwise it is discarded and does not trigger a CI run.
 
 | Condition       | Meaning                                                   |
 |:----------------|:----------------------------------------------------------|
+| `Node`          | Event originated from a specific node, identified by ID   |
 | `Repository`    | Event refers to a specific repository, identified by ID   |
 | `Branch`        | Event refers to a specific Git branch                     |
 | `BranchCreated` | Branch was created                                        |
diff --git a/src/ci_event.rs b/src/ci_event.rs
index 5937579..7398902 100644
--- a/src/ci_event.rs
+++ b/src/ci_event.rs
@@ -37,6 +37,7 @@ pub enum CiEventV1 {
         old_tip: Oid,
     },
     BranchDeleted {
+        from_node: NodeId,
         repo: RepoId,
         branch: RefString,
         tip: Oid,
@@ -157,6 +158,7 @@ impl CiEvent {
                             }
                         }
                         RefUpdate::Deleted { name, oid } => CiEventV1::BranchDeleted {
+                            from_node: *remote,
                             repo: *rid,
                             branch: branch(name, update)?,
                             tip: *oid,
@@ -402,8 +404,9 @@ mod test {
             Ok(events) if !events.is_empty() => {
                 for e in events {
                     match e {
-                        CiEvent::V1(CiEventV1::BranchDeleted { repo, branch, tip })
-                            if repo == rid && branch == main && tip == oid => {}
+                        CiEvent::V1(CiEventV1::BranchDeleted {
+                            repo, branch, tip, ..
+                        }) if repo == rid && branch == main && tip == oid => {}
                         _ => panic!("should not succeed that way"),
                     }
                 }
diff --git a/src/filter.rs b/src/filter.rs
index 2882fc7..cd9b399 100644
--- a/src/filter.rs
+++ b/src/filter.rs
@@ -2,7 +2,7 @@ use std::path::{Path, PathBuf};
 
 use serde::{Deserialize, Serialize};
 
-use radicle::{cob::patch::PatchId, git::RefString, prelude::RepoId};
+use radicle::{cob::patch::PatchId, git::RefString, node::NodeId, prelude::RepoId};
 use radicle_git_ext::Oid;
 
 use crate::{
@@ -38,6 +38,9 @@ pub enum EventFilter {
     /// Patch was updated,
     PatchUpdated,
 
+    /// Change originated from specific node.
+    Node(NodeId),
+
     /// Allow any event.
     Allow,
 
@@ -56,7 +59,6 @@ pub enum EventFilter {
 
 impl EventFilter {
     pub fn allows(&self, event: &CiEvent) -> bool {
-        logger::debug2(format!("EventFilter::allows: event={event:?}"));
         match self {
             Self::Allow => return true,
             Self::Deny => return false,
@@ -66,39 +68,75 @@ impl EventFilter {
             _ => (),
         }
 
-        match event {
+        let decision = match event {
             CiEvent::V1(CiEventV1::Shutdown) => true,
-            CiEvent::V1(CiEventV1::BranchCreated { repo, branch, .. }) => match self {
+            CiEvent::V1(CiEventV1::BranchCreated {
+                from_node,
+                repo,
+                branch,
+                ..
+            }) => match self {
+                Self::Node(wantedc) => from_node == wantedc,
                 Self::Repository(wanted) => repo == wanted,
                 Self::Branch(wanted) => branch == wanted,
                 Self::BranchCreated => true,
                 _ => false,
             },
-            CiEvent::V1(CiEventV1::BranchUpdated { repo, branch, .. }) => match self {
+            CiEvent::V1(CiEventV1::BranchUpdated {
+                from_node,
+                repo,
+                branch,
+                ..
+            }) => match self {
+                Self::Node(wanted) => from_node == wanted,
                 Self::Repository(wanted) => repo == wanted,
                 Self::Branch(wanted) => branch == wanted,
                 Self::BranchUpdated => true,
                 _ => false,
             },
-            CiEvent::V1(CiEventV1::BranchDeleted { repo, branch, .. }) => match self {
+            CiEvent::V1(CiEventV1::BranchDeleted {
+                from_node,
+                repo,
+                branch,
+                ..
+            }) => match self {
+                Self::Node(wanted) => from_node == wanted,
                 Self::Repository(wanted) => repo == wanted,
                 Self::Branch(wanted) => branch == wanted,
                 Self::BranchDeleted => true,
                 _ => false,
             },
-            CiEvent::V1(CiEventV1::PatchCreated { repo, patch, .. }) => match self {
+            CiEvent::V1(CiEventV1::PatchCreated {
+                from_node,
+                repo,
+                patch,
+                ..
+            }) => match self {
+                Self::Node(wanted) => from_node == wanted,
                 Self::Repository(wanted) => repo == wanted,
                 Self::Patch(wanted) => *patch == PatchId::from(wanted),
                 Self::PatchCreated => true,
                 _ => false,
             },
-            CiEvent::V1(CiEventV1::PatchUpdated { repo, patch, .. }) => match self {
+            CiEvent::V1(CiEventV1::PatchUpdated {
+                from_node,
+                repo,
+                patch,
+                ..
+            }) => match self {
+                Self::Node(wanted) => from_node == wanted,
                 Self::Repository(wanted) => repo == wanted,
                 Self::Patch(wanted) => *patch == PatchId::from(wanted),
                 Self::PatchUpdated => true,
                 _ => false,
             },
-        }
+        };
+
+        logger::debug2(format!(
+            "EventFilter::allows: decision={decision} event={event:?}"
+        ));
+
+        decision
     }
 
     pub fn from_file(filename: &Path) -> Result<Vec<Self>, FilterError> {
@@ -132,6 +170,10 @@ mod test {
         Did::decode("did:key:z6MkgEMYod7Hxfy9qCvDv5hYHkZ4ciWmLFgfvm3Wn1b2w2FV").unwrap()
     }
 
+    fn other_did() -> Did {
+        Did::decode("did:key:z6MkfXa53s1ZSFy8rktvyXt5ADCojnxvjAoQpzajaXyLqG5n").unwrap()
+    }
+
     fn rid() -> RepoId {
         const RID: &str = "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5";
         RepoId::from_urn(RID).unwrap()
@@ -194,7 +236,12 @@ mod test {
                 tip,
                 old_tip,
             }),
-            CiEvent::V1(CiEventV1::BranchDeleted { repo, branch, tip }),
+            CiEvent::V1(CiEventV1::BranchDeleted {
+                from_node: did.into(),
+                repo,
+                branch,
+                tip,
+            }),
             CiEvent::V1(CiEventV1::PatchCreated {
                 from_node: did.into(),
                 repo,
@@ -460,6 +507,20 @@ mod test {
         }
     }
 
+    #[test]
+    fn allows_all_for_right_node() {
+        let filter = EventFilter::Node(*did());
+        let events = all_events(did(), rid(), refstring("main"), patch_id(), oid(), oid());
+        assert!(events.iter().all(|e| filter.allows(e)));
+    }
+
+    #[test]
+    fn allows_none_for_wrong_node() {
+        let filter = EventFilter::Node(*other_did());
+        let events = all_events(did(), rid(), refstring("main"), patch_id(), oid(), oid());
+        assert!(!events.iter().any(|e| filter.allows(e)));
+    }
+
     #[test]
     fn allows_any_event() {
         let filter = EventFilter::Allow;
diff --git a/src/pages.rs b/src/pages.rs
index c580016..3fb616c 100644
--- a/src/pages.rs
+++ b/src/pages.rs
@@ -196,9 +196,9 @@ impl PageData {
                     tip,
                     old_tip: _,
                 }) => render_event(repo, branch, tip),
-                CiEvent::V1(CiEventV1::BranchDeleted { repo, branch, tip }) => {
-                    render_event(repo, branch, tip)
-                }
+                CiEvent::V1(CiEventV1::BranchDeleted {
+                    repo, branch, tip, ..
+                }) => render_event(repo, branch, tip),
                 CiEvent::V1(CiEventV1::PatchCreated {
                     from_node: _,
                     repo,

Run: timeout 600 bash -c set -xeuo pipefail cargo --version rustc --version cargo fmt --check cargo clippy --all-targets --workspace -- -Dwarnings cargo build --all-targets --workspace cargo doc --workspace cargo test --workspace --no-fail-fast subplot docgen ci-broker.subplot -o doc/ci-broker.html subplot docgen doc/userguide.subplot -o doc/userguide.html make -C doc publish

Command arguments:

In directory: /srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src

Exit code: 0

Output (stdout and stderr):

+ cargo --version
cargo 1.80.1 (376290515 2024-07-16)
+ rustc --version
rustc 1.80.1 (3f5fd8dd4 2024-08-06)
+ cargo fmt --check
+ cargo clippy --all-targets --workspace -- -Dwarnings
   Compiling proc-macro2 v1.0.86
   Compiling unicode-ident v1.0.13
   Compiling version_check v0.9.5
   Compiling libc v0.2.158
   Compiling typenum v1.17.0
    Checking cfg-if v1.0.0
   Compiling serde v1.0.210
   Compiling shlex v1.3.0
   Compiling thiserror v1.0.63
   Compiling memchr v2.7.4
   Compiling once_cell v1.20.0
   Compiling byteorder v1.5.0
   Compiling syn v1.0.109
   Compiling bitflags v2.6.0
    Checking subtle v2.6.1
   Compiling rustix v0.38.37
   Compiling crossbeam-utils v0.8.20
   Compiling pkg-config v0.3.30
   Compiling linux-raw-sys v0.4.14
   Compiling anyhow v1.0.89
   Compiling itoa v1.0.11
   Compiling generic-array v0.14.7
   Compiling ahash v0.8.11
   Compiling log v0.4.22
   Compiling regex-syntax v0.8.4
    Checking cpufeatures v0.2.14
   Compiling num-conv v0.1.0
   Compiling allocator-api2 v0.2.18
   Compiling utf8parse v0.2.2
   Compiling aho-corasick v1.1.3
   Compiling same-file v1.0.6
   Compiling time-core v0.1.2
   Compiling anstyle-parse v0.2.5
   Compiling time-macros v0.2.18
   Compiling walkdir v2.5.0
   Compiling colorchoice v1.0.2
   Compiling ucd-trie v0.1.6
   Compiling anstyle v1.0.8
   Compiling is_terminal_polyfill v1.70.1
   Compiling anstyle-query v1.1.1
   Compiling bstr v1.10.0
   Compiling quote v1.0.37
   Compiling heck v0.5.0
   Compiling unic-common v0.9.0
   Compiling anstream v0.6.15
   Compiling powerfmt v0.2.0
   Compiling vcpkg v0.2.15
   Compiling syn v2.0.77
   Compiling jobserver v0.1.32
   Compiling getrandom v0.2.15
   Compiling crossbeam-epoch v0.9.18
   Compiling unic-char-range v0.9.0
   Compiling libm v0.2.8
   Compiling rand_core v0.6.4
   Compiling doc-comment v0.3.3
   Compiling cc v1.1.19
   Compiling unicode-width v0.1.13
   Compiling crossbeam-deque v0.8.5
   Compiling unic-char-property v0.9.0
   Compiling deranged v0.3.11
   Compiling unic-ucd-version v0.9.0
   Compiling proc-macro-error-attr v1.0.4
   Compiling unicase v2.7.0
   Compiling encoding_rs v0.8.34
   Compiling serde_json v1.0.128
    Checking tinyvec_macros v0.1.1
   Compiling strsim v0.11.1
   Compiling arraydeque v0.5.1
   Compiling fastrand v2.1.1
    Checking crypto-common v0.1.6
    Checking block-buffer v0.10.4
    Checking block-padding v0.3.3
   Compiling clap_lex v0.7.2
    Checking universal-hash v0.5.1
    Checking digest v0.10.7
    Checking inout v0.1.3
    Checking tinyvec v1.8.0
    Checking cipher v0.4.4
   Compiling clap_builder v4.5.17
   Compiling unic-ucd-segment v0.9.0
   Compiling proc-macro-error v1.0.4
    Checking signature v1.6.4
   Compiling pulldown-cmark v0.12.1
   Compiling time v0.3.36
   Compiling unicode-linebreak v0.1.5
   Compiling tempfile v3.12.0
   Compiling regex-automata v0.4.7
   Compiling ryu v1.0.18
   Compiling amplify_syn v2.0.1
   Compiling smawk v0.3.2
   Compiling deunicode v1.6.0
    Checking opaque-debug v0.3.1
   Compiling textwrap v0.16.1
    Checking unicode-normalization v0.1.23
   Compiling humansize v2.1.3
   Compiling unic-segment v0.9.0
   Compiling slug v0.1.6
    Checking ed25519 v1.5.3
   Compiling getopts v0.2.21
   Compiling libz-sys v1.1.20
   Compiling pikchr v0.1.3
   Compiling libgit2-sys v0.17.0+1.8.1
   Compiling subplot v0.11.0
    Checking ascii v1.1.0
    Checking percent-encoding v2.3.1
   Compiling humantime v2.1.0
   Compiling utf8-width v0.1.7
   Compiling pulldown-cmark-escape v0.11.0
    Checking amplify_num v0.5.3
    Checking unicode-bidi v0.3.15
    Checking ct-codecs v1.1.2
   Compiling lazy_static v1.5.0
    Checking form_urlencoded v1.2.1
    Checking ec25519 v0.1.0
   Compiling html-escape v0.2.13
   Compiling sqlite3-src v0.5.1
    Checking polyval v0.6.2
   Compiling amplify_derive v4.0.1
    Checking idna v0.5.0
    Checking sha2 v0.10.8
   Compiling tracing-core v0.1.32
    Checking base64ct v1.6.0
    Checking keccak v0.1.5
   Compiling line-col v0.2.1
   Compiling pin-project-lite v0.2.14
   Compiling file_diff v1.0.0
   Compiling base64 v0.22.1
    Checking pem-rfc7468 v0.7.0
    Checking sha3 v0.10.8
    Checking ghash v0.5.1
    Checking aes v0.8.4
    Checking ctr v0.9.2
    Checking aead v0.5.2
    Checking equivalent v1.0.1
    Checking base32 v0.4.0
   Compiling data-encoding v2.6.0
    Checking hashbrown v0.14.5
   Compiling cfg_aliases v0.2.1
   Compiling nix v0.29.0
    Checking blowfish v0.9.1
    Checking ssh-encoding v0.2.0
   Compiling regex v1.10.6
   Compiling globset v0.4.15
    Checking aes-gcm v0.10.3
    Checking poly1305 v0.8.0
    Checking cbc v0.1.2
    Checking chacha20 v0.9.1
    Checking pbkdf2 v0.12.2
   Compiling env_filter v0.1.2
    Checking zeroize v1.8.1
    Checking radicle-std-ext v0.1.0
   Compiling ignore v0.4.23
    Checking indexmap v2.5.0
   Compiling adler2 v2.0.0
   Compiling env_logger v0.11.5
   Compiling miniz_oxide v0.8.0
    Checking ssh-cipher v0.2.0
    Checking bcrypt-pbkdf v0.10.0
    Checking rand v0.8.5
   Compiling data-encoding-macro-internal v0.1.13
   Compiling xattr v1.3.1
   Compiling filetime v0.2.25
   Compiling crc32fast v1.4.2
    Checking base-x v0.2.11
   Compiling slog v2.7.0
    Checking signature v2.2.0
   Compiling tar v0.4.41
   Compiling globwalk v0.9.1
    Checking ssh-key v0.6.6
   Compiling flate2 v1.0.33
    Checking qcheck v1.0.0
    Checking data-encoding-macro v0.1.15
    Checking cvt v0.1.2
    Checking multibase v0.9.1
   Compiling glob v0.3.1
    Checking terminal_size v0.3.0
    Checking radicle-dag v0.9.0
    Checking amplify v4.7.0
   Compiling serde_yml v0.0.11
    Checking normpath v1.3.0
   Compiling radicle-surf v0.22.1
    Checking fs_at v0.2.1
    Checking base64 v0.21.7
    Checking fs2 v0.4.3
    Checking unescape v0.1.0
    Checking remove_dir_all v0.8.3
    Checking siphasher v1.0.1
    Checking state v0.5.3
    Checking crossbeam-channel v0.5.13
    Checking shell-words v1.1.0
    Checking libyml v0.0.4
    Checking cyphergraphy v0.3.0
    Checking arc-swap v1.7.1
    Checking uuid v1.10.0
    Checking cypheraddr v0.4.0
    Checking slog-scope v4.4.0
   Compiling serde_derive v1.0.210
   Compiling thiserror-impl v1.0.63
   Compiling zerocopy-derive v0.7.35
   Compiling clap_derive v4.5.13
   Compiling git-testament-derive v0.2.0
   Compiling tracing-attributes v0.1.27
    Checking socks5-client v0.4.1
   Compiling culpa-macros v1.0.2
    Checking cyphernet v0.5.2
    Checking html-page v0.4.0
   Compiling ctor v0.2.8
   Compiling git-testament v0.2.5
   Compiling zerocopy v0.7.35
   Compiling pest v2.7.12
   Compiling git-ref-format-core v0.3.1
    Checking radicle-ssh v0.9.0
   Compiling culpa v1.0.2
   Compiling tracing v0.1.40
   Compiling subplotlib-derive v0.11.0
   Compiling ppv-lite86 v0.2.20
   Compiling git-ref-format-macro v0.3.1
   Compiling rand_chacha v0.3.1
   Compiling clap v4.5.17
   Compiling hashlink v0.8.4
   Compiling hashlink v0.9.1
   Compiling pest_meta v2.7.12
   Compiling yaml-rust2 v0.8.1
   Compiling tempfile-fast v0.3.4
   Compiling pest_generator v2.7.12
   Compiling pest_derive v2.7.12
    Checking url v2.5.2
    Checking nonempty v0.9.0
    Checking localtime v1.3.1
   Compiling serde_path_to_error v0.1.16
    Checking git-ref-format v0.3.1
   Compiling marked-yaml v0.7.1
    Checking slog-json v2.6.1
   Compiling roadmap v0.6.1
   Compiling tera v1.20.0
    Checking git2 v0.19.0
    Checking radicle-git-ext v0.8.1
   Compiling subplot-build v0.11.0
   Compiling subplotlib v0.11.0
   Compiling radicle-ci-broker v0.7.0 (/srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src)
    Checking sqlite3-sys v0.15.2
    Checking sqlite v0.32.0
    Checking radicle-crypto v0.11.0
    Checking radicle-cob v0.12.0
    Checking radicle v0.13.0
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 20.38s
+ cargo build --all-targets --workspace
   Compiling cfg-if v1.0.0
   Compiling bitflags v2.6.0
   Compiling memchr v2.7.4
   Compiling once_cell v1.20.0
   Compiling log v0.4.22
   Compiling itoa v1.0.11
   Compiling subtle v2.6.1
   Compiling typenum v1.17.0
   Compiling libc v0.2.158
   Compiling regex-syntax v0.8.4
   Compiling fastrand v2.1.1
   Compiling percent-encoding v2.3.1
   Compiling serde v1.0.210
   Compiling thiserror v1.0.63
   Compiling utf8parse v0.2.2
   Compiling crossbeam-utils v0.8.20
   Compiling is_terminal_polyfill v1.70.1
   Compiling anstyle-parse v0.2.5
   Compiling anstyle-query v1.1.1
   Compiling cpufeatures v0.2.14
   Compiling colorchoice v1.0.2
   Compiling ryu v1.0.18
   Compiling rustix v0.38.37
   Compiling anstyle v1.0.8
   Compiling ahash v0.8.11
   Compiling anyhow v1.0.89
   Compiling powerfmt v0.2.0
   Compiling time-core v0.1.2
   Compiling num-conv v0.1.0
   Compiling getrandom v0.2.15
   Compiling strsim v0.11.1
   Compiling clap_lex v0.7.2
   Compiling deranged v0.3.11
   Compiling anstream v0.6.15
   Compiling hashbrown v0.14.5
   Compiling time-macros v0.2.18
   Compiling rand_core v0.6.4
   Compiling encoding_rs v0.8.34
   Compiling aho-corasick v1.1.3
   Compiling bstr v1.10.0
   Compiling generic-array v0.14.7
   Compiling pest v2.7.12
   Compiling crossbeam-epoch v0.9.18
   Compiling rand_chacha v0.3.1
   Compiling tinyvec_macros v0.1.1
   Compiling tinyvec v1.8.0
   Compiling hashlink v0.8.4
   Compiling crossbeam-deque v0.8.5
   Compiling hashlink v0.9.1
   Compiling rand v0.8.5
   Compiling clap_builder v4.5.17
   Compiling signature v1.6.4
   Compiling utf8-width v0.1.7
   Compiling crypto-common v0.1.6
   Compiling block-buffer v0.10.4
   Compiling block-padding v0.3.3
   Compiling lazy_static v1.5.0
   Compiling universal-hash v0.5.1
   Compiling inout v0.1.3
   Compiling digest v0.10.7
   Compiling opaque-debug v0.3.1
   Compiling html-escape v0.2.13
   Compiling ed25519 v1.5.3
   Compiling subplot v0.11.0
   Compiling ascii v1.1.0
   Compiling cipher v0.4.4
   Compiling unicode-bidi v0.3.15
   Compiling ct-codecs v1.1.2
   Compiling yaml-rust2 v0.8.1
   Compiling unicode-normalization v0.1.23
   Compiling amplify_num v0.5.3
   Compiling tempfile v3.12.0
   Compiling linux-raw-sys v0.4.14
   Compiling pulldown-cmark v0.12.1
   Compiling regex-automata v0.4.7
   Compiling pest_meta v2.7.12
   Compiling time v0.3.36
   Compiling idna v0.5.0
   Compiling tempfile-fast v0.3.4
   Compiling ec25519 v0.1.0
   Compiling sha2 v0.10.8
   Compiling polyval v0.6.2
   Compiling libz-sys v1.1.20
   Compiling tracing-core v0.1.32
   Compiling form_urlencoded v1.2.1
   Compiling git-ref-format-core v0.3.1
   Compiling pest_generator v2.7.12
   Compiling serde_path_to_error v0.1.16
   Compiling serde_json v1.0.128
   Compiling keccak v0.1.5
   Compiling base64 v0.22.1
   Compiling byteorder v1.5.0
   Compiling marked-yaml v0.7.1
   Compiling base64ct v1.6.0
   Compiling clap v4.5.17
   Compiling amplify v4.7.0
   Compiling git-ref-format-macro v0.3.1
   Compiling tracing v0.1.40
   Compiling pem-rfc7468 v0.7.0
   Compiling sha3 v0.10.8
   Compiling roadmap v0.6.1
   Compiling url v2.5.2
   Compiling cyphergraphy v0.3.0
   Compiling git-testament-derive v0.2.0
   Compiling ghash v0.5.1
   Compiling libgit2-sys v0.17.0+1.8.1
   Compiling ctr v0.9.2
   Compiling aes v0.8.4
   Compiling aead v0.5.2
   Compiling equivalent v1.0.1
   Compiling base32 v0.4.0
   Compiling ssh-encoding v0.2.0
   Compiling sqlite3-src v0.5.1
   Compiling blowfish v0.9.1
   Compiling git-ref-format v0.3.1
   Compiling cbc v0.1.2
   Compiling git2 v0.19.0
   Compiling regex v1.10.6
   Compiling globset v0.4.15
   Compiling pest_derive v2.7.12
   Compiling cypheraddr v0.4.0
   Compiling chacha20 v0.9.1
   Compiling pbkdf2 v0.12.2
   Compiling poly1305 v0.8.0
   Compiling radicle-std-ext v0.1.0
   Compiling data-encoding v2.6.0
   Compiling aes-gcm v0.10.3
   Compiling zeroize v1.8.1
   Compiling env_filter v0.1.2
   Compiling ignore v0.4.23
   Compiling ssh-cipher v0.2.0
   Compiling socks5-client v0.4.1
   Compiling env_logger v0.11.5
   Compiling indexmap v2.5.0
   Compiling data-encoding-macro v0.1.15
   Compiling bcrypt-pbkdf v0.10.0
   Compiling sqlite3-sys v0.15.2
   Compiling git-testament v0.2.5
   Compiling xattr v1.3.1
   Compiling crc32fast v1.4.2
   Compiling filetime v0.2.25
   Compiling base-x v0.2.11
   Compiling signature v2.2.0
   Compiling flate2 v1.0.33
   Compiling sqlite v0.32.0
   Compiling tar v0.4.41
   Compiling multibase v0.9.1
   Compiling ssh-key v0.6.6
   Compiling nix v0.29.0
   Compiling cyphernet v0.5.2
   Compiling radicle-ssh v0.9.0
   Compiling nonempty v0.9.0
   Compiling globwalk v0.9.1
   Compiling qcheck v1.0.0
   Compiling tera v1.20.0
   Compiling cvt v0.1.2
   Compiling culpa v1.0.2
   Compiling slog v2.7.0
   Compiling terminal_size v0.3.0
   Compiling radicle-dag v0.9.0
   Compiling base64 v0.21.7
   Compiling normpath v1.3.0
   Compiling subplotlib-derive v0.11.0
   Compiling localtime v1.3.1
   Compiling fs2 v0.4.3
   Compiling radicle-surf v0.22.1
   Compiling crossbeam-channel v0.5.13
   Compiling arc-swap v1.7.1
   Compiling state v0.5.3
   Compiling fs_at v0.2.1
   Compiling siphasher v1.0.1
   Compiling shell-words v1.1.0
   Compiling remove_dir_all v0.8.3
   Compiling libyml v0.0.4
   Compiling unescape v0.1.0
   Compiling slog-scope v4.4.0
   Compiling html-page v0.4.0
   Compiling uuid v1.10.0
   Compiling radicle-git-ext v0.8.1
   Compiling slog-json v2.6.1
   Compiling radicle-crypto v0.11.0
   Compiling serde_yml v0.0.11
   Compiling radicle-cob v0.12.0
   Compiling radicle v0.13.0
   Compiling subplot-build v0.11.0
   Compiling subplotlib v0.11.0
   Compiling radicle-ci-broker v0.7.0 (/srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 17.00s
+ cargo doc --workspace
    Checking unicode-ident v1.0.13
 Documenting unicode-ident v1.0.13
 Documenting cfg-if v1.0.0
 Documenting typenum v1.17.0
 Documenting libc v0.2.158
 Documenting subtle v2.6.1
 Documenting bitflags v2.6.0
 Documenting cpufeatures v0.2.14
 Documenting tinyvec_macros v0.1.1
 Documenting opaque-debug v0.3.1
 Documenting memchr v2.7.4
 Documenting ed25519 v1.5.3
 Documenting log v0.4.22
 Documenting ascii v1.1.0
 Documenting ct-codecs v1.1.2
 Documenting percent-encoding v2.3.1
    Checking proc-macro2 v1.0.86
 Documenting linux-raw-sys v0.4.14
 Documenting unicode-bidi v0.3.15
 Documenting amplify_num v0.5.3
    Checking git-ref-format-core v0.3.1
    Checking quote v1.0.37
 Documenting tinyvec v1.8.0
 Documenting proc-macro2 v1.0.86
 Documenting byteorder v1.5.0
    Checking syn v2.0.77
    Checking syn v1.0.109
 Documenting itoa v1.0.11
 Documenting form_urlencoded v1.2.1
 Documenting fastrand v2.1.1
 Documenting keccak v0.1.5
 Documenting base64ct v1.6.0
 Documenting base32 v0.4.0
 Documenting hashbrown v0.14.5
 Documenting equivalent v1.0.1
    Checking data-encoding v2.6.0
 Documenting sqlite3-src v0.5.1
 Documenting unicode-normalization v0.1.23
 Documenting quote v1.0.37
 Documenting radicle-std-ext v0.1.0
 Documenting zeroize v1.8.1
 Documenting rustix v0.38.37
 Documenting ryu v1.0.18
    Checking amplify_syn v2.0.1
    Checking proc-macro-error v1.0.4
 Documenting data-encoding-macro-internal v0.1.13
 Documenting once_cell v1.20.0
 Documenting data-encoding v2.6.0
 Documenting pem-rfc7468 v0.7.0
 Documenting utf8parse v0.2.2
 Documenting base-x v0.2.11
 Documenting powerfmt v0.2.0
 Documenting signature v2.2.0
 Documenting aho-corasick v1.1.3
 Documenting serde_derive v1.0.210
 Documenting amplify_syn v2.0.1
 Documenting generic-array v0.14.7
 Documenting thiserror-impl v1.0.63
 Documenting proc-macro-error-attr v1.0.4
 Documenting idna v0.5.0
 Documenting indexmap v2.5.0
 Documenting anstyle-parse v0.2.5
 Documenting cvt v0.1.2
 Documenting deranged v0.3.11
 Documenting tempfile v3.12.0
 Documenting time-macros v0.2.18
 Documenting getrandom v0.2.15
 Documenting libz-sys v1.1.20
 Documenting data-encoding-macro v0.1.15
 Documenting sqlite3-sys v0.15.2
 Documenting crypto-common v0.1.6
 Documenting block-padding v0.3.3
 Documenting block-buffer v0.10.4
 Documenting amplify_derive v4.0.1
 Documenting thiserror v1.0.63
 Documenting ec25519 v0.1.0
 Documenting proc-macro-error v1.0.4
 Documenting rand_core v0.6.4
 Documenting multibase v0.9.1
 Documenting libgit2-sys v0.17.0+1.8.1
 Documenting nix v0.29.0
 Documenting sqlite v0.32.0
 Documenting num-conv v0.1.0
 Documenting inout v0.1.3
 Documenting anstyle v1.0.8
 Documenting anstyle-query v1.1.1
 Documenting is_terminal_polyfill v1.70.1
 Documenting serde v1.0.210
 Documenting rand v0.8.5
 Documenting radicle-ssh v0.9.0
 Documenting digest v0.10.7
 Documenting universal-hash v0.5.1
 Documenting git-ref-format-macro v0.3.1
 Documenting aead v0.5.2
 Documenting colorchoice v1.0.2
 Documenting amplify v4.7.0
 Documenting cipher v0.4.4
 Documenting regex-syntax v0.8.4
 Documenting time-core v0.1.2
 Documenting terminal_size v0.3.0
 Documenting culpa-macros v1.0.2
 Documenting radicle-dag v0.9.0
   Compiling radicle-ci-broker v0.7.0 (/srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src)
 Documenting qcheck v1.0.0
 Documenting anstream v0.6.15
 Documenting fs_at v0.2.1
 Documenting slog v2.7.0
 Documenting sha2 v0.10.8
 Documenting sha3 v0.10.8
 Documenting pbkdf2 v0.12.2
 Documenting time v0.3.36
 Documenting polyval v0.6.2
 Documenting cyphergraphy v0.3.0
 Documenting poly1305 v0.8.0
 Documenting crossbeam-utils v0.8.20
 Documenting heck v0.5.0
    Checking heck v0.5.0
 Documenting lazy_static v1.5.0
 Documenting clap_lex v0.7.2
 Documenting aes v0.8.4
 Documenting ctr v0.9.2
 Documenting chacha20 v0.9.1
 Documenting cbc v0.1.2
 Documenting ssh-encoding v0.2.0
 Documenting blowfish v0.9.1
 Documenting regex-automata v0.4.7
 Documenting ghash v0.5.1
 Documenting url v2.5.2
 Documenting git-ref-format-core v0.3.1
 Documenting cypheraddr v0.4.0
 Documenting serde_json v1.0.128
 Documenting nonempty v0.9.0
 Documenting utf8-width v0.1.7
 Documenting strsim v0.11.1
 Documenting normpath v1.3.0
 Documenting crossbeam-channel v0.5.13
 Documenting clap_derive v4.5.13
 Documenting localtime v1.3.1
 Documenting culpa v1.0.2
 Documenting bcrypt-pbkdf v0.10.0
 Documenting aes-gcm v0.10.3
 Documenting html-escape v0.2.13
 Documenting git2 v0.19.0
 Documenting git-ref-format v0.3.1
 Documenting filetime v0.2.25
 Documenting clap_builder v4.5.17
 Documenting socks5-client v0.4.1
 Documenting remove_dir_all v0.8.3
 Documenting fs2 v0.4.3
 Documenting subplotlib-derive v0.11.0
 Documenting arc-swap v1.7.1
 Documenting unescape v0.1.0
 Documenting state v0.5.3
 Documenting siphasher v1.0.1
 Documenting ssh-cipher v0.2.0
 Documenting libyml v0.0.4
 Documenting shell-words v1.1.0
 Documenting base64 v0.22.1
 Documenting html-page v0.4.0
 Documenting slog-json v2.6.1
 Documenting uuid v1.10.0
 Documenting anyhow v1.0.89
 Documenting regex v1.10.6
 Documenting cyphernet v0.5.2
 Documenting slog-scope v4.4.0
 Documenting ssh-key v0.6.6
 Documenting clap v4.5.17
 Documenting serde_yml v0.0.11
 Documenting subplotlib v0.11.0
 Documenting radicle-git-ext v0.8.1
 Documenting radicle-crypto v0.11.0
 Documenting radicle-surf v0.22.1
 Documenting radicle-cob v0.12.0
 Documenting radicle v0.13.0
 Documenting radicle-ci-broker v0.7.0 (/srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 33.92s
   Generated /srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src/target/doc/radicle_ci_broker/index.html and 3 other files
+ cargo test --workspace --no-fail-fast
    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.12s
     Running unittests src/lib.rs (target/debug/deps/radicle_ci_broker-2451bfca66cd8825)

running 66 tests
test broker::test::does_not_find_unknown_repo ... ok
test broker::test::adds_adapter ... ok
test broker::test::does_not_have_a_default_adapter_initially ... ok
test adapter::test::adapter_reports_failure ... ok
test adapter::test::adapter_is_killed_before_any_messages ... ok
test adapter::test::adapter_does_not_exist ... ok
test adapter::test::adapter_is_not_executable ... ok
test ci_event::test::branch_created ... ok
test ci_event::test::nothing_updated ... ok
test ci_event::test::branch_deleted ... ok
test adapter::test::adapter_is_killed_after_second_message ... ok
test ci_event::test::patch_created ... ok
test ci_event::test::skipped ... ok
test adapter::test::adapter_reports_success ... ok
test ci_event::test::branch_updated ... ok
test ci_event::test::patch_updated ... ok
test ci_event::test_namespaced_branch::empty ... ok
test ci_event::test_namespaced_branch::has_namespace ... ok
test ci_event::test_namespaced_branch::has_namespace_with_path ... ok
test ci_event::test_namespaced_branch::lacks_namespace ... ok
test filter::test::allows_all_for_default_repository ... ok
test ci_event::test_patch_id::has_namespace ... ok
test ci_event::test_patch_id::has_namespace_with_path ... ok
test filter::test::allows_all_for_main_branch ... ok
test ci_event::test_patch_id::empty ... ok
test ci_event::test_patch_id::lacks_namespace ... ok
test filter::test::allows_any_event ... ok
test filter::test::allows_branch_creation ... ok
test filter::test::allows_all_for_right_node ... ok
test filter::test::allows_branch_deletion ... ok
test filter::test::allows_branch_update ... ok
test filter::test::allows_if_all_allow ... ok
test filter::test::allows_if_any_allows ... ok
test filter::test::allows_no_event ... ok
test filter::test::allows_opposite ... ok
test filter::test::allows_shutdown ... ok
test filter::test::allows_patch_creation ... ok
test filter::test::allows_patch_update ... ok
test filter::test::allows_none_for_wrong_node ... ok
test filter::test::allows_specific_patch ... ok
test filter::test::doesnt_allows_other_patch ... ok
test filter::test::only_allows_branch_creation ... ok
test filter::test::doesnt_allow_any_for_other_branch ... ok
test filter::test::only_allows_branch_deletion ... ok
test filter::test::only_allows_branch_update ... ok
test msg::test_push_branch::get_no_push_branch ... ok
test filter::test::doesnt_allow_any_for_other_repository ... ok
test msg::test_push_branch::get_push_branch ... ok
test filter::test::only_allows_patch_creation ... ok
test filter::test::only_allows_patch_update ... ok
test run::test::serialize_run_state ... ok
test adapter::test::adapter_has_bad_interpreter ... ok
test adapter::test::adapter_is_killed_after_first_message ... ok
test adapter::test::adapter_exits_nonzero ... ok
test adapter::test::adapter_produces_as_bad_message ... ok
test adapter::test::adapter_outputs_too_many_messages ... ok
test adapter::test::adapter_first_message_isnt_triggered ... ok
test msg::trigger_from_ci_event_tests::trigger_push_from_branch_updated ... ok
test msg::trigger_from_ci_event_tests::trigger_push_from_branch_created ... ok
test msg::trigger_from_ci_event_tests::trigger_patch_from_patch_created ... ok
test msg::trigger_from_ci_event_tests::trigger_patch_from_patch_updated ... ok
test broker::test::finds_default_adapter_for_unknown_repo ... ok
test broker::test::has_no_adapters_initially ... ok
test broker::test::sets_a_default_adapter_initially ... ok
test broker::test::adapter_fails ... ok
test broker::test::executes_adapter ... ok

test result: ok. 66 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.97s

     Running unittests src/bin/cib.rs (target/debug/deps/cib-ca399d4216427adf)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running unittests src/bin/cibtool.rs (target/debug/deps/cibtool-6339b9b0bbf25f06)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running unittests src/bin/synthetic-events.rs (target/debug/deps/synthetic_events-4582c07f5816de5d)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running tests/subplot.rs (target/debug/deps/subplot-10afb6a41619c650)

running 38 tests
test adapter_with_url_runs_successfully ... ok
test dummy_adapter_runs_successfully ... ok
test can_add_shutdown_event_to_queue ... ok
test event_synthesizer_terminates_after_first_connection ... ok
test allows_setting_minimum_log_level ... ok
test don_t_insert_event_for_non_existent_repository ... ok
test convert_recorded_node_events_into_ci_events ... ok
test add_information_about_run_that_s_finished_successfully_to_database ... ok
test add_information_about_triggered_run_to_database ... ok
test add_information_about_run_that_s_running_to_database ... ok
test can_trigger_a_ci_run ... ok
test logs_termination_due_to_error ... ok
test add_information_about_run_that_s_finished_in_failure_to_database ... ok
test adapter_can_provide_url_for_info_on_run ... ok
test don_t_insert_events_into_queue_when_not_allowed_by_filter ... ok
test events_can_be_queued_and_removed_from_queue ... ok
test filter_recorded_ci_events ... ok
test shows_config_as_json ... ok
test gives_helpful_error_message_if_it_doesn_t_understand_its_configuration_file ... ok
test can_remove_all_queued_events ... ok
test gives_helpful_error_message_if_node_socket_can_t_be_found ... ok
test insert_events_into_queue ... ok
test we_can_run_rad ... ok
test record_node_events ... ok
test produces_a_json_status_file ... ok
test logs_start_and_successful_end ... ok
test reports_it_version ... ok
test produces_a_report_page_upon_request ... ok
test logs_adapter_stderr_output ... ok
test shuts_down_when_requested ... ok
test process_queued_events ... ok
test stops_if_the_node_connection_breaks ... ok
test smoke_test__runs_adapter ... ok
test update_and_show_information_about_run_to_running ... ok
test acceptance_criteria_for_upgrades has been running for over 60 seconds
test count_in_a_single_process has been running for over 60 seconds
test count_in_concurrent_processes has been running for over 60 seconds
test insert_many_events_into_queue has been running for over 60 seconds
test count_in_a_single_process ... ok
test insert_many_events_into_queue ... ok
test acceptance_criteria_for_upgrades ... ok
test count_in_concurrent_processes ... ok

test result: ok. 38 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 88.27s

   Doc-tests radicle_ci_broker

running 1 test
test src/msg.rs - msg::RunId (line 44) ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.86s

+ subplot docgen ci-broker.subplot -o doc/ci-broker.html
INFO: Starting Subplot
INFO: Subplot finished successfully
+ subplot docgen doc/userguide.subplot -o doc/userguide.html
INFO: Starting Subplot
INFO: Subplot finished successfully
+ make -C doc publish
make: Entering directory '/srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src/doc'
plantuml -tsvg --output=. architecture.uml
plantuml -tsvg --output=. architecture-ext.uml
dot -Tsvg comp.dot > comp.svg.tmp
mv comp.svg.tmp comp.svg
dot -Tsvg comp-ext.dot > comp-ext.svg.tmp
mv comp-ext.svg.tmp comp-ext.svg
pandoc -V date="Version: $(git describe --long --dirty --all)" --toc --number-sections --standalone --self-contained architecture.md -o architecture.html
bash publish.sh
+ '[' /srv/pages/ci-broker '!=' unset ']'
+ echo web root set, publishing arch doc there
web root set, publishing arch doc there
+ install -d -m 0755 /srv/pages/ci-broker
+ install -m 0644 ./architecture.html ./ci-broker.html ./userguide.html /srv/pages/ci-broker
make: Leaving directory '/srv/http/d4584d1e-f076-42d6-8025-4887c714517e/src/doc'