rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood33fd4967165aa7c99c8b28a301be05183e3a0941
{
"request": "trigger",
"version": 1,
"event_type": "patch",
"repository": {
"id": "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5",
"name": "heartwood",
"description": "Radicle Heartwood Protocol & Stack",
"private": false,
"default_branch": "master",
"delegates": [
"did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT",
"did:key:z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW",
"did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"did:key:z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz",
"did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
]
},
"action": "Created",
"patch": {
"id": "5961ac4e18bc98c110b3c62cb2287bad967ffea7",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": "fintohaps"
},
"title": "Migrate `sigrefs` to use `git::repository`",
"state": {
"status": "draft",
"conflicts": []
},
"before": "e1867632fb03a1a75b73087e8ce5fb5d0846187c",
"after": "33fd4967165aa7c99c8b28a301be05183e3a0941",
"commits": [
"33fd4967165aa7c99c8b28a301be05183e3a0941",
"c09f8a54bea8ca4098553c52ae8d3203bd858f74",
"1556131936a632adc06e4ad4e0984b80ae7b0ec0",
"5aadb262b301b30eaca3a70eceb1c06c6a6213f1",
"8c9729176b3fbcb323e35e36b8ec22253d08cd5f",
"fb408ba1bb1170e7e01cd6f7e4720b4339f36d9a"
],
"target": "80c1bba76f432e70d6e766fe750bea70554cfe86",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "5961ac4e18bc98c110b3c62cb2287bad967ffea7",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": "fintohaps"
},
"description": "This set of changes migrates the `sigrefs` code to use the traits\ndefined in `git::repository`.\n\nEach commit migrates a single trait, and ensures that all tests pass\nat each step.\n\nThe final commit then removes the now unused code.",
"base": "e1867632fb03a1a75b73087e8ce5fb5d0846187c",
"oid": "33fd4967165aa7c99c8b28a301be05183e3a0941",
"timestamp": 1776177809
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "66e08728-e436-43fb-b216-04cbff1bdac9"
},
"info_url": "https://cci.rad.levitte.org//66e08728-e436-43fb-b216-04cbff1bdac9.html"
}
Started at: 2026-04-14 16:43:37.783860+02:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW added
✓ Remote-tracking branch cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW/master created for z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ Remote erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz added
✓ Remote-tracking branch erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz/master created for z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz
✓ Remote lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz added
✓ Remote-tracking branch lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz/master created for z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz
✓ Repository successfully cloned under /opt/radcis/ci.rad.levitte.org/cci/state/66e08728-e436-43fb-b216-04cbff1bdac9/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 154 issues · 44 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 5961ac4e18bc98c110b3c62cb2287bad967ffea7
✓ Switched to branch patch/5961ac4 at revision 5961ac4
✓ Branch patch/5961ac4 setup to track rad/patches/5961ac4e18bc98c110b3c62cb2287bad967ffea7
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 33fd4967165aa7c99c8b28a301be05183e3a0941
HEAD is now at 33fd4967 radicle/storage/sigrefs: Remove unused traits
Exit code: 0
$ rad patch show 5961ac4e18bc98c110b3c62cb2287bad967ffea7 -p
╭──────────────────────────────────────────────────────────────────────────╮
│ Title Migrate `sigrefs` to use `git::repository` │
│ Patch 5961ac4e18bc98c110b3c62cb2287bad967ffea7 │
│ Author fintohaps z6Mkire…SQZ3voM │
│ Head 33fd4967165aa7c99c8b28a301be05183e3a0941 │
│ Base e1867632fb03a1a75b73087e8ce5fb5d0846187c │
│ Branches patch/5961ac4 │
│ Commits ahead 12, behind 1 │
│ Status draft │
│ │
│ This set of changes migrates the `sigrefs` code to use the traits │
│ defined in `git::repository`. │
│ │
│ Each commit migrates a single trait, and ensures that all tests pass │
│ at each step. │
│ │
│ The final commit then removes the now unused code. │
├──────────────────────────────────────────────────────────────────────────┤
│ 33fd496 radicle/storage/sigrefs: Remove unused traits │
│ c09f8a5 storage/refs/sigrefs: migrate reference::Writer to RefWriter │
│ 1556131 storage/refs/sigrefs: migrate object::Writer to ObjectWriter │
│ 5aadb26 storage/refs/sigrefs: migrate reference::Reader to RefReader │
│ 8c97291 storage/refs/sigrefs: migrate object::Reader to ObjectReader │
│ fb408ba storage/git: impl git::repository traits for Repository │
├──────────────────────────────────────────────────────────────────────────┤
│ ● Revision 5961ac4 @ 33fd496 by fintohaps z6Mkire…SQZ3voM 10 seconds ago │
╰──────────────────────────────────────────────────────────────────────────╯
commit 33fd4967165aa7c99c8b28a301be05183e3a0941
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Tue Apr 14 15:32:25 2026 +0100
radicle/storage/sigrefs: Remove unused traits
The `sigrefs` module is migrated to using the `git::repository` family
of traits.
The previous traits are removed and the `RefsEntry` and
`SignatureEntry` types move into the `sigrefs::git` module.
diff --git a/crates/radicle/src/storage/git.rs b/crates/radicle/src/storage/git.rs
index bf8604926..6ba6cebd8 100644
--- a/crates/radicle/src/storage/git.rs
+++ b/crates/radicle/src/storage/git.rs
@@ -32,7 +32,7 @@ use crate::git::fmt::{
};
pub use crate::storage::{Error, RepositoryError};
-use super::refs::{RefsAt, sigrefs};
+use super::refs::RefsAt;
use super::{RemoteId, RemoteRepository, ValidateRepository};
pub static NAMESPACES_GLOB: LazyLock<PatternString> =
@@ -1074,59 +1074,6 @@ impl Repository {
}
}
-impl sigrefs::git::object::Reader for Repository {
- fn read_commit(
- &self,
- oid: &Oid,
- ) -> Result<Option<Vec<u8>>, sigrefs::git::object::error::ReadCommit> {
- self.backend.read_commit(oid)
- }
-
- fn read_blob(
- &self,
- commit: &Oid,
- path: &Path,
- ) -> Result<Option<sigrefs::git::object::Blob>, sigrefs::git::object::error::ReadBlob> {
- self.backend.read_blob(commit, path)
- }
-}
-
-impl sigrefs::git::object::Writer for Repository {
- fn write_tree(
- &self,
- refs: sigrefs::git::object::RefsEntry,
- signature: sigrefs::git::object::SignatureEntry,
- ) -> Result<Oid, sigrefs::git::object::error::WriteTree> {
- self.backend.write_tree(refs, signature)
- }
-
- fn write_commit(&self, bytes: &[u8]) -> Result<Oid, sigrefs::git::object::error::WriteCommit> {
- self.backend.write_commit(bytes)
- }
-}
-
-impl sigrefs::git::reference::Reader for Repository {
- fn find_reference(
- &self,
- reference: &git::fmt::Namespaced,
- ) -> Result<Option<Oid>, sigrefs::git::reference::error::FindReference> {
- sigrefs::git::reference::Reader::find_reference(&self.backend, reference)
- }
-}
-
-impl sigrefs::git::reference::Writer for Repository {
- fn write_reference(
- &self,
- reference: &git::fmt::Namespaced,
- commit: Oid,
- parent: Option<Oid>,
- reflog: String,
- ) -> Result<(), sigrefs::git::reference::error::WriteReference> {
- self.backend
- .write_reference(reference, commit, parent, reflog)
- }
-}
-
impl crate::git::repository::ObjectReader for Repository {
fn blob(
&self,
diff --git a/crates/radicle/src/storage/refs/sigrefs/git.rs b/crates/radicle/src/storage/refs/sigrefs/git.rs
index 543f6ce1a..272775499 100644
--- a/crates/radicle/src/storage/refs/sigrefs/git.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/git.rs
@@ -2,13 +2,52 @@
//! This module provides traits for interacting with a Git
//! repository to read and write data for Signed References.
-pub mod object;
-pub mod reference;
+use std::path::Path;
use crypto::PublicKey;
use radicle_git_metadata::author::Author;
use radicle_git_metadata::author::Time;
+use crate::git::repository::types::TreeEntry;
+
+/// A [`TreeEntry`] for the signed references payload blob.
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub struct RefsEntry(TreeEntry);
+
+impl RefsEntry {
+ /// Create a new entry with the canonical refs bytes.
+ pub fn new(content: Vec<u8>) -> Self {
+ Self(TreeEntry::Blob {
+ path: Path::new(crate::storage::refs::REFS_BLOB_PATH).into(),
+ content,
+ })
+ }
+
+ /// Unwrap into the underlying [`TreeEntry`].
+ pub fn into_inner(self) -> TreeEntry {
+ self.0
+ }
+}
+
+/// A [`TreeEntry`] for the cryptographic signature blob.
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub struct SignatureEntry(TreeEntry);
+
+impl SignatureEntry {
+ /// Create a new entry with the signature bytes.
+ pub fn new(content: Vec<u8>) -> Self {
+ Self(TreeEntry::Blob {
+ path: Path::new(crate::storage::refs::SIGNATURE_BLOB_PATH).into(),
+ content,
+ })
+ }
+
+ /// Unwrap into the underlying [`TreeEntry`].
+ pub fn into_inner(self) -> TreeEntry {
+ self.0
+ }
+}
+
/// Convenience type that corresponds to an [`Author`].
///
/// Most users will want to instantiate this via [`Committer::from_env_or_now`],
@@ -102,142 +141,3 @@ impl Committer {
})
}
}
-
-mod git2_impls {
- //! [`git2::Repository`] implementations of the [`object`] and [`reference`] traits.
- //!
- //! [`object`]: super::object
- //! [`reference`]: super::reference
-
- use std::path::Path;
-
- use radicle_oid::Oid;
-
- use crate::git;
-
- use super::object;
- use super::object::{RefsEntry, SignatureEntry};
- use super::reference;
-
- impl object::Reader for git2::Repository {
- fn read_commit(&self, oid: &Oid) -> Result<Option<Vec<u8>>, object::error::ReadCommit> {
- use object::error::ReadCommit;
-
- let odb = self.odb().map_err(ReadCommit::other)?;
- let object = odb.read(git2::Oid::from(*oid));
- match object {
- Ok(object) => {
- if object.kind() != git2::ObjectType::Commit {
- return Err(ReadCommit::incorrect_object_error(*oid, object.kind()));
- }
- Ok(Some(object.data().to_vec()))
- }
- Err(e) if e.code() == git2::ErrorCode::NotFound => Ok(None),
- Err(e) => Err(ReadCommit::other(e)),
- }
- }
-
- fn read_blob(
- &self,
- oid: &Oid,
- path: &Path,
- ) -> Result<Option<object::Blob>, object::error::ReadBlob> {
- use object::error::ReadBlob;
-
- let commit = match self.find_commit(git2::Oid::from(*oid)) {
- Ok(c) => c,
- Err(e) if e.code() == git2::ErrorCode::NotFound => {
- return Err(ReadBlob::commit_not_found_error(*oid));
- }
- Err(e) => return Err(ReadBlob::other(e)),
- };
-
- let tree = commit.tree().map_err(ReadBlob::other)?;
-
- let entry = match tree.get_path(path) {
- Ok(e) => e,
- Err(e) if e.code() == git2::ErrorCode::NotFound => return Ok(None),
- Err(e) => return Err(ReadBlob::other(e)),
- };
-
- let object = entry.to_object(self).map_err(ReadBlob::other)?;
- let blob = object.as_blob().ok_or(ReadBlob::incorrect_object_error(
- *oid,
- path.to_path_buf(),
- object.kind().unwrap_or(git2::ObjectType::Any),
- ))?;
-
- Ok(Some(object::Blob {
- oid: blob.id().into(),
- bytes: blob.content().to_vec(),
- }))
- }
- }
-
- impl object::Writer for git2::Repository {
- fn write_tree(
- &self,
- refs: RefsEntry,
- signature: SignatureEntry,
- ) -> Result<Oid, object::error::WriteTree> {
- crate::git::repository::ObjectWriter::write_tree(
- self,
- &[refs.into_inner(), signature.into_inner()],
- )
- .map_err(|e| object::error::WriteTree::Write(Box::new(e)))
- }
-
- fn write_commit(&self, bytes: &[u8]) -> Result<Oid, object::error::WriteCommit> {
- use object::error::WriteCommit;
-
- let odb = self.odb().map_err(WriteCommit::other)?;
-
- let oid = odb
- .write(git2::ObjectType::Commit, bytes)
- .map_err(WriteCommit::other)?;
-
- Ok(Oid::from(oid))
- }
- }
-
- impl reference::Reader for git2::Repository {
- fn find_reference(
- &self,
- reference: &git::fmt::Namespaced,
- ) -> Result<Option<Oid>, reference::error::FindReference> {
- match self.refname_to_id(reference.as_str()) {
- Ok(oid) => Ok(Some(Oid::from(oid))),
- Err(e) if e.code() == git2::ErrorCode::NotFound => Ok(None),
- Err(e) => Err(reference::error::FindReference::other(e)),
- }
- }
- }
-
- impl reference::Writer for git2::Repository {
- fn write_reference(
- &self,
- reference: &git::fmt::Namespaced,
- commit: Oid,
- parent: Option<Oid>,
- reflog: String,
- ) -> Result<(), reference::error::WriteReference> {
- let new = git2::Oid::from(commit);
-
- match parent {
- Some(parent) => {
- let old = git2::Oid::from(parent);
- // The old OID provides a guard, which gives us a compare-and-swap —
- // the write will fail if the ref has moved since we read it.
- self.reference_matching(reference.as_str(), new, true, old, &reflog)
- .map_err(reference::error::WriteReference::other)?;
- }
- None => {
- self.reference(reference.as_str(), new, false, &reflog)
- .map_err(reference::error::WriteReference::other)?;
- }
- }
-
- Ok(())
- }
- }
-}
diff --git a/crates/radicle/src/storage/refs/sigrefs/git/object.rs b/crates/radicle/src/storage/refs/sigrefs/git/object.rs
deleted file mode 100644
index b98d84c29..000000000
--- a/crates/radicle/src/storage/refs/sigrefs/git/object.rs
+++ /dev/null
@@ -1,116 +0,0 @@
-//! Traits for interacting with Git objects, necessary for implementing Radicle
-//! Signed References.
-// TODO(finto): I think these are more generally useful than just being used for
-// Signed References. They might be worth moving into a crate,
-// `radicle-git-traits`, but for now they can live here.
-
-pub mod error;
-
-use std::path::Path;
-
-use radicle_oid::Oid;
-
-use crate::git::repository::types::TreeEntry;
-
-/// A Git blob object, returned by [`Reader::read_blob`].
-pub struct Blob {
- /// The [`Oid`] of the Git blob.
- pub oid: Oid,
- /// The contents of the Git blob.
- pub bytes: Vec<u8>,
-}
-
-/// Git object reader, generally a Git repository, or its corresponding Object
-/// Database (ODB).
-pub trait Reader {
- /// Read the raw bytes of a commit object identified by `oid`.
- ///
- /// Returns `None` if no such object exists.
- ///
- /// # Errors
- ///
- /// - [`error::ReadCommit::IncorrectObject`]: the object identified by the
- /// [`Oid`] was found, but was not a commit.
- /// - [`error::ReadCommit::Other`]: failed to read the Git commit.
- fn read_commit(&self, oid: &Oid) -> Result<Option<Vec<u8>>, error::ReadCommit>;
-
- /// Read the raw bytes of the blob at `path` within the tree of `commit`.
- ///
- /// Returns `None` if the path does not exist in that tree.
- ///
- /// # Errors
- ///
- /// - [`error::ReadBlob::CommitNotFound`]: failed to find the commit
- /// identified by the [`Oid`].
- /// - [`error::ReadBlob::IncorrectObject`]: the object identified by the
- /// [`Oid`] was found, but was not a commit.
- /// - [`error::ReadBlob::Other`]: failed to read the Git blob.
- fn read_blob(&self, commit: &Oid, path: &Path) -> Result<Option<Blob>, error::ReadBlob>;
-}
-
-/// A [`TreeEntry`] for the signed references payload blob.
-#[derive(Clone, Debug, PartialEq, Eq, Hash)]
-pub struct RefsEntry(TreeEntry);
-
-impl RefsEntry {
- /// Create a new entry with the canonical refs bytes.
- pub fn new(content: Vec<u8>) -> Self {
- Self(TreeEntry::Blob {
- path: Path::new(crate::storage::refs::REFS_BLOB_PATH).into(),
- content,
- })
- }
-
- /// Unwrap into the underlying [`TreeEntry`].
- pub fn into_inner(self) -> TreeEntry {
- self.0
- }
-}
-
-/// A [`TreeEntry`] for the cryptographic signature blob.
-#[derive(Clone, Debug, PartialEq, Eq, Hash)]
-pub struct SignatureEntry(TreeEntry);
-
-impl SignatureEntry {
- /// Create a new entry with the signature bytes.
- pub fn new(content: Vec<u8>) -> Self {
- Self(TreeEntry::Blob {
- path: Path::new(crate::storage::refs::SIGNATURE_BLOB_PATH).into(),
- content,
- })
- }
-
- /// Unwrap into the underlying [`TreeEntry`].
- pub fn into_inner(self) -> TreeEntry {
- self.0
- }
-}
-
-/// Git object writer, generally a Git repository, or its corresponding Object
-/// Database (ODB).
-pub trait Writer {
- /// Write the [`RefsEntry`] and [`SignatureEntry`] to two separate Git blobs
- /// within a shared Git tree.
- ///
- /// Returns the [`Oid`] of the Git tree.
- ///
- /// # Errors
- ///
- /// - [`error::WriteTree::Refs`]: failed to write the references Git blob.
- /// - [`error::WriteTree::Signature`]: failed to write the signature Git blob.
- /// - [`error::WriteTree::Write`]: failed to write the Git tree.
- fn write_tree(
- &self,
- refs: RefsEntry,
- signature: SignatureEntry,
- ) -> Result<Oid, error::WriteTree>;
-
- /// Write the given Git commit, as bytes, to the Git object database.
- ///
- /// Returns the [`Oid`] of the Git commit.
- ///
- /// # Errors
- ///
- /// - [`error::WriteCommit`]: failed to write the Git commit.
- fn write_commit(&self, bytes: &[u8]) -> Result<Oid, error::WriteCommit>;
-}
diff --git a/crates/radicle/src/storage/refs/sigrefs/git/object/error.rs b/crates/radicle/src/storage/refs/sigrefs/git/object/error.rs
deleted file mode 100644
index 583048d5c..000000000
--- a/crates/radicle/src/storage/refs/sigrefs/git/object/error.rs
+++ /dev/null
@@ -1,146 +0,0 @@
-use std::path::PathBuf;
-
-use radicle_oid::Oid;
-use thiserror::Error;
-
-type StdError = dyn std::error::Error + Send + Sync + 'static;
-
-#[derive(Debug, Error)]
-#[non_exhaustive]
-pub enum ReadCommit {
- #[error(transparent)]
- IncorrectObject(NotCommit),
- #[error(transparent)]
- Other(Box<StdError>),
-}
-
-impl ReadCommit {
- pub fn incorrect_object_error<K>(oid: Oid, kind: K) -> Self
- where
- K: ToString,
- {
- Self::IncorrectObject(NotCommit {
- oid,
- kind: kind.to_string(),
- })
- }
-
- pub fn other<E>(err: E) -> Self
- where
- E: std::error::Error + Send + Sync + 'static,
- {
- Self::Other(Box::new(err))
- }
-}
-
-#[derive(Debug, Error)]
-#[non_exhaustive]
-#[error("the object {oid} is a {kind}, not a commit")]
-pub struct NotCommit {
- oid: Oid,
- kind: String,
-}
-
-#[derive(Debug, Error)]
-#[non_exhaustive]
-#[error(transparent)]
-pub enum ReadBlob {
- #[error(transparent)]
- CommitNotFound(CommitNotFound),
- #[error(transparent)]
- IncorrectObject(NotBlob),
- #[error(transparent)]
- Other(Box<StdError>),
-}
-
-#[derive(Debug, Error)]
-#[non_exhaustive]
-#[error("could not find commit {oid}")]
-pub struct CommitNotFound {
- oid: Oid,
-}
-
-#[derive(Debug, Error)]
-#[non_exhaustive]
-#[error("the object at {path:?} in commit {commit} is a {kind}, not a blob")]
-pub struct NotBlob {
- commit: Oid,
- path: PathBuf,
- kind: String,
-}
-
-impl ReadBlob {
- pub fn commit_not_found_error(oid: Oid) -> Self {
- Self::CommitNotFound(CommitNotFound { oid })
- }
-
- pub fn incorrect_object_error<K>(commit: Oid, path: PathBuf, kind: K) -> Self
- where
- K: ToString,
- {
- Self::IncorrectObject(NotBlob {
- commit,
- path,
- kind: kind.to_string(),
- })
- }
-
- pub fn other<E>(err: E) -> Self
- where
- E: std::error::Error + Send + Sync + 'static,
- {
- Self::Other(Box::new(err))
- }
-}
-
-#[derive(Debug, Error)]
-#[non_exhaustive]
-pub enum WriteTree {
- #[error("failed to write reference blob for signed references")]
- Refs(Box<StdError>),
- #[error("failed to write signature blob for signed references")]
- Signature(Box<StdError>),
- #[error(transparent)]
- Write(Box<StdError>),
-}
-
-impl WriteTree {
- pub fn refs_error<E>(err: E) -> Self
- where
- E: std::error::Error + Send + Sync + 'static,
- {
- Self::Refs(Box::new(err))
- }
-
- pub fn signature_error<E>(err: E) -> Self
- where
- E: std::error::Error + Send + Sync + 'static,
- {
- Self::Signature(Box::new(err))
- }
-
- pub fn write_error<E>(err: E) -> Self
- where
- E: std::error::Error + Send + Sync + 'static,
- {
- Self::Write(Box::new(err))
- }
-}
-
-#[derive(Debug, Error)]
-#[non_exhaustive]
-#[error(transparent)]
-pub struct WriteCommit {
- source: Box<StdError>,
-}
-
-impl WriteCommit {
- pub fn other<E>(err: E) -> Self
- where
- E: std::error::Error + Send + Sync + 'static,
- {
- Self {
- source: Box::new(err),
- }
- }
-}
diff --git a/crates/radicle/src/storage/refs/sigrefs/git/reference.rs b/crates/radicle/src/storage/refs/sigrefs/git/reference.rs
deleted file mode 100644
index 4f46c829a..000000000
--- a/crates/radicle/src/storage/refs/sigrefs/git/reference.rs
+++ /dev/null
@@ -1,51 +0,0 @@
-//! Traits for interacting with Git references, necessary for implementing
-//! Radicle Signed References.
-// TODO(finto): I think these are more generally useful than just being used for
-// Signed References. They might be worth moving into a crate,
-// `radicle-git-traits`, but for now they can live here.
-
-pub mod error;
-
-use radicle_oid::Oid;
-
-use crate::git;
-
-/// Git reference reader, generally a Git repository, or its corresponding Reference
-/// Database (Ref DB).
-pub trait Reader {
- /// Find the head [`Oid`] of the sigrefs reference for the given namespace.
- ///
- /// Returns `None` if the reference does not yet exist.
- /// # Errors
- ///
- /// - [`error::FindReference`]: failed to write the Git reference.
- fn find_reference(
- &self,
- reference: &git::fmt::Namespaced,
- ) -> Result<Option<Oid>, error::FindReference>;
-}
-
-/// Git reference writer, generally a Git repository, or its corresponding Reference
-/// Database (Ref DB).
-pub trait Writer {
- /// Write the given commit [`Oid`], and its parent, to the given
- /// `reference`.
- ///
- /// The `reflog` given can used as the Git reflog message of the reference.
- ///
- /// # Concurrency
- ///
- /// It is up to the implementer to ensure the safety of writing the
- /// reference safely in a concurrent environment.
- ///
- /// # Errors
- ///
- /// - [`error::WriteReference`]: failed to write the Git reference.
- fn write_reference(
- &self,
- reference: &git::fmt::Namespaced,
- commit: Oid,
- parent: Option<Oid>,
- reflog: String,
- ) -> Result<(), error::WriteReference>;
-}
diff --git a/crates/radicle/src/storage/refs/sigrefs/git/reference/error.rs b/crates/radicle/src/storage/refs/sigrefs/git/reference/error.rs
deleted file mode 100644
index cd6af9fd6..000000000
--- a/crates/radicle/src/storage/refs/sigrefs/git/reference/error.rs
+++ /dev/null
@@ -1,29 +0,0 @@
-use thiserror::Error;
-
-#[derive(Debug, Error)]
-#[non_exhaustive]
-#[error(transparent)]
-pub struct FindReference(Box<dyn std::error::Error + Send + Sync + 'static>);
-
-impl FindReference {
- pub fn other<E>(err: E) -> Self
- where
- E: std::error::Error + Send + Sync + 'static,
- {
- Self(Box::new(err))
- }
-}
-
-#[derive(Debug, Error)]
-#[non_exhaustive]
-#[error(transparent)]
-pub struct WriteReference(Box<dyn std::error::Error + Send + Sync + 'static>);
-
-impl WriteReference {
- pub fn other<E>(err: E) -> Self
- where
- E: std::error::Error + Send + Sync + 'static,
- {
- Self(Box::new(err))
- }
-}
diff --git a/crates/radicle/src/storage/refs/sigrefs/write.rs b/crates/radicle/src/storage/refs/sigrefs/write.rs
index fdf8a18a6..af3f703a3 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write.rs
@@ -13,11 +13,13 @@ use radicle_oid::Oid;
use crate::git;
use crate::git::repository::{ObjectReader, ObjectWriter, RefReader, RefTarget, RefWriter};
use crate::storage::refs::SignedRefs;
-use crate::storage::refs::sigrefs::git::{Committer, object};
+use crate::storage::refs::sigrefs::git::Committer;
use crate::storage::refs::sigrefs::read::CommitReader;
use crate::storage::refs::sigrefs::{VerifiedCommit, read};
use crate::storage::refs::{FeatureLevel, IDENTITY_ROOT, Refs, SIGREFS_BRANCH, SIGREFS_PARENT};
+use super::git::{RefsEntry, SignatureEntry};
+
/// The result of attempting to write signed references using
/// [`SignedRefsWriter`].
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -330,8 +332,8 @@ where
.signer
.try_sign(&canonical)
.map_err(error::Tree::Sign)?;
- let refs = object::RefsEntry::new(canonical);
- let sig = object::SignatureEntry::new(signature.to_vec());
+ let refs = RefsEntry::new(canonical);
+ let sig = SignatureEntry::new(signature.to_vec());
let oid = self
.repository
.write_tree(&[refs.into_inner(), sig.into_inner()])
commit c09f8a54bea8ca4098553c52ae8d3203bd858f74
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Tue Apr 14 12:18:57 2026 +0000
storage/refs/sigrefs: migrate reference::Writer to RefWriter
Replace the sigrefs-specific reference::Writer trait with the shared
git::repository::RefWriter trait:
- SignedRefsWriter bound
- Write test mock
The `write_reference` method is replaced by `write_ref` using:
* `RefTarget::Cas` when the commit has a parent. This ensures that the
parent value is not modified when updating in concurrent
environments.
* `RefTarget::Create` when there is no parent, i.e. it is the first
commit of the `rad/sigrefs` reference.
The mock RefWriter impl uses unimplemented!() for `delete_ref`.
diff --git a/crates/radicle/src/storage/refs.rs b/crates/radicle/src/storage/refs.rs
index d6a2f5aac..33c28e4e5 100644
--- a/crates/radicle/src/storage/refs.rs
+++ b/crates/radicle/src/storage/refs.rs
@@ -19,7 +19,7 @@ use thiserror::Error;
use crate::git;
use crate::git::Oid;
use crate::git::raw::ErrorExt as _;
-use crate::git::repository::{ObjectReader, ObjectWriter, RefReader};
+use crate::git::repository::{ObjectReader, ObjectWriter, RefReader, RefWriter};
use crate::storage;
use crate::storage::RemoteId;
use crate::storage::refs::sigrefs::read::Tip;
@@ -79,8 +79,8 @@ impl Refs {
signer: &S,
) -> Result<SignedRefs, Error>
where
- R: RefReader + sigrefs::git::reference::Writer,
R: ObjectReader + ObjectWriter,
+ R: RefReader + RefWriter,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
@@ -97,8 +97,8 @@ impl Refs {
signer: &S,
) -> Result<SignedRefs, Error>
where
- R: RefReader + sigrefs::git::reference::Writer,
R: ObjectReader + ObjectWriter,
+ R: RefReader + RefWriter,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
@@ -115,8 +115,8 @@ impl Refs {
force: bool,
) -> Result<SignedRefs, Error>
where
- R: RefReader + sigrefs::git::reference::Writer,
R: ObjectReader + ObjectWriter,
+ R: RefReader + RefWriter,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
diff --git a/crates/radicle/src/storage/refs/sigrefs/write.rs b/crates/radicle/src/storage/refs/sigrefs/write.rs
index 9ec516de8..fdf8a18a6 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write.rs
@@ -11,9 +11,9 @@ use radicle_git_metadata::commit::{CommitData, headers::Headers, trailers::Owned
use radicle_oid::Oid;
use crate::git;
-use crate::git::repository::{ObjectReader, ObjectWriter, RefReader};
+use crate::git::repository::{ObjectReader, ObjectWriter, RefReader, RefTarget, RefWriter};
use crate::storage::refs::SignedRefs;
-use crate::storage::refs::sigrefs::git::{Committer, object, reference};
+use crate::storage::refs::sigrefs::git::{Committer, object};
use crate::storage::refs::sigrefs::read::CommitReader;
use crate::storage::refs::sigrefs::{VerifiedCommit, read};
use crate::storage::refs::{FeatureLevel, IDENTITY_ROOT, Refs, SIGREFS_BRANCH, SIGREFS_PARENT};
@@ -68,7 +68,7 @@ pub struct SignedRefsWriter<'a, R, S> {
impl<'a, R, S> SignedRefsWriter<'a, R, S>
where
- R: ObjectWriter + ObjectReader + reference::Writer + RefReader,
+ R: ObjectWriter + ObjectWriter + ObjectReader + RefWriter + RefReader,
S: Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
{
@@ -175,8 +175,15 @@ where
Err(err) => return Err(error::Write::Head(err)),
};
let commit = commit_writer.write().map_err(error::Write::Commit)?;
+ let target = match commit.parent {
+ Some(expected) => RefTarget::Cas {
+ target: commit.oid,
+ expected,
+ },
+ None => RefTarget::Create { target: commit.oid },
+ };
repository
- .write_reference(&reference, commit.oid, commit.parent, reflog)
+ .write_ref(&reference, target, &reflog)
.map_err(error::Write::Reference)?;
Ok(Update::changed(commit, FeatureLevel::Parent))
}
diff --git a/crates/radicle/src/storage/refs/sigrefs/write/error.rs b/crates/radicle/src/storage/refs/sigrefs/write/error.rs
index bc2bb9833..d5c710d4a 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write/error.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write/error.rs
@@ -1,9 +1,8 @@
use radicle_oid::Oid;
use thiserror::Error;
-use crate::git::repository;
use crate::git::repository::object;
-use crate::storage::refs::sigrefs::git::reference;
+use crate::git::repository::reference;
// TODO: use commit NID (and RID?) for traceability
#[derive(Debug, Error)]
@@ -14,7 +13,7 @@ pub enum Write {
#[error(transparent)]
Commit(Commit),
#[error(transparent)]
- Reference(reference::error::WriteReference),
+ Reference(reference::error::write::WriteRefError),
}
// TODO: use commit OID for traceability
@@ -43,7 +42,7 @@ pub enum Tree {
#[error(transparent)]
pub enum Head {
#[error(transparent)]
- Reference(repository::reference::error::read::RefTargetError),
+ Reference(reference::error::read::RefTargetError),
#[error(transparent)]
Commit(super::read::error::Commit),
#[error("failed to verify commit {commit}: {source}")]
diff --git a/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs b/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
index c92f9be55..b3b55ccfc 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
@@ -10,13 +10,12 @@ use radicle_git_metadata::commit::trailers::OwnedTrailer;
use radicle_oid::Oid;
use crate::git;
-use crate::git::repository;
use crate::git::repository::object;
+use crate::git::repository::reference;
use crate::git::repository::types::{Blob, Commit, TreeEntry};
-use crate::git::repository::{ObjectReader, ObjectWriter, RefReader};
+use crate::git::repository::{ObjectReader, ObjectWriter, RefReader, RefTarget, RefWriter};
use crate::identity::doc;
use crate::storage::HasRepoId;
-use crate::storage::refs::sigrefs::git::reference;
use crate::storage::refs::{REFS_BLOB_PATH, Refs, SIGNATURE_BLOB_PATH, SIGREFS_BRANCH};
const MOCKED_IDENTITY: u8 = 99u8;
@@ -32,9 +31,9 @@ enum WriteTreeBehavior {
struct WriteCommitBehavior(Oid);
enum WriteReferenceBehavior {
- /// [`reference::Writer::write_reference`] returns `Ok(())`.
+ /// [`RefWriter::write_ref`] returns `Ok(())`.
Ok,
- /// [`reference::Writer::write_reference`] returns `Err(…)`.
+ /// [`RefWriter::write_ref`] returns `Err(…)`.
Error,
}
@@ -246,31 +245,26 @@ impl ObjectReader for MockRepository {
impl RefReader for MockRepository {
type References<'a> = std::iter::Empty<
- Result<
- (git::fmt::Qualified<'static>, Oid),
- repository::reference::error::read::ListReferenceError,
- >,
+ Result<(git::fmt::Qualified<'static>, Oid), reference::error::read::ListReferenceError>,
>;
fn ref_target<R: AsRef<git::fmt::RefStr>>(
&self,
name: &R,
- ) -> Result<Option<Oid>, repository::reference::error::read::RefTargetError> {
+ ) -> Result<Option<Oid>, reference::error::read::RefTargetError> {
match self.references.get(name.as_ref().as_str()) {
Some(RefBehavior::Present(oid)) => Ok(Some(*oid)),
Some(RefBehavior::Missing) | None => Ok(None),
- Some(RefBehavior::Error) => {
- Err(repository::reference::error::read::RefTargetError::backend(
- std::io::Error::other("mock reference error"),
- ))
- }
+ Some(RefBehavior::Error) => Err(reference::error::read::RefTargetError::backend(
+ std::io::Error::other("mock reference error"),
+ )),
}
}
fn list_refs<'a, P: AsRef<git::fmt::refspec::PatternStr>>(
&'a self,
_pattern: &P,
- ) -> Result<Self::References<'a>, repository::reference::error::read::ListRefsError> {
+ ) -> Result<Self::References<'a>, reference::error::read::ListRefsError> {
unimplemented!("MockRepository::list_refs")
}
}
@@ -299,23 +293,29 @@ impl ObjectWriter for MockRepository {
}
}
-impl reference::Writer for MockRepository {
- fn write_reference(
+impl RefWriter for MockRepository {
+ fn write_ref<R: AsRef<git::fmt::RefStr>>(
&self,
- _reference: &git::fmt::Namespaced,
- _commit: Oid,
- _parent: Option<Oid>,
- _reflog: String,
- ) -> Result<(), reference::error::WriteReference> {
+ _name: &R,
+ _target: RefTarget,
+ _reflog: &str,
+ ) -> Result<(), reference::error::write::WriteRefError> {
match &self.write_reference {
Some(WriteReferenceBehavior::Ok) => Ok(()),
Some(WriteReferenceBehavior::Error) | None => {
- Err(reference::error::WriteReference::other(
- std::io::Error::other("mock write_reference error"),
+ Err(reference::error::write::WriteRefError::backend(
+ std::io::Error::other("mock write_ref error"),
))
}
}
}
+
+ fn delete_ref<R: AsRef<git::fmt::RefStr>>(
+ &self,
+ _name: &R,
+ ) -> Result<(), reference::error::write::DeleteRefError> {
+ unimplemented!("MockRepository::delete_ref")
+ }
}
/// Always signs successfully, returning a fixed 64-byte signature.
commit 1556131936a632adc06e4ad4e0984b80ae7b0ec0
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Tue Apr 14 12:18:57 2026 +0000
storage/refs/sigrefs: migrate object::Writer to ObjectWriter
Replace the sigrefs-specific object::Writer trait with the shared
git::repository::ObjectWriter trait across all consumers:
- SignedRefsWriter, CommitWriter, TreeWriter bounds
- Write test mock
Notably, `RefsEntry` and `SignatureEntry` become newtype wrappers
around `TreeEntry`, with constructors that embed the canonical paths
`REFS_BLOB_PATH` and `SIGNATURE_BLOB_PATH`, respectively.
diff --git a/crates/radicle/src/storage/refs.rs b/crates/radicle/src/storage/refs.rs
index 640baff2c..d6a2f5aac 100644
--- a/crates/radicle/src/storage/refs.rs
+++ b/crates/radicle/src/storage/refs.rs
@@ -19,7 +19,7 @@ use thiserror::Error;
use crate::git;
use crate::git::Oid;
use crate::git::raw::ErrorExt as _;
-use crate::git::repository::{ObjectReader, RefReader};
+use crate::git::repository::{ObjectReader, ObjectWriter, RefReader};
use crate::storage;
use crate::storage::RemoteId;
use crate::storage::refs::sigrefs::read::Tip;
@@ -79,8 +79,8 @@ impl Refs {
signer: &S,
) -> Result<SignedRefs, Error>
where
- R: ObjectReader + sigrefs::git::object::Writer,
R: RefReader + sigrefs::git::reference::Writer,
+ R: ObjectReader + ObjectWriter,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
@@ -97,8 +97,8 @@ impl Refs {
signer: &S,
) -> Result<SignedRefs, Error>
where
- R: ObjectReader + sigrefs::git::object::Writer,
R: RefReader + sigrefs::git::reference::Writer,
+ R: ObjectReader + ObjectWriter,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
@@ -115,8 +115,8 @@ impl Refs {
force: bool,
) -> Result<SignedRefs, Error>
where
- R: ObjectReader + sigrefs::git::object::Writer,
R: RefReader + sigrefs::git::reference::Writer,
+ R: ObjectReader + ObjectWriter,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
diff --git a/crates/radicle/src/storage/refs/sigrefs/git.rs b/crates/radicle/src/storage/refs/sigrefs/git.rs
index 86693302d..543f6ce1a 100644
--- a/crates/radicle/src/storage/refs/sigrefs/git.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/git.rs
@@ -180,31 +180,11 @@ mod git2_impls {
refs: RefsEntry,
signature: SignatureEntry,
) -> Result<Oid, object::error::WriteTree> {
- use object::error::WriteTree;
-
- let odb = self.odb().map_err(WriteTree::write_error)?;
-
- let refs_oid = odb
- .write(git2::ObjectType::Blob, &refs.content)
- .map_err(WriteTree::refs_error)?;
-
- let sig_oid = odb
- .write(git2::ObjectType::Blob, &signature.content)
- .map_err(WriteTree::signature_error)?;
-
- let mut builder = self.treebuilder(None).map_err(WriteTree::write_error)?;
-
- builder
- .insert(&refs.path, refs_oid, git2::FileMode::Blob.into())
- .map_err(WriteTree::refs_error)?;
-
- builder
- .insert(&signature.path, sig_oid, git2::FileMode::Blob.into())
- .map_err(WriteTree::signature_error)?;
-
- let tree_oid = builder.write().map_err(WriteTree::write_error)?;
-
- Ok(Oid::from(tree_oid))
+ crate::git::repository::ObjectWriter::write_tree(
+ self,
+ &[refs.into_inner(), signature.into_inner()],
+ )
+ .map_err(|e| object::error::WriteTree::Write(Box::new(e)))
}
fn write_commit(&self, bytes: &[u8]) -> Result<Oid, object::error::WriteCommit> {
diff --git a/crates/radicle/src/storage/refs/sigrefs/git/object.rs b/crates/radicle/src/storage/refs/sigrefs/git/object.rs
index f997314af..b98d84c29 100644
--- a/crates/radicle/src/storage/refs/sigrefs/git/object.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/git/object.rs
@@ -6,10 +6,12 @@
pub mod error;
-use std::path::{Path, PathBuf};
+use std::path::Path;
use radicle_oid::Oid;
+use crate::git::repository::types::TreeEntry;
+
/// A Git blob object, returned by [`Reader::read_blob`].
pub struct Blob {
/// The [`Oid`] of the Git blob.
@@ -46,30 +48,42 @@ pub trait Reader {
fn read_blob(&self, commit: &Oid, path: &Path) -> Result<Option<Blob>, error::ReadBlob>;
}
-/// Input to the [`Writer::write_tree`] method.
-///
-/// The entry describes where in the Git tree to write the [`Refs`] content
-/// blob.
-///
-/// [`Refs`]: crate::storage::refs::Refs
+/// A [`TreeEntry`] for the signed references payload blob.
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
-pub struct RefsEntry {
- /// Path in the Git tree to write to.
- pub path: PathBuf,
- /// The contents of the Git blob.
- pub content: Vec<u8>,
+pub struct RefsEntry(TreeEntry);
+
+impl RefsEntry {
+ /// Create a new entry with the canonical refs bytes.
+ pub fn new(content: Vec<u8>) -> Self {
+ Self(TreeEntry::Blob {
+ path: Path::new(crate::storage::refs::REFS_BLOB_PATH).into(),
+ content,
+ })
+ }
+
+ /// Unwrap into the underlying [`TreeEntry`].
+ pub fn into_inner(self) -> TreeEntry {
+ self.0
+ }
}
-/// Input to the [`Writer::write_tree`] method.
-///
-/// The entry describes where in the Git tree to write the signature content
-/// blob.
+/// A [`TreeEntry`] for the cryptographic signature blob.
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
-pub struct SignatureEntry {
- /// Path in the Git tree to write to.
- pub path: PathBuf,
- /// The contents of the Git blob.
- pub content: Vec<u8>,
+pub struct SignatureEntry(TreeEntry);
+
+impl SignatureEntry {
+ /// Create a new entry with the signature bytes.
+ pub fn new(content: Vec<u8>) -> Self {
+ Self(TreeEntry::Blob {
+ path: Path::new(crate::storage::refs::SIGNATURE_BLOB_PATH).into(),
+ content,
+ })
+ }
+
+ /// Unwrap into the underlying [`TreeEntry`].
+ pub fn into_inner(self) -> TreeEntry {
+ self.0
+ }
}
/// Git object writer, generally a Git repository, or its corresponding Object
diff --git a/crates/radicle/src/storage/refs/sigrefs/write.rs b/crates/radicle/src/storage/refs/sigrefs/write.rs
index 553673410..9ec516de8 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write.rs
@@ -3,8 +3,6 @@ pub mod error;
#[cfg(test)]
mod test;
-use std::path::Path;
-
use crypto::PublicKey;
use crypto::signature::{self, Signer};
use radicle_core::{NodeId, RepoId};
@@ -13,15 +11,12 @@ use radicle_git_metadata::commit::{CommitData, headers::Headers, trailers::Owned
use radicle_oid::Oid;
use crate::git;
-use crate::git::repository::{ObjectReader, RefReader};
+use crate::git::repository::{ObjectReader, ObjectWriter, RefReader};
use crate::storage::refs::SignedRefs;
use crate::storage::refs::sigrefs::git::{Committer, object, reference};
use crate::storage::refs::sigrefs::read::CommitReader;
use crate::storage::refs::sigrefs::{VerifiedCommit, read};
-use crate::storage::refs::{
- FeatureLevel, IDENTITY_ROOT, REFS_BLOB_PATH, Refs, SIGNATURE_BLOB_PATH, SIGREFS_BRANCH,
- SIGREFS_PARENT,
-};
+use crate::storage::refs::{FeatureLevel, IDENTITY_ROOT, Refs, SIGREFS_BRANCH, SIGREFS_PARENT};
/// The result of attempting to write signed references using
/// [`SignedRefsWriter`].
@@ -73,7 +68,7 @@ pub struct SignedRefsWriter<'a, R, S> {
impl<'a, R, S> SignedRefsWriter<'a, R, S>
where
- R: object::Writer + ObjectReader + reference::Writer + RefReader,
+ R: ObjectWriter + ObjectReader + reference::Writer + RefReader,
S: Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
{
@@ -228,7 +223,7 @@ struct CommitWriter<'a, R, S> {
impl<'a, R, S> CommitWriter<'a, R, S>
where
- R: object::Writer,
+ R: ObjectWriter,
S: Signer<crypto::Signature>,
{
fn root(refs: Refs, author: Author, message: String, repository: &'a R, signer: &'a S) -> Self {
@@ -311,7 +306,7 @@ struct TreeWriter<'a, R, S> {
impl<'a, R, S> TreeWriter<'a, R, S>
where
- R: object::Writer,
+ R: ObjectWriter,
S: Signer<crypto::Signature>,
{
fn new(refs: Refs, repository: &'a R, signer: &'a S) -> Self {
@@ -328,17 +323,11 @@ where
.signer
.try_sign(&canonical)
.map_err(error::Tree::Sign)?;
- let refs = object::RefsEntry {
- path: Path::new(REFS_BLOB_PATH).to_path_buf(),
- content: canonical,
- };
- let sig = object::SignatureEntry {
- path: Path::new(SIGNATURE_BLOB_PATH).to_path_buf(),
- content: signature.to_vec(),
- };
+ let refs = object::RefsEntry::new(canonical);
+ let sig = object::SignatureEntry::new(signature.to_vec());
let oid = self
.repository
- .write_tree(refs, sig)
+ .write_tree(&[refs.into_inner(), sig.into_inner()])
.map_err(error::Tree::Write)?;
Ok(Tree {
oid,
diff --git a/crates/radicle/src/storage/refs/sigrefs/write/error.rs b/crates/radicle/src/storage/refs/sigrefs/write/error.rs
index ecd8b2712..bc2bb9833 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write/error.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write/error.rs
@@ -2,7 +2,8 @@ use radicle_oid::Oid;
use thiserror::Error;
use crate::git::repository;
-use crate::storage::refs::sigrefs::git::{object, reference};
+use crate::git::repository::object;
+use crate::storage::refs::sigrefs::git::reference;
// TODO: use commit NID (and RID?) for traceability
#[derive(Debug, Error)]
@@ -23,7 +24,7 @@ pub enum Commit {
#[error(transparent)]
Tree(Tree),
#[error(transparent)]
- Write(object::error::WriteCommit),
+ Write(object::error::write::CommitError),
}
// TODO: use commit OID for traceability
@@ -33,7 +34,7 @@ pub enum Tree {
#[error("failed to sign references payload")]
Sign(crypto::signature::Error),
#[error(transparent)]
- Write(object::error::WriteTree),
+ Write(object::error::write::TreeError),
}
// TODO: use commit OID for traceability
diff --git a/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs b/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
index aa4bc46f5..c92f9be55 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
@@ -11,23 +11,24 @@ use radicle_oid::Oid;
use crate::git;
use crate::git::repository;
-use crate::git::repository::types::{Blob, Commit};
-use crate::git::repository::{ObjectReader, RefReader};
+use crate::git::repository::object;
+use crate::git::repository::types::{Blob, Commit, TreeEntry};
+use crate::git::repository::{ObjectReader, ObjectWriter, RefReader};
use crate::identity::doc;
use crate::storage::HasRepoId;
-use crate::storage::refs::sigrefs::git::{object, reference};
+use crate::storage::refs::sigrefs::git::reference;
use crate::storage::refs::{REFS_BLOB_PATH, Refs, SIGNATURE_BLOB_PATH, SIGREFS_BRANCH};
const MOCKED_IDENTITY: u8 = 99u8;
enum WriteTreeBehavior {
- /// [`object::Writer::write_tree`] returns `Ok(oid)`.
+ /// [`ObjectWriter::write_tree`] returns `Ok(oid)`.
Ok(Oid),
- /// [`object::Writer::write_tree`] returns `Err(…)`.
+ /// [`ObjectWriter::write_tree`] returns `Err(…)`.
Error,
}
-/// [`object::Writer::write_commit`] returns `Ok(oid)`.
+/// [`ObjectWriter::write_commit`] returns `Ok(oid)`.
struct WriteCommitBehavior(Oid);
enum WriteReferenceBehavior {
@@ -204,7 +205,7 @@ impl HasRepoId for MockRepository {
}
impl ObjectReader for MockRepository {
- fn blob(&self, _oid: Oid) -> Result<Option<Blob>, repository::object::error::read::BlobError> {
+ fn blob(&self, _oid: Oid) -> Result<Option<Blob>, object::error::read::BlobError> {
unimplemented!("MockRepository::blob")
}
@@ -212,7 +213,7 @@ impl ObjectReader for MockRepository {
&self,
commit: Oid,
path: &P,
- ) -> Result<Option<Blob>, repository::object::error::read::BlobAtError> {
+ ) -> Result<Option<Blob>, object::error::read::BlobAtError> {
let key = (commit, path.as_ref().to_path_buf());
match self.blobs.get(&key) {
Some(BlobBehavior::Present(bytes)) => Ok(Some(Blob {
@@ -220,31 +221,25 @@ impl ObjectReader for MockRepository {
content: bytes.clone(),
})),
Some(BlobBehavior::Missing) | None => Ok(None),
- Some(BlobBehavior::Error) => {
- Err(repository::object::error::read::BlobAtError::backend(
- std::io::Error::other("mock blob error"),
- ))
- }
+ Some(BlobBehavior::Error) => Err(object::error::read::BlobAtError::backend(
+ std::io::Error::other("mock blob error"),
+ )),
}
}
- fn commit(
- &self,
- oid: Oid,
- ) -> Result<Option<Commit>, repository::object::error::read::CommitError> {
+ fn commit(&self, oid: Oid) -> Result<Option<Commit>, object::error::read::CommitError> {
match self.commits.get(&oid) {
Some(CommitBehavior::Present(data)) => {
let bytes = data.to_string();
- let parsed = Commit::from_bytes(bytes.as_bytes()).map_err(|e| {
- repository::object::error::read::CommitError::Parse { oid, source: e }
- })?;
+ let parsed = Commit::from_bytes(bytes.as_bytes())
+ .map_err(|e| object::error::read::CommitError::Parse { oid, source: e })?;
Ok(Some(parsed))
}
None => Ok(None),
}
}
- fn exists(&self, _oid: Oid) -> Result<bool, repository::object::error::read::ExistsError> {
+ fn exists(&self, _oid: Oid) -> Result<bool, object::error::read::ExistsError> {
unimplemented!("MockRepository::exists")
}
}
@@ -280,26 +275,26 @@ impl RefReader for MockRepository {
}
}
-impl object::Writer for MockRepository {
- fn write_tree(
- &self,
- _refs: object::RefsEntry,
- _signature: object::SignatureEntry,
- ) -> Result<Oid, object::error::WriteTree> {
+impl ObjectWriter for MockRepository {
+ fn write_blob(&self, _content: &[u8]) -> Result<Oid, object::error::write::BlobError> {
+ unimplemented!("MockRepository::write_blob")
+ }
+
+ fn write_tree(&self, _entries: &[TreeEntry]) -> Result<Oid, object::error::write::TreeError> {
match &self.write_tree {
Some(WriteTreeBehavior::Ok(oid)) => Ok(*oid),
- Some(WriteTreeBehavior::Error) | None => Err(object::error::WriteTree::write_error(
+ Some(WriteTreeBehavior::Error) | None => Err(object::error::write::TreeError::backend(
std::io::Error::other("mock write_tree error"),
)),
}
}
- fn write_commit(&self, _bytes: &[u8]) -> Result<Oid, object::error::WriteCommit> {
+ fn write_commit(&self, _bytes: &[u8]) -> Result<Oid, object::error::write::CommitError> {
match &self.write_commit {
Some(WriteCommitBehavior(oid)) => Ok(*oid),
- None => Err(object::error::WriteCommit::other(std::io::Error::other(
- "mock write_commit error",
- ))),
+ None => Err(object::error::write::CommitError::backend(
+ std::io::Error::other("mock write_commit error"),
+ )),
}
}
}
commit 5aadb262b301b30eaca3a70eceb1c06c6a6213f1
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Tue Apr 14 12:13:06 2026 +0000
storage/refs/sigrefs: migrate reference::Reader to RefReader
Replace the sigrefs-specific reference::Reader trait with the shared
git::repository::RefReader trait across all consumers:
- SignedRefsReader::resolve_tip, HeadReader::read
- SignedRefsWriter bounds
- RefsAt::new in storage/refs.rs
- ReadStorage::Repository associated type bound
- Both read and write test mocks
- Test MockRepository in test/storage.rs
The mapping from the previous trait method to the new trait method is:
- find_reference(&Namespaced) -> ref_target(&R: AsRef<RefStr>):
Namespaced implements AsRef<RefStr>, so this is a direct swap
The implementation of the mock RefReader methods use
unimplemented!() for `list_refs`.
diff --git a/crates/radicle/src/storage.rs b/crates/radicle/src/storage.rs
index f407cd7dc..1a03f7d02 100644
--- a/crates/radicle/src/storage.rs
+++ b/crates/radicle/src/storage.rs
@@ -436,7 +436,7 @@ impl Deref for Remote {
/// Read-only operations on a storage instance.
pub trait ReadStorage {
- type Repository: ReadRepository + self::refs::sigrefs::git::reference::Reader;
+ type Repository: ReadRepository + crate::git::repository::RefReader;
/// Get user info for this storage.
fn info(&self) -> &UserInfo;
diff --git a/crates/radicle/src/storage/refs.rs b/crates/radicle/src/storage/refs.rs
index 757c11228..640baff2c 100644
--- a/crates/radicle/src/storage/refs.rs
+++ b/crates/radicle/src/storage/refs.rs
@@ -19,7 +19,7 @@ use thiserror::Error;
use crate::git;
use crate::git::Oid;
use crate::git::raw::ErrorExt as _;
-use crate::git::repository::ObjectReader;
+use crate::git::repository::{ObjectReader, RefReader};
use crate::storage;
use crate::storage::RemoteId;
use crate::storage::refs::sigrefs::read::Tip;
@@ -80,7 +80,7 @@ impl Refs {
) -> Result<SignedRefs, Error>
where
R: ObjectReader + sigrefs::git::object::Writer,
- R: sigrefs::git::reference::Reader + sigrefs::git::reference::Writer,
+ R: RefReader + sigrefs::git::reference::Writer,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
@@ -98,7 +98,7 @@ impl Refs {
) -> Result<SignedRefs, Error>
where
R: ObjectReader + sigrefs::git::object::Writer,
- R: sigrefs::git::reference::Reader + sigrefs::git::reference::Writer,
+ R: RefReader + sigrefs::git::reference::Writer,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
@@ -116,7 +116,7 @@ impl Refs {
) -> Result<SignedRefs, Error>
where
R: ObjectReader + sigrefs::git::object::Writer,
- R: sigrefs::git::reference::Reader + sigrefs::git::reference::Writer,
+ R: RefReader + sigrefs::git::reference::Writer,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
@@ -349,10 +349,10 @@ pub struct RefsAt {
impl RefsAt {
pub fn new<R>(repo: &R, remote: RemoteId) -> Result<Self, sigrefs::read::error::Read>
where
- R: sigrefs::git::reference::Reader,
+ R: RefReader,
{
let at = repo
- .find_reference(
+ .ref_target(
&storage::refs::SIGREFS_BRANCH.with_namespace(git::fmt::Component::from(&remote)),
)
.map_err(sigrefs::read::error::Read::FindReference)?
@@ -426,7 +426,7 @@ impl SignedRefs {
pub fn load<R>(remote: RemoteId, repo: &R) -> Result<Option<Self>, sigrefs::read::error::Read>
where
R: HasRepoId,
- R: ObjectReader + sigrefs::git::reference::Reader,
+ R: ObjectReader + RefReader,
{
Self::load_internal(remote, repo, sigrefs::read::Tip::Reference(remote))
}
@@ -438,7 +438,7 @@ impl SignedRefs {
) -> Result<Option<Self>, sigrefs::read::error::Read>
where
R: HasRepoId,
- R: ObjectReader + sigrefs::git::reference::Reader,
+ R: ObjectReader + RefReader,
{
Self::load_internal(remote, repo, sigrefs::read::Tip::Commit(oid))
}
@@ -450,7 +450,7 @@ impl SignedRefs {
) -> Result<Option<Self>, sigrefs::read::error::Read>
where
R: HasRepoId,
- R: ObjectReader + sigrefs::git::reference::Reader,
+ R: ObjectReader + RefReader,
{
let root = repo.rid();
match sigrefs::SignedRefsReader::new(root, tip, repo, &remote).read() {
diff --git a/crates/radicle/src/storage/refs/sigrefs/read.rs b/crates/radicle/src/storage/refs/sigrefs/read.rs
index 89f3a6859..4a0e4fc8b 100644
--- a/crates/radicle/src/storage/refs/sigrefs/read.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/read.rs
@@ -16,9 +16,8 @@ use radicle_git_metadata::commit::CommitData;
use radicle_oid::Oid;
use crate::git;
-use crate::git::repository::ObjectReader;
+use crate::git::repository::{ObjectReader, RefReader};
use crate::identity::doc;
-use crate::storage::refs::sigrefs::git::reference;
use crate::storage::refs::{
FeatureLevel, IDENTITY_ROOT, REFS_BLOB_PATH, Refs, SIGNATURE_BLOB_PATH, SIGREFS_BRANCH,
SignedRefs,
@@ -129,7 +128,7 @@ impl std::fmt::Display for FeatureLevels {
impl<'a, R, V> SignedRefsReader<'a, R, V>
where
- R: ObjectReader + reference::Reader,
+ R: ObjectReader + RefReader,
V: signature::Verifier<crypto::Signature>,
{
/// Construct a new [`SignedRefsReader`].
@@ -305,7 +304,7 @@ where
SIGREFS_BRANCH.with_namespace(git::fmt::Component::from(&namespace));
let head = self
.repository
- .find_reference(&reference)
+ .ref_target(&reference)
.map_err(error::Read::FindReference)?
.ok_or_else(|| error::Read::MissingSigrefs { namespace })?;
Ok(head)
diff --git a/crates/radicle/src/storage/refs/sigrefs/read/error.rs b/crates/radicle/src/storage/refs/sigrefs/read/error.rs
index 35d867e82..f537cb92e 100644
--- a/crates/radicle/src/storage/refs/sigrefs/read/error.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/read/error.rs
@@ -7,7 +7,7 @@ use radicle_oid::Oid;
use thiserror::Error;
use crate::git::repository::object;
-use crate::storage::refs::sigrefs::git::reference;
+use crate::git::repository::reference;
use crate::storage::refs::sigrefs::read::FeatureLevels;
use crate::storage::refs::{FeatureLevel, canonical};
@@ -17,7 +17,7 @@ pub enum Read {
#[error(transparent)]
Commit(Commit),
#[error(transparent)]
- FindReference(reference::error::FindReference),
+ FindReference(reference::error::read::RefTargetError),
#[error("failed to find `refs/namespaces/{namespace}/refs/rad/sigrefs`")]
MissingSigrefs { namespace: NodeId },
#[error(transparent)]
@@ -67,7 +67,7 @@ impl fmt::Display for Parent {
.iter()
.map(|oid| oid.to_string())
.collect::<Vec<_>>()
- .join(", ")
+ .join(", "),
)
}
}
diff --git a/crates/radicle/src/storage/refs/sigrefs/read/test/mock.rs b/crates/radicle/src/storage/refs/sigrefs/read/test/mock.rs
index a06210b47..5b5e6de3c 100644
--- a/crates/radicle/src/storage/refs/sigrefs/read/test/mock.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/read/test/mock.rs
@@ -14,11 +14,11 @@ use radicle_git_metadata::commit::trailers::OwnedTrailer;
use radicle_oid::Oid;
use crate::git;
-use crate::git::repository::ObjectReader;
use crate::git::repository::object;
+use crate::git::repository::reference;
use crate::git::repository::types::{Blob, Commit};
+use crate::git::repository::{ObjectReader, RefReader};
use crate::identity::doc;
-use crate::storage::refs::sigrefs::git::reference;
use crate::storage::refs::{REFS_BLOB_PATH, Refs, SIGNATURE_BLOB_PATH, SIGREFS_BRANCH};
pub(crate) const MOCKED_IDENTITY: u8 = 99u8;
@@ -216,19 +216,30 @@ impl ObjectReader for MockRepository {
}
}
-impl reference::Reader for MockRepository {
- fn find_reference(
+impl RefReader for MockRepository {
+ type References<'a> = std::iter::Empty<
+ Result<(git::fmt::Qualified<'static>, Oid), reference::error::read::ListReferenceError>,
+ >;
+
+ fn ref_target<R: AsRef<git::fmt::RefStr>>(
&self,
- reference: &git::fmt::Namespaced,
- ) -> Result<Option<Oid>, reference::error::FindReference> {
- match self.references.get(reference.as_str()) {
+ name: &R,
+ ) -> Result<Option<Oid>, reference::error::read::RefTargetError> {
+ match self.references.get(name.as_ref().as_str()) {
Some(RefBehavior::Present(oid)) => Ok(Some(*oid)),
Some(RefBehavior::Missing) | None => Ok(None),
- Some(RefBehavior::Error) => Err(reference::error::FindReference::other(
+ Some(RefBehavior::Error) => Err(reference::error::read::RefTargetError::backend(
std::io::Error::other("mock reference error"),
)),
}
}
+
+ fn list_refs<'a, P: AsRef<git::fmt::refspec::PatternStr>>(
+ &'a self,
+ _pattern: &P,
+ ) -> Result<Self::References<'a>, reference::error::read::ListRefsError> {
+ unimplemented!("MockRepository::list_refs")
+ }
}
/// Accepts every (message, signature) pair without inspecting either.
diff --git a/crates/radicle/src/storage/refs/sigrefs/write.rs b/crates/radicle/src/storage/refs/sigrefs/write.rs
index bf06bc0bd..553673410 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write.rs
@@ -13,7 +13,7 @@ use radicle_git_metadata::commit::{CommitData, headers::Headers, trailers::Owned
use radicle_oid::Oid;
use crate::git;
-use crate::git::repository::ObjectReader;
+use crate::git::repository::{ObjectReader, RefReader};
use crate::storage::refs::SignedRefs;
use crate::storage::refs::sigrefs::git::{Committer, object, reference};
use crate::storage::refs::sigrefs::read::CommitReader;
@@ -73,7 +73,7 @@ pub struct SignedRefsWriter<'a, R, S> {
impl<'a, R, S> SignedRefsWriter<'a, R, S>
where
- R: object::Writer + ObjectReader + reference::Writer + reference::Reader,
+ R: object::Writer + ObjectReader + reference::Writer + RefReader,
S: Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
{
@@ -373,7 +373,7 @@ struct HeadReader<'a, 'b, 'c, R, V> {
impl<'a, 'b, 'c, R, V> HeadReader<'a, 'b, 'c, R, V>
where
- R: ObjectReader + reference::Reader,
+ R: ObjectReader + RefReader,
V: signature::Verifier<crypto::Signature>,
{
/// Construct a [`HeadReader`] with the `reference` that is being read from
@@ -401,7 +401,7 @@ where
fn read(self) -> Result<Option<Head>, error::Head> {
let Some(oid) = self
.repository
- .find_reference(self.reference)
+ .ref_target(self.reference)
.map_err(error::Head::Reference)?
else {
return Ok(None);
diff --git a/crates/radicle/src/storage/refs/sigrefs/write/error.rs b/crates/radicle/src/storage/refs/sigrefs/write/error.rs
index 12ba0f005..ecd8b2712 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write/error.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write/error.rs
@@ -1,6 +1,7 @@
use radicle_oid::Oid;
use thiserror::Error;
+use crate::git::repository;
use crate::storage::refs::sigrefs::git::{object, reference};
// TODO: use commit NID (and RID?) for traceability
@@ -41,7 +42,7 @@ pub enum Tree {
#[error(transparent)]
pub enum Head {
#[error(transparent)]
- Reference(reference::error::FindReference),
+ Reference(repository::reference::error::read::RefTargetError),
#[error(transparent)]
Commit(super::read::error::Commit),
#[error("failed to verify commit {commit}: {source}")]
diff --git a/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs b/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
index 16931735a..aa4bc46f5 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
@@ -11,8 +11,8 @@ use radicle_oid::Oid;
use crate::git;
use crate::git::repository;
-use crate::git::repository::ObjectReader;
use crate::git::repository::types::{Blob, Commit};
+use crate::git::repository::{ObjectReader, RefReader};
use crate::identity::doc;
use crate::storage::HasRepoId;
use crate::storage::refs::sigrefs::git::{object, reference};
@@ -249,19 +249,35 @@ impl ObjectReader for MockRepository {
}
}
-impl reference::Reader for MockRepository {
- fn find_reference(
+impl RefReader for MockRepository {
+ type References<'a> = std::iter::Empty<
+ Result<
+ (git::fmt::Qualified<'static>, Oid),
+ repository::reference::error::read::ListReferenceError,
+ >,
+ >;
+
+ fn ref_target<R: AsRef<git::fmt::RefStr>>(
&self,
- reference: &git::fmt::Namespaced,
- ) -> Result<Option<Oid>, reference::error::FindReference> {
- match self.references.get(reference.as_str()) {
+ name: &R,
+ ) -> Result<Option<Oid>, repository::reference::error::read::RefTargetError> {
+ match self.references.get(name.as_ref().as_str()) {
Some(RefBehavior::Present(oid)) => Ok(Some(*oid)),
Some(RefBehavior::Missing) | None => Ok(None),
- Some(RefBehavior::Error) => Err(reference::error::FindReference::other(
- std::io::Error::other("mock reference error"),
- )),
+ Some(RefBehavior::Error) => {
+ Err(repository::reference::error::read::RefTargetError::backend(
+ std::io::Error::other("mock reference error"),
+ ))
+ }
}
}
+
+ fn list_refs<'a, P: AsRef<git::fmt::refspec::PatternStr>>(
+ &'a self,
+ _pattern: &P,
+ ) -> Result<Self::References<'a>, repository::reference::error::read::ListRefsError> {
+ unimplemented!("MockRepository::list_refs")
+ }
}
impl object::Writer for MockRepository {
diff --git a/crates/radicle/src/test/storage.rs b/crates/radicle/src/test/storage.rs
index c32881af2..c84b53def 100644
--- a/crates/radicle/src/test/storage.rs
+++ b/crates/radicle/src/test/storage.rs
@@ -152,16 +152,29 @@ impl MockRepository {
}
}
-impl self::refs::sigrefs::git::reference::Reader for MockRepository {
- fn find_reference(
+impl crate::git::repository::RefReader for MockRepository {
+ type References<'a> = std::iter::Empty<
+ Result<
+ (git::fmt::Qualified<'static>, Oid),
+ crate::git::repository::reference::error::read::ListReferenceError,
+ >,
+ >;
+
+ fn ref_target<R: AsRef<git::fmt::RefStr>>(
&self,
- reference: &git::fmt::Namespaced,
- ) -> Result<Option<Oid>, refs::sigrefs::git::reference::error::FindReference> {
- use refs::sigrefs::git::reference::error::FindReference;
- let ns = reference.namespace();
+ name: &R,
+ ) -> Result<Option<Oid>, crate::git::repository::reference::error::read::RefTargetError> {
+ use crate::git::repository::reference::error::read::RefTargetError;
+
+ let name = name.as_ref();
+ let namespaced = match name.to_namespaced() {
+ Some(ns) => ns,
+ None => return Ok(None),
+ };
- let remote: PublicKey = ns.as_str().parse().map_err(FindReference::other)?;
- let reference = reference.strip_namespace();
+ let ns = namespaced.namespace();
+ let remote: PublicKey = ns.as_str().parse().map_err(RefTargetError::backend)?;
+ let reference = namespaced.strip_namespace();
match self.remotes.get(&remote) {
None => Ok(None),
@@ -174,6 +187,14 @@ impl self::refs::sigrefs::git::reference::Reader for MockRepository {
}
}
}
+
+ fn list_refs<'a, P: AsRef<git::fmt::refspec::PatternStr>>(
+ &'a self,
+ _pattern: &P,
+ ) -> Result<Self::References<'a>, crate::git::repository::reference::error::read::ListRefsError>
+ {
+ unimplemented!("MockRepository::list_refs")
+ }
}
impl RemoteRepository for MockRepository {
commit 8c9729176b3fbcb323e35e36b8ec22253d08cd5f
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Tue Apr 14 12:01:39 2026 +0100
storage/refs/sigrefs: migrate object::Reader to ObjectReader
Replace the sigrefs-specific object::Reader trait with the shared
git::repository::ObjectReader trait across all consumers:
- SignedRefsReader, CommitReader, TreeReader, IdentityRootReader, Walk
- HeadReader and SignedRefsWriter (write side)
- Both read and write test mocks
The mapping from the previous trait methods to the new trait methods
are:
- read_commit(&oid) -> commit(oid): returns parsed CommitData directly
instead of raw bytes, eliminating manual parsing in read_commit_data
- read_blob(commit, path) -> blob_at(commit, path): Blob field renamed
from 'bytes' to 'content'
- Error types updated: Commit::Read wraps CommitError, Tree::Refs and
Tree::Signature wrap BlobAtError, IdentityRoot::Blob wraps BlobAtError
Trait bounds are updated in `storage::refs`, which are satisfied by
`storage::git::Repository`.
The implementation of the mock ObjectReader methods use
unimplemented!() for unused methods, i.e. `blob`, `exists`.
diff --git a/crates/radicle/src/storage/refs.rs b/crates/radicle/src/storage/refs.rs
index c7b6b3e91..757c11228 100644
--- a/crates/radicle/src/storage/refs.rs
+++ b/crates/radicle/src/storage/refs.rs
@@ -19,6 +19,7 @@ use thiserror::Error;
use crate::git;
use crate::git::Oid;
use crate::git::raw::ErrorExt as _;
+use crate::git::repository::ObjectReader;
use crate::storage;
use crate::storage::RemoteId;
use crate::storage::refs::sigrefs::read::Tip;
@@ -78,7 +79,7 @@ impl Refs {
signer: &S,
) -> Result<SignedRefs, Error>
where
- R: sigrefs::git::object::Reader + sigrefs::git::object::Writer,
+ R: ObjectReader + sigrefs::git::object::Writer,
R: sigrefs::git::reference::Reader + sigrefs::git::reference::Writer,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
@@ -96,7 +97,7 @@ impl Refs {
signer: &S,
) -> Result<SignedRefs, Error>
where
- R: sigrefs::git::object::Reader + sigrefs::git::object::Writer,
+ R: ObjectReader + sigrefs::git::object::Writer,
R: sigrefs::git::reference::Reader + sigrefs::git::reference::Writer,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
@@ -114,7 +115,7 @@ impl Refs {
force: bool,
) -> Result<SignedRefs, Error>
where
- R: sigrefs::git::object::Reader + sigrefs::git::object::Writer,
+ R: ObjectReader + sigrefs::git::object::Writer,
R: sigrefs::git::reference::Reader + sigrefs::git::reference::Writer,
R: HasRepoId,
S: signature::Signer<crypto::Signature>,
@@ -425,7 +426,7 @@ impl SignedRefs {
pub fn load<R>(remote: RemoteId, repo: &R) -> Result<Option<Self>, sigrefs::read::error::Read>
where
R: HasRepoId,
- R: sigrefs::git::object::Reader + sigrefs::git::reference::Reader,
+ R: ObjectReader + sigrefs::git::reference::Reader,
{
Self::load_internal(remote, repo, sigrefs::read::Tip::Reference(remote))
}
@@ -437,7 +438,7 @@ impl SignedRefs {
) -> Result<Option<Self>, sigrefs::read::error::Read>
where
R: HasRepoId,
- R: sigrefs::git::object::Reader + sigrefs::git::reference::Reader,
+ R: ObjectReader + sigrefs::git::reference::Reader,
{
Self::load_internal(remote, repo, sigrefs::read::Tip::Commit(oid))
}
@@ -449,7 +450,7 @@ impl SignedRefs {
) -> Result<Option<Self>, sigrefs::read::error::Read>
where
R: HasRepoId,
- R: sigrefs::git::object::Reader + sigrefs::git::reference::Reader,
+ R: ObjectReader + sigrefs::git::reference::Reader,
{
let root = repo.rid();
match sigrefs::SignedRefsReader::new(root, tip, repo, &remote).read() {
diff --git a/crates/radicle/src/storage/refs/sigrefs/read.rs b/crates/radicle/src/storage/refs/sigrefs/read.rs
index 3b27411a3..89f3a6859 100644
--- a/crates/radicle/src/storage/refs/sigrefs/read.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/read.rs
@@ -16,8 +16,9 @@ use radicle_git_metadata::commit::CommitData;
use radicle_oid::Oid;
use crate::git;
+use crate::git::repository::ObjectReader;
use crate::identity::doc;
-use crate::storage::refs::sigrefs::git::{object, reference};
+use crate::storage::refs::sigrefs::git::reference;
use crate::storage::refs::{
FeatureLevel, IDENTITY_ROOT, REFS_BLOB_PATH, Refs, SIGNATURE_BLOB_PATH, SIGREFS_BRANCH,
SignedRefs,
@@ -128,7 +129,7 @@ impl std::fmt::Display for FeatureLevels {
impl<'a, R, V> SignedRefsReader<'a, R, V>
where
- R: object::Reader + reference::Reader,
+ R: ObjectReader + reference::Reader,
V: signature::Verifier<crypto::Signature>,
{
/// Construct a new [`SignedRefsReader`].
@@ -440,7 +441,7 @@ pub(super) struct CommitReader<'a, R> {
impl<'a, R> CommitReader<'a, R>
where
- R: object::Reader,
+ R: ObjectReader,
{
pub(super) fn new(commit: Oid, repository: &'a R) -> Self {
Self { commit, repository }
@@ -466,15 +467,10 @@ where
}
fn read_commit_data(&self) -> Result<CommitData<Oid, Oid>, error::Commit> {
- let bytes = self
- .repository
- .read_commit(&self.commit)
+ self.repository
+ .commit(self.commit)
.map_err(error::Commit::Read)?
- .ok_or(error::Commit::Missing { oid: self.commit })?;
- CommitData::from_bytes(&bytes).map_err(|err| error::Commit::Parse {
- oid: self.commit,
- source: err,
- })
+ .ok_or(error::Commit::Missing { oid: self.commit })
}
/// Extract the single parent [`Oid`] from a [`CommitData`], if any.
@@ -509,7 +505,7 @@ struct TreeReader<'a, R> {
impl<'a, R> TreeReader<'a, R>
where
- R: object::Reader,
+ R: ObjectReader,
{
fn new(commit: Oid, repository: &'a R) -> Self {
Self { commit, repository }
@@ -517,40 +513,42 @@ where
fn read(self) -> Result<Tree, error::Tree> {
let (refs, signature) = self.try_handle_blobs()?;
- let refs = Refs::from_canonical(&refs.bytes).map_err(error::Tree::ParseRefs)?;
- let signature = crypto::Signature::try_from(signature.bytes.as_slice())
+ let refs = Refs::from_canonical(&refs.content).map_err(error::Tree::ParseRefs)?;
+ let signature = crypto::Signature::try_from(signature.content.as_slice())
.map_err(error::Tree::ParseSignature)?;
Ok(Tree { refs, signature })
}
/// Fetch the refs blob and signature blob from the repository, returning a
/// descriptive error if either or both are missing.
- fn try_handle_blobs(&self) -> Result<(object::Blob, object::Blob), error::Tree> {
- let commit = &self.commit;
+ fn try_handle_blobs(
+ &self,
+ ) -> Result<(git::repository::Blob, git::repository::Blob), error::Tree> {
+ let commit = self.commit;
let refs_path = Path::new(REFS_BLOB_PATH);
let sig_path = Path::new(SIGNATURE_BLOB_PATH);
- let refs_bytes = self
+ let refs_blob = self
.repository
- .read_blob(commit, refs_path)
+ .blob_at(commit, &refs_path)
.map_err(error::Tree::Refs)?;
- let sig_bytes = self
+ let sig_blob = self
.repository
- .read_blob(commit, sig_path)
+ .blob_at(commit, &sig_path)
.map_err(error::Tree::Signature)?;
- let result = match (refs_bytes, sig_bytes) {
+ let result = match (refs_blob, sig_blob) {
(None, None) => Err(error::MissingBlobs::Both {
- commit: *commit,
+ commit,
refs: refs_path.to_path_buf(),
signature: sig_path.to_path_buf(),
}),
(None, Some(_)) => Err(error::MissingBlobs::Signature {
- commit: *commit,
+ commit,
path: sig_path.to_path_buf(),
}),
(Some(_), None) => Err(error::MissingBlobs::Refs {
- commit: *commit,
+ commit,
path: refs_path.to_path_buf(),
}),
(Some(refs), Some(sig)) => Ok((refs, sig)),
@@ -573,7 +571,7 @@ struct IdentityRootReader<'a, 'b, R> {
impl<'a, 'b, R> IdentityRootReader<'a, 'b, R>
where
- R: object::Reader,
+ R: ObjectReader,
{
fn new(refs: &'a Refs, repository: &'b R) -> Self {
Self { refs, repository }
@@ -590,11 +588,11 @@ where
fn read_blob(&self, commit: &Oid) -> Result<RepoId, error::IdentityRoot> {
let path = Path::new("embeds").join(*doc::PATH);
- let object::Blob { oid, .. } = self
+ let blob = self
.repository
- .read_blob(commit, &path)
+ .blob_at(*commit, &path)
.map_err(error::IdentityRoot::Blob)?
.ok_or_else(|| error::IdentityRoot::MissingIdentity { commit: *commit })?;
- Ok(RepoId::from(oid))
+ Ok(RepoId::from(blob.oid))
}
}
diff --git a/crates/radicle/src/storage/refs/sigrefs/read/error.rs b/crates/radicle/src/storage/refs/sigrefs/read/error.rs
index c7a8c0626..35d867e82 100644
--- a/crates/radicle/src/storage/refs/sigrefs/read/error.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/read/error.rs
@@ -6,7 +6,8 @@ use radicle_git_metadata::commit;
use radicle_oid::Oid;
use thiserror::Error;
-use crate::storage::refs::sigrefs::git::{object, reference};
+use crate::git::repository::object;
+use crate::storage::refs::sigrefs::git::reference;
use crate::storage::refs::sigrefs::read::FeatureLevels;
use crate::storage::refs::{FeatureLevel, canonical};
@@ -48,7 +49,7 @@ pub enum Commit {
#[error(transparent)]
TooManyParents(Parent),
#[error(transparent)]
- Read(object::error::ReadCommit),
+ Read(object::error::read::CommitError),
}
#[derive(Debug, Error)]
@@ -75,9 +76,9 @@ impl fmt::Display for Parent {
#[non_exhaustive]
pub enum Tree {
#[error(transparent)]
- Refs(object::error::ReadBlob),
+ Refs(object::error::read::BlobAtError),
#[error(transparent)]
- Signature(object::error::ReadBlob),
+ Signature(object::error::read::BlobAtError),
#[error(transparent)]
ParseRefs(canonical::Error),
#[error(transparent)]
@@ -104,7 +105,7 @@ pub enum MissingBlobs {
#[non_exhaustive]
pub enum IdentityRoot {
#[error(transparent)]
- Blob(object::error::ReadBlob),
+ Blob(object::error::read::BlobAtError),
#[error("missing repository identity commit '{commit}'")]
MissingIdentity { commit: Oid },
}
diff --git a/crates/radicle/src/storage/refs/sigrefs/read/iter.rs b/crates/radicle/src/storage/refs/sigrefs/read/iter.rs
index 5807575f1..fdf1c6db3 100644
--- a/crates/radicle/src/storage/refs/sigrefs/read/iter.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/read/iter.rs
@@ -1,6 +1,6 @@
use radicle_oid::Oid;
-use crate::storage::refs::sigrefs::git::object;
+use crate::git::repository::ObjectReader;
use super::{Commit, CommitReader, error};
@@ -18,7 +18,7 @@ impl<'a, R> Walk<'a, R> {
}
}
-impl<'a, R: object::Reader> Iterator for Walk<'a, R> {
+impl<'a, R: ObjectReader> Iterator for Walk<'a, R> {
type Item = Result<Commit, error::Commit>;
fn next(&mut self) -> Option<Self::Item> {
diff --git a/crates/radicle/src/storage/refs/sigrefs/read/test/mock.rs b/crates/radicle/src/storage/refs/sigrefs/read/test/mock.rs
index 651c3782a..a06210b47 100644
--- a/crates/radicle/src/storage/refs/sigrefs/read/test/mock.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/read/test/mock.rs
@@ -1,5 +1,7 @@
-//! Mock implementations of [`object::Reader`] and [`reference::Reader`] for
+//! Mock implementations of [`ObjectReader`] and [`reference::Reader`] for
//! unit-testing.
+//!
+//! [`ObjectReader`]: crate::git::repository::ObjectReader
use std::collections::HashMap;
use std::path::{Path, PathBuf};
@@ -12,13 +14,16 @@ use radicle_git_metadata::commit::trailers::OwnedTrailer;
use radicle_oid::Oid;
use crate::git;
+use crate::git::repository::ObjectReader;
+use crate::git::repository::object;
+use crate::git::repository::types::{Blob, Commit};
use crate::identity::doc;
-use crate::storage::refs::sigrefs::git::{object, reference};
+use crate::storage::refs::sigrefs::git::reference;
use crate::storage::refs::{REFS_BLOB_PATH, Refs, SIGNATURE_BLOB_PATH, SIGREFS_BRANCH};
pub(crate) const MOCKED_IDENTITY: u8 = 99u8;
-/// A configurable in-memory repository implementing [`object::Reader`] and
+/// A configurable in-memory repository implementing [`ObjectReader`] and
/// [`reference::Reader`].
/// All behaviour is set at construction time via the builder methods; the mock
/// is fully deterministic.
@@ -29,20 +34,20 @@ pub struct MockRepository {
}
enum CommitBehavior {
- /// [`object::Reader::read_commit`] returns `Ok(Some(bytes))`.
+ /// [`ObjectReader::commit`] returns `Ok(Some(commit))`.
Present(Box<CommitData<Oid, Oid>>),
- /// [`object::Reader::read_commit`] returns `Ok(None)`.
+ /// [`ObjectReader::commit`] returns `Ok(None)`.
Missing,
- /// [`object::Reader::read_commit`] returns `Err(…)`.
+ /// [`ObjectReader::commit`] returns `Err(…)`.
Error,
}
enum BlobBehavior {
- /// [`object::Reader::read_blob`] returns `Ok(Some(blob))`.
+ /// [`ObjectReader::blob_at`] returns `Ok(Some(blob))`.
Present(Vec<u8>),
- /// [`object::Reader::read_blob`] returns `Ok(None)`.
+ /// [`ObjectReader::blob_at`] returns `Ok(None)`.
Missing,
- /// [`object::Reader::read_blob`] returns `Err(…)`.
+ /// [`ObjectReader::blob_at`] returns `Err(…)`.
Error,
}
@@ -164,38 +169,51 @@ impl MockRepository {
}
}
-impl object::Reader for MockRepository {
- fn read_commit(&self, oid: &Oid) -> Result<Option<Vec<u8>>, object::error::ReadCommit> {
- match self.commits.get(oid) {
- Some(CommitBehavior::Present(data)) => Ok(Some(data.to_string().as_bytes().to_vec())),
- Some(CommitBehavior::Missing) | None => Ok(None),
- Some(CommitBehavior::Error) => Err(object::error::ReadCommit::other(
- std::io::Error::other("mock commit error"),
- )),
- }
+impl ObjectReader for MockRepository {
+ fn blob(&self, _oid: Oid) -> Result<Option<Blob>, object::error::read::BlobError> {
+ unimplemented!("MockRepository::blob")
}
- fn read_blob(
+ fn blob_at<P: AsRef<Path>>(
&self,
- commit: &Oid,
- path: &Path,
- ) -> Result<Option<object::Blob>, object::error::ReadBlob> {
- let key = (*commit, path.to_path_buf());
+ commit: Oid,
+ path: &P,
+ ) -> Result<Option<Blob>, object::error::read::BlobAtError> {
+ let key = (commit, path.as_ref().to_path_buf());
match self.blobs.get(&key) {
- Some(BlobBehavior::Present(bytes)) => Ok(Some(object::Blob {
+ Some(BlobBehavior::Present(bytes)) => Ok(Some(Blob {
// The blob OID is returned as the commit OID. This is
// intentional: IdentityRootReader converts blob.oid into a
// RepoId, so callers can predict which RepoId results from a
// given identity-root commit OID.
- oid: *commit,
- bytes: bytes.clone(),
+ oid: commit,
+ content: bytes.clone(),
})),
Some(BlobBehavior::Missing) | None => Ok(None),
- Some(BlobBehavior::Error) => Err(object::error::ReadBlob::other(
+ Some(BlobBehavior::Error) => Err(object::error::read::BlobAtError::backend(
std::io::Error::other("mock blob error"),
)),
}
}
+
+ fn commit(&self, oid: Oid) -> Result<Option<Commit>, object::error::read::CommitError> {
+ match self.commits.get(&oid) {
+ Some(CommitBehavior::Present(data)) => {
+ let bytes = data.to_string();
+ let parsed = Commit::from_bytes(bytes.as_bytes())
+ .map_err(|e| object::error::read::CommitError::Parse { oid, source: e })?;
+ Ok(Some(parsed))
+ }
+ Some(CommitBehavior::Missing) | None => Ok(None),
+ Some(CommitBehavior::Error) => Err(object::error::read::CommitError::backend(
+ std::io::Error::other("mock commit error"),
+ )),
+ }
+ }
+
+ fn exists(&self, _oid: Oid) -> Result<bool, object::error::read::ExistsError> {
+ unimplemented!("MockRepository::exists")
+ }
}
impl reference::Reader for MockRepository {
diff --git a/crates/radicle/src/storage/refs/sigrefs/write.rs b/crates/radicle/src/storage/refs/sigrefs/write.rs
index caf254275..bf06bc0bd 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write.rs
@@ -13,6 +13,7 @@ use radicle_git_metadata::commit::{CommitData, headers::Headers, trailers::Owned
use radicle_oid::Oid;
use crate::git;
+use crate::git::repository::ObjectReader;
use crate::storage::refs::SignedRefs;
use crate::storage::refs::sigrefs::git::{Committer, object, reference};
use crate::storage::refs::sigrefs::read::CommitReader;
@@ -72,7 +73,7 @@ pub struct SignedRefsWriter<'a, R, S> {
impl<'a, R, S> SignedRefsWriter<'a, R, S>
where
- R: object::Writer + object::Reader + reference::Writer + reference::Reader,
+ R: object::Writer + ObjectReader + reference::Writer + reference::Reader,
S: Signer<crypto::Signature>,
S: signature::Verifier<crypto::Signature>,
{
@@ -372,7 +373,7 @@ struct HeadReader<'a, 'b, 'c, R, V> {
impl<'a, 'b, 'c, R, V> HeadReader<'a, 'b, 'c, R, V>
where
- R: object::Reader + reference::Reader,
+ R: ObjectReader + reference::Reader,
V: signature::Verifier<crypto::Signature>,
{
/// Construct a [`HeadReader`] with the `reference` that is being read from
diff --git a/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs b/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
index 23ff266a4..16931735a 100644
--- a/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
+++ b/crates/radicle/src/storage/refs/sigrefs/write/test/mock.rs
@@ -10,6 +10,9 @@ use radicle_git_metadata::commit::trailers::OwnedTrailer;
use radicle_oid::Oid;
use crate::git;
+use crate::git::repository;
+use crate::git::repository::ObjectReader;
+use crate::git::repository::types::{Blob, Commit};
use crate::identity::doc;
use crate::storage::HasRepoId;
use crate::storage::refs::sigrefs::git::{object, reference};
@@ -200,31 +203,50 @@ impl HasRepoId for MockRepository {
}
}
-impl object::Reader for MockRepository {
- fn read_commit(&self, oid: &Oid) -> Result<Option<Vec<u8>>, object::error::ReadCommit> {
- match self.commits.get(oid) {
- Some(CommitBehavior::Present(data)) => Ok(Some(data.to_string().as_bytes().to_vec())),
- None => Ok(None),
- }
+impl ObjectReader for MockRepository {
+ fn blob(&self, _oid: Oid) -> Result<Option<Blob>, repository::object::error::read::BlobError> {
+ unimplemented!("MockRepository::blob")
}
- fn read_blob(
+ fn blob_at<P: AsRef<Path>>(
&self,
- commit: &Oid,
- path: &Path,
- ) -> Result<Option<object::Blob>, object::error::ReadBlob> {
- let key = (*commit, path.to_path_buf());
+ commit: Oid,
+ path: &P,
+ ) -> Result<Option<Blob>, repository::object::error::read::BlobAtError> {
+ let key = (commit, path.as_ref().to_path_buf());
match self.blobs.get(&key) {
- Some(BlobBehavior::Present(bytes)) => Ok(Some(object::Blob {
- oid: *commit,
- bytes: bytes.clone(),
+ Some(BlobBehavior::Present(bytes)) => Ok(Some(Blob {
+ oid: commit,
+ content: bytes.clone(),
})),
Some(BlobBehavior::Missing) | None => Ok(None),
- Some(BlobBehavior::Error) => Err(object::error::ReadBlob::other(
- std::io::Error::other("mock blob error"),
- )),
+ Some(BlobBehavior::Error) => {
+ Err(repository::object::error::read::BlobAtError::backend(
+ std::io::Error::other("mock blob error"),
+ ))
+ }
+ }
+ }
+
+ fn commit(
+ &self,
+ oid: Oid,
+ ) -> Result<Option<Commit>, repository::object::error::read::CommitError> {
+ match self.commits.get(&oid) {
+ Some(CommitBehavior::Present(data)) => {
+ let bytes = data.to_string();
+ let parsed = Commit::from_bytes(bytes.as_bytes()).map_err(|e| {
+ repository::object::error::read::CommitError::Parse { oid, source: e }
+ })?;
+ Ok(Some(parsed))
+ }
+ None => Ok(None),
}
}
+
+ fn exists(&self, _oid: Oid) -> Result<bool, repository::object::error::read::ExistsError> {
+ unimplemented!("MockRepository::exists")
+ }
}
impl reference::Reader for MockRepository {
commit fb408ba1bb1170e7e01cd6f7e4720b4339f36d9a
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Tue Apr 14 12:43:49 2026 +0000
storage/git: impl git::repository traits for Repository
diff --git a/crates/radicle/src/storage/git.rs b/crates/radicle/src/storage/git.rs
index d3107a98a..bf8604926 100644
--- a/crates/radicle/src/storage/git.rs
+++ b/crates/radicle/src/storage/git.rs
@@ -1127,6 +1127,130 @@ impl sigrefs::git::reference::Writer for Repository {
}
}
+impl crate::git::repository::ObjectReader for Repository {
+ fn blob(
+ &self,
+ oid: Oid,
+ ) -> Result<Option<git::repository::Blob>, git::repository::object::error::read::BlobError>
+ {
+ crate::git::repository::ObjectReader::blob(&self.backend, oid)
+ }
+
+ fn blob_at<P>(
+ &self,
+ commit: Oid,
+ path: &P,
+ ) -> Result<Option<git::repository::Blob>, git::repository::object::error::read::BlobAtError>
+ where
+ P: AsRef<Path>,
+ {
+ crate::git::repository::ObjectReader::blob_at(&self.backend, commit, path)
+ }
+
+ fn commit(
+ &self,
+ oid: Oid,
+ ) -> Result<Option<git::repository::Commit>, git::repository::object::error::read::CommitError>
+ {
+ crate::git::repository::ObjectReader::commit(&self.backend, oid)
+ }
+
+ fn exists(&self, oid: Oid) -> Result<bool, git::repository::object::error::read::ExistsError> {
+ crate::git::repository::ObjectReader::exists(&self.backend, oid)
+ }
+}
+
+impl crate::git::repository::ObjectWriter for Repository {
+ fn write_blob(
+ &self,
+ content: &[u8],
+ ) -> Result<Oid, crate::git::repository::object::error::write::BlobError> {
+ crate::git::repository::ObjectWriter::write_blob(&self.backend, content)
+ }
+
+ fn write_tree(
+ &self,
+ entries: &[crate::git::repository::types::TreeEntry],
+ ) -> Result<Oid, crate::git::repository::object::error::write::TreeError> {
+ crate::git::repository::ObjectWriter::write_tree(&self.backend, entries)
+ }
+
+ fn write_commit(
+ &self,
+ bytes: &[u8],
+ ) -> Result<Oid, crate::git::repository::object::error::write::CommitError> {
+ crate::git::repository::ObjectWriter::write_commit(&self.backend, bytes)
+ }
+}
+
+impl crate::git::repository::RefWriter for Repository {
+ fn write_ref<R>(
+ &self,
+ name: &R,
+ target: crate::git::repository::RefTarget,
+ reflog: &str,
+ ) -> Result<(), crate::git::repository::reference::error::write::WriteRefError>
+ where
+ R: AsRef<git::fmt::RefStr>,
+ {
+ crate::git::repository::RefWriter::write_ref(&self.backend, name, target, reflog)
+ }
+
+ fn delete_ref<R>(
+ &self,
+ name: &R,
+ ) -> Result<(), crate::git::repository::reference::error::write::DeleteRefError>
+ where
+ R: AsRef<git::fmt::RefStr>,
+ {
+ crate::git::repository::RefWriter::delete_ref(&self.backend, name)
+ }
+}
+
+impl crate::git::repository::SymbolicRefWriter for Repository {
+ fn write_symbolic_ref<R>(
+ &self,
+ name: &R,
+ target: git::repository::SymbolicRefTarget,
+ reflog: &str,
+ ) -> Result<(), git::repository::reference::error::write::SymbolicWriteError>
+ where
+ R: AsRef<radicle_git_ref_format::RefStr>,
+ {
+ crate::git::repository::SymbolicRefWriter::write_symbolic_ref(
+ &self.backend,
+ name,
+ target,
+ reflog,
+ )
+ }
+}
+
+impl crate::git::repository::RefReader for Repository {
+ type References<'a> =
+ <git::raw::Repository as crate::git::repository::RefReader>::References<'a>;
+
+ fn ref_target<R>(
+ &self,
+ name: &R,
+ ) -> Result<Option<Oid>, crate::git::repository::reference::error::read::RefTargetError>
+ where
+ R: AsRef<git::fmt::RefStr>,
+ {
+ crate::git::repository::RefReader::ref_target(&self.backend, name)
+ }
+
+ fn list_refs<'a, P>(
+ &'a self,
+ pattern: &P,
+ ) -> Result<Self::References<'a>, crate::git::repository::reference::error::read::ListRefsError>
+ where
+ P: AsRef<git::fmt::refspec::PatternStr>,
+ {
+ crate::git::repository::RefReader::list_refs(&self.backend, pattern)
+ }
+}
+
pub mod trailers {
use std::str::FromStr;
Exit code: 0
shell: 'export RUSTDOCFLAGS=''-D warnings'' cargo --version rustc --version cargo fmt --check cargo clippy --all-targets --workspace -- --deny warnings cargo build --all-targets --workspace cargo doc --workspace --no-deps --all-features cargo test --workspace --no-fail-fast '
Commands:
$ podman run --name 66e08728-e436-43fb-b216-04cbff1bdac9 -v /opt/radcis/ci.rad.levitte.org/cci/state/66e08728-e436-43fb-b216-04cbff1bdac9/s:/66e08728-e436-43fb-b216-04cbff1bdac9/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/66e08728-e436-43fb-b216-04cbff1bdac9/w:/66e08728-e436-43fb-b216-04cbff1bdac9/w -w /66e08728-e436-43fb-b216-04cbff1bdac9/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /66e08728-e436-43fb-b216-04cbff1bdac9/s/script.sh
+ export 'RUSTDOCFLAGS=-D warnings'
+ RUSTDOCFLAGS='-D warnings'
+ cargo --version
info: syncing channel updates for '1.90-x86_64-unknown-linux-gnu'
info: latest update on 2025-09-18, rust version 1.90.0 (1159e78c4 2025-09-14)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-src'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-src'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'
cargo 1.90.0 (840b83a10 2025-07-30)
+ rustc --version
rustc 1.90.0 (1159e78c4 2025-09-14)
+ cargo fmt --check
+ cargo clippy --all-targets --workspace -- --deny warnings
Updating crates.io index
Downloading crates ...
Downloaded addr2line v0.25.1
Downloaded crc32fast v1.5.0
Downloaded gix-path v0.11.1
Downloaded icu_properties v2.1.2
Downloaded gix-revision v0.41.0
Downloaded git2 v0.20.4
Downloaded gix-commitgraph v0.33.0
Downloaded gix-glob v0.24.0
Downloaded icu_normalizer v2.1.1
Downloaded lazy_static v1.5.0
Downloaded hmac v0.12.1
Downloaded icu_provider v2.1.1
Downloaded is_terminal_polyfill v1.70.2
Downloaded humantime v2.3.0
Downloaded equivalent v1.0.2
Downloaded matchers v0.2.0
Downloaded keccak v0.1.6
Downloaded displaydoc v0.2.5
Downloaded icu_locale_core v2.1.1
Downloaded opaque-debug v0.3.1
Downloaded num-iter v0.1.45
Downloaded lock_api v0.4.14
Downloaded gix-utils v0.3.1
Downloaded num-cmp v0.1.0
Downloaded gix-error v0.1.0
Downloaded nonempty v0.9.0
Downloaded num v0.4.3
Downloaded pastey v0.2.1
Downloaded phf_shared v0.11.3
Downloaded num-complex v0.4.6
Downloaded pem-rfc7468 v0.7.0
Downloaded once_cell v1.21.4
Downloaded rfc6979 v0.4.0
Downloaded rand_core v0.9.5
Downloaded serde_fmt v1.1.0
Downloaded scopeguard v1.2.0
Downloaded salsa20 v0.10.2
Downloaded secrecy v0.10.3
Downloaded poly1305 v0.8.0
Downloaded semver v1.0.27
Downloaded shell-words v1.1.1
Downloaded rustversion v1.0.22
Downloaded siphasher v0.3.11
Downloaded test-log-macros v0.2.19
Downloaded socks5-client v0.4.1
Downloaded ssh-cipher v0.2.0
Downloaded serde_spanned v1.0.4
Downloaded ryu v1.0.23
Downloaded sval_json v2.17.0
Downloaded stable_deref_trait v1.2.1
Downloaded test-log v0.2.19
Downloaded tinyvec_macros v0.1.1
Downloaded ssh-encoding v0.2.0
Downloaded primeorder v0.13.6
Downloaded streaming-iterator v0.1.9
Downloaded sval_serde v2.17.0
Downloaded thread_local v1.1.9
Downloaded spin v0.9.8
Downloaded timeago v0.4.2
Downloaded ppv-lite86 v0.2.21
Downloaded unicode-display-width v0.3.0
Downloaded gix-protocol v0.57.0
Downloaded tree-sitter-toml-ng v0.6.0
Downloaded utf8parse v0.2.2
Downloaded value-bag-serde1 v1.12.0
Downloaded quote v1.0.45
Downloaded zerofrom v0.1.6
Downloaded tree-sitter-language v0.1.7
Downloaded unit-prefix v0.5.2
Downloaded gix-object v0.56.0
Downloaded zerofrom-derive v0.1.6
Downloaded referencing v0.30.0
Downloaded zerovec-derive v0.11.2
Downloaded walkdir v2.5.0
Downloaded zeroize v1.8.2
Downloaded indicatif v0.18.4
Downloaded value-bag v1.12.0
Downloaded yoke-derive v0.8.1
Downloaded thiserror-impl v2.0.18
Downloaded thiserror v2.0.18
Downloaded zerotrie v0.2.3
Downloaded tree-sitter-go v0.23.4
Downloaded yoke v0.8.1
Downloaded icu_normalizer_data v2.1.1
Downloaded jiff-static v0.2.23
Downloaded zmij v1.0.21
Downloaded thiserror-impl v1.0.69
Downloaded icu_collections v2.1.1
Downloaded zerovec v0.11.5
Downloaded tree-sitter v0.24.7
Downloaded tree-sitter-python v0.23.6
Downloaded winnow v0.7.15
Downloaded unicode-ident v1.0.24
Downloaded tree-sitter-c v0.23.4
Downloaded yansi v1.0.1
Downloaded zerocopy v0.8.42
Downloaded ssh-key v0.6.7
Downloaded p521 v0.13.3
Downloaded tree-sitter-md v0.3.2
Downloaded p384 v0.13.1
Downloaded tree-sitter-rust v0.23.3
Downloaded proptest v1.10.0
Downloaded rustix v1.1.4
Downloaded tree-sitter-bash v0.23.3
Downloaded zlib-rs v0.6.3
Downloaded vcpkg v0.2.15
Downloaded tracing v0.1.44
Downloaded unicode-width v0.2.2
Downloaded tree-sitter-ruby v0.23.1
Downloaded regex-automata v0.4.14
Downloaded syn v1.0.109
Downloaded tracing-subscriber v0.3.23
Downloaded sysinfo v0.37.2
Downloaded libc v0.2.183
Downloaded regex v1.12.3
Downloaded libm v0.2.16
Downloaded idna v1.1.0
Downloaded icu_properties_data v2.1.2
Downloaded hashbrown v0.16.1
Downloaded gimli v0.32.3
Downloaded jsonschema v0.30.0
Downloaded url v2.5.8
Downloaded sval v2.17.0
Downloaded regex-syntax v0.8.10
Downloaded tree-sitter-typescript v0.23.2
Downloaded tokio v1.50.0
Downloaded syn v2.0.117
Downloaded gix-pack v0.65.0
Downloaded typenum v1.19.0
Downloaded serde v1.0.228
Downloaded jiff v0.2.23
Downloaded schemars v1.2.1
Downloaded prodash v31.0.0
Downloaded object v0.37.3
Downloaded sha1-checked v0.10.0
Downloaded libz-sys v1.1.25
Downloaded tar v0.4.45
Downloaded sha3 v0.10.8
Downloaded mio v1.1.1
Downloaded toml v0.9.12+spec-1.1.0
Downloaded tinyvec v1.11.0
Downloaded pretty_assertions v1.4.1
Downloaded inquire v0.9.4
Downloaded flate2 v1.1.9
Downloaded itertools v0.14.0
Downloaded unicode-normalization v0.1.25
Downloaded toml_datetime v0.7.5+spec-1.1.0
Downloaded indexmap v2.13.0
Downloaded gix-transport v0.54.0
Downloaded fraction v0.15.3
Downloaded bstr v1.12.1
Downloaded unicode-segmentation v1.12.0
Downloaded systemd-journal-logger v2.2.2
Downloaded curve25519-dalek v4.1.3
Downloaded bloomy v1.2.0
Downloaded miniz_oxide v0.8.9
Downloaded uuid v1.22.0
Downloaded unarray v0.1.4
Downloaded tree-sitter-html v0.23.2
Downloaded tracing-log v0.2.0
Downloaded tinystr v0.8.2
Downloaded snapbox v0.4.17
Downloaded smallvec v1.15.1
Downloaded p256 v0.13.2
Downloaded portable-atomic v1.13.1
Downloaded chrono v0.4.44
Downloaded sha1 v0.10.6
Downloaded serde_json v1.0.149
Downloaded getrandom v0.4.2
Downloaded sval_nested v2.17.0
Downloaded value-bag-sval2 v1.12.0
Downloaded utf8_iter v1.0.4
Downloaded libgit2-sys v0.18.3+1.9.2
Downloaded tree-sitter-css v0.23.2
Downloaded tracing-core v0.1.36
Downloaded synstructure v0.13.2
Downloaded sval_buffer v2.17.0
Downloaded writeable v0.6.2
Downloaded vsimd v0.8.0
Downloaded gix-odb v0.75.0
Downloaded tree-sitter-json v0.24.8
Downloaded radicle-surf v0.27.1
Downloaded xattr v1.6.1
Downloaded wait-timeout v0.2.1
Downloaded version_check v0.9.5
Downloaded universal-hash v0.5.1
Downloaded uuid-simd v0.8.0
Downloaded tempfile v3.27.0
Downloaded typeid v1.0.3
Downloaded tree-sitter-highlight v0.24.7
Downloaded toml_writer v1.0.7+spec-1.1.0
Downloaded sha2 v0.10.9
Downloaded pkcs1 v0.7.5
Downloaded getrandom v0.3.4
Downloaded thiserror v1.0.69
Downloaded ssh-agent-lib v0.5.2
Downloaded socket2 v0.5.10
Downloaded signals_receipts v0.2.5
Downloaded sharded-slab v0.1.7
Downloaded similar v2.7.0
Downloaded signal-hook v0.3.18
Downloaded rand v0.9.2
Downloaded sval_ref v2.17.0
Downloaded subtle v2.6.1
Downloaded serde_derive v1.0.228
Downloaded rsa v0.9.10
Downloaded potential_utf v0.1.4
Downloaded parking_lot_core v0.9.12
Downloaded litemap v0.8.1
Downloaded rand v0.8.5
Downloaded num-rational v0.4.2
Downloaded num-bigint-dig v0.8.6
Downloaded sval_dynamic v2.17.0
Downloaded sval_fmt v2.17.0
Downloaded sqlite3-sys v0.18.0
Downloaded spki v0.7.3
Downloaded parking_lot v0.12.5
Downloaded structured-logger v1.0.5
Downloaded strsim v0.11.1
Downloaded sqlite v0.37.0
Downloaded snapbox-macros v0.3.10
Downloaded siphasher v1.0.2
Downloaded signal-hook-registry v1.4.8
Downloaded shlex v1.3.0
Downloaded serde_core v1.0.228
Downloaded qcheck v1.0.0
Downloaded phf v0.11.3
Downloaded gix-diff v0.58.0
Downloaded simd-adler32 v0.3.8
Downloaded signature v1.6.4
Downloaded gix-error v0.0.0
Downloaded signature v2.2.0
Downloaded sqlite3-src v0.7.0
Downloaded fluent-uri v0.3.2
Downloaded cyphernet v0.5.2
Downloaded crossterm v0.29.0
Downloaded signal-hook-mio v0.2.5
Downloaded serde_derive_internals v0.29.1
Downloaded schemars_derive v1.2.1
Downloaded serde-untagged v0.1.9
Downloaded sem_safe v0.2.1
Downloaded sec1 v0.7.3
Downloaded same-file v1.0.6
Downloaded ref-cast v1.0.25
Downloaded qcheck-macros v1.0.0
Downloaded proc-macro2 v1.0.106
Downloaded num-bigint v0.4.6
Downloaded aes-gcm v0.10.3
Downloaded rusty-fork v0.3.1
Downloaded rustc-demangle v0.1.27
Downloaded ref-cast-impl v1.0.25
Downloaded quick-error v1.2.3
Downloaded pin-project-lite v0.2.17
Downloaded memchr v2.8.0
Downloaded emojis v0.6.4
Downloaded rustc_version v0.4.1
Downloaded rand_chacha v0.9.0
Downloaded proc-macro-error2 v2.0.1
Downloaded proc-macro-error-attr2 v2.0.0
Downloaded iana-time-zone v0.1.65
Downloaded aes v0.8.4
Downloaded radicle-std-ext v0.2.0
Downloaded radicle-git-ext v0.12.0
Downloaded scrypt v0.11.0
Downloaded linux-raw-sys v0.12.1
Downloaded pbkdf2 v0.12.2
Downloaded gix-ref v0.59.0
Downloaded jobserver v0.1.34
Downloaded rand_xorshift v0.4.0
Downloaded rand_core v0.6.4
Downloaded rand_chacha v0.3.1
Downloaded polyval v0.6.2
Downloaded pkg-config v0.3.32
Downloaded pkcs8 v0.10.2
Downloaded heck v0.5.0
Downloaded group v0.13.0
Downloaded num-traits v0.2.19
Downloaded gix-url v0.35.2
Downloaded gix-fs v0.19.1
Downloaded gix-date v0.13.0
Downloaded der v0.7.10
Downloaded clap_builder v4.6.0
Downloaded bytes v1.11.1
Downloaded aho-corasick v1.1.4
Downloaded num-integer v0.1.46
Downloaded memmap2 v0.9.10
Downloaded human-panic v2.0.6
Downloaded fancy-regex v0.14.0
Downloaded lexopt v0.3.2
Downloaded gix-chunk v0.5.0
Downloaded crossbeam-channel v0.5.15
Downloaded percent-encoding v2.3.2
Downloaded ed25519-dalek v2.2.0
Downloaded derive_more-impl v2.1.1
Downloaded outref v0.5.2
Downloaded nu-ansi-term v0.50.3
Downloaded match-lookup v0.1.2
Downloaded cc v1.2.57
Downloaded escargot v0.5.15
Downloaded gix-traverse v0.52.0
Downloaded gix-packetline v0.21.1
Downloaded gix-shallow v0.8.1
Downloaded gix-revwalk v0.27.0
Downloaded fastrand v2.3.0
Downloaded derive_more v2.1.1
Downloaded chacha20poly1305 v0.10.1
Downloaded arc-swap v1.8.2
Downloaded hash32 v0.3.1
Downloaded git-ref-format v0.6.0
Downloaded generic-array v0.14.7
Downloaded crossbeam-utils v0.8.21
Downloaded colored v2.2.0
Downloaded multibase v0.9.2
Downloaded log v0.4.29
Downloaded litrs v1.0.0
Downloaded form_urlencoded v1.2.2
Downloaded fast-glob v0.3.3
Downloaded ctr v0.9.2
Downloaded cbc v0.1.2
Downloaded bit-vec v0.8.0
Downloaded base64ct v1.8.3
Downloaded anyhow v1.0.102
Downloaded amplify_derive v4.0.1
Downloaded normalize-line-endings v0.3.0
Downloaded noise-framework v0.4.0
Downloaded maybe-async v0.2.10
Downloaded inout v0.1.4
Downloaded gix-validate v0.11.0
Downloaded gix-actor v0.38.0
Downloaded fnv v1.0.7
Downloaded erased-serde v0.4.10
Downloaded elliptic-curve v0.13.8
Downloaded console v0.16.3
Downloaded clap_complete v4.6.0
Downloaded bytesize v2.3.1
Downloaded anstyle-parse v1.0.0
Downloaded amplify_num v0.5.3
Downloaded amplify v4.9.0
Downloaded gix-revwalk v0.26.0
Downloaded gix-object v0.55.0
Downloaded gix-config-value v0.17.1
Downloaded ghash v0.5.1
Downloaded ec25519 v0.1.0
Downloaded dunce v1.0.5
Downloaded convert_case v0.10.0
Downloaded blowfish v0.9.1
Downloaded anstyle-parse v0.2.7
Downloaded email_address v0.2.9
Downloaded either v1.15.0
Downloaded digest v0.10.7
Downloaded byteorder v1.5.0
Downloaded bytecount v0.6.9
Downloaded anstream v1.0.0
Downloaded anstream v0.6.21
Downloaded itoa v1.0.17
Downloaded gix-prompt v0.13.1
Downloaded document-features v0.2.12
Downloaded data-encoding-macro-internal v0.1.17
Downloaded borrow-or-share v0.2.4
Downloaded env_filter v1.0.0
Downloaded curve25519-dalek-derive v0.1.1
Downloaded crypto-common v0.1.7
Downloaded clap_lex v1.1.0
Downloaded chacha20 v0.9.1
Downloaded block-buffer v0.10.4
Downloaded gix-date v0.14.0
Downloaded filetime v0.2.27
Downloaded ff v0.13.1
Downloaded ed25519 v2.2.3
Downloaded ed25519 v1.5.3
Downloaded data-encoding v2.10.0
Downloaded cipher v0.4.4
Downloaded base64 v0.21.7
Downloaded amplify_syn v2.0.1
Downloaded aead v0.5.2
Downloaded adler2 v2.0.1
Downloaded idna_adapter v1.2.1
Downloaded gix-sec v0.13.1
Downloaded gix-refspec v0.37.0
Downloaded gix-negotiate v0.27.0
Downloaded gix-lock v21.0.1
Downloaded gix-hashtable v0.12.0
Downloaded git-ref-format-core v0.6.0
Downloaded colorchoice v1.0.5
Downloaded base32 v0.4.0
Downloaded gix-quote v0.6.2
Downloaded git-ref-format-macro v0.6.0
Downloaded getrandom v0.2.17
Downloaded errno v0.3.14
Downloaded ecdsa v0.16.9
Downloaded crypto-bigint v0.5.5
Downloaded bitflags v2.11.0
Downloaded base16ct v0.2.0
Downloaded anstyle v1.0.14
Downloaded gix-features v0.46.1
Downloaded gix-chunk v0.6.0
Downloaded gix-actor v0.39.0
Downloaded faster-hex v0.10.0
Downloaded block-padding v0.3.3
Downloaded heapless v0.8.0
Downloaded gix-trace v0.1.18
Downloaded gix-tempfile v21.0.1
Downloaded gix-hash v0.22.1
Downloaded gix-credentials v0.36.0
Downloaded gix-command v0.7.1
Downloaded find-msvc-tools v0.1.9
Downloaded ct-codecs v1.1.6
Downloaded clap v4.6.0
Downloaded base256emoji v1.0.2
Downloaded base-x v0.2.11
Downloaded env_logger v0.11.9
Downloaded diff v0.1.13
Downloaded cyphergraphy v0.3.0
Downloaded cypheraddr v0.4.0
Downloaded base64 v0.22.1
Downloaded backtrace v0.3.76
Downloaded dyn-clone v1.0.20
Downloaded data-encoding-macro v0.1.19
Downloaded bit-set v0.8.0
Downloaded bcrypt-pbkdf v0.10.0
Downloaded ahash v0.8.12
Downloaded gix-commitgraph v0.32.0
Downloaded cpufeatures v0.2.17
Downloaded const-str v0.4.3
Downloaded const-oid v0.9.6
Downloaded clap_derive v4.6.0
Downloaded cfg-if v1.0.4
Downloaded autocfg v1.5.0
Downloaded ascii v1.1.0
Downloaded anstyle-query v1.1.5
Compiling libc v0.2.183
Compiling proc-macro2 v1.0.106
Compiling quote v1.0.45
Compiling unicode-ident v1.0.24
Checking cfg-if v1.0.4
Checking zeroize v1.8.2
Compiling version_check v0.9.5
Compiling typenum v1.19.0
Compiling generic-array v0.14.7
Checking memchr v2.8.0
Compiling syn v2.0.117
Checking getrandom v0.2.17
Checking rand_core v0.6.4
Checking subtle v2.6.1
Checking crypto-common v0.1.7
Compiling shlex v1.3.0
Compiling find-msvc-tools v0.1.9
Compiling jobserver v0.1.34
Checking regex-syntax v0.8.10
Checking aho-corasick v1.1.4
Compiling cc v1.2.57
Checking const-oid v0.9.6
Checking smallvec v1.15.1
Compiling serde_core v1.0.228
Checking regex-automata v0.4.14
Checking block-buffer v0.10.4
Checking digest v0.10.7
Checking cpufeatures v0.2.17
Compiling thiserror v2.0.18
Checking stable_deref_trait v1.2.1
Checking fastrand v2.3.0
Compiling parking_lot_core v0.9.12
Checking scopeguard v1.2.0
Checking lock_api v0.4.14
Checking tinyvec_macros v0.1.1
Checking tinyvec v1.11.0
Checking parking_lot v0.12.5
Checking gix-trace v0.1.18
Compiling crc32fast v1.5.0
Checking bitflags v2.11.0
Checking unicode-normalization v0.1.25
Checking byteorder v1.5.0
Checking bstr v1.12.1
Checking itoa v1.0.17
Compiling typeid v1.0.3
Checking gix-utils v0.3.1
Checking gix-validate v0.11.0
Compiling erased-serde v0.4.10
Checking hashbrown v0.16.1
Compiling serde v1.0.228
Checking same-file v1.0.6
Checking walkdir v2.5.0
Compiling thiserror-impl v2.0.18
Compiling serde_derive v1.0.228
Checking prodash v31.0.0
Checking zlib-rs v0.6.3
Checking serde_fmt v1.1.0
Compiling heapless v0.8.0
Checking value-bag-serde1 v1.12.0
Checking hash32 v0.3.1
Compiling synstructure v0.13.2
Checking gix-path v0.11.1
Checking gix-features v0.46.1
Checking value-bag v1.12.0
Compiling zerofrom-derive v0.1.6
Checking faster-hex v0.10.0
Checking log v0.4.29
Compiling yoke-derive v0.8.1
Checking sha1 v0.10.6
Checking sha1-checked v0.10.0
Compiling rustix v1.1.4
Compiling pkg-config v0.3.32
Checking zerofrom v0.1.6
Checking yoke v0.8.1
Checking gix-hash v0.22.1
Compiling zerovec-derive v0.11.2
Checking block-padding v0.3.3
Compiling libm v0.2.16
Checking linux-raw-sys v0.12.1
Compiling zerocopy v0.8.42
Compiling autocfg v1.5.0
Checking inout v0.1.4
Compiling displaydoc v0.2.5
Compiling num-traits v0.2.19
Checking zerovec v0.11.5
Checking sha2 v0.10.9
Compiling getrandom v0.4.2
Checking cipher v0.4.4
Checking tinystr v0.8.2
Checking der v0.7.10
Checking writeable v0.6.2
Checking once_cell v1.21.4
Checking percent-encoding v2.3.2
Checking litemap v0.8.1
Checking potential_utf v0.1.4
Checking zerotrie v0.2.3
Checking icu_locale_core v2.1.1
Compiling icu_properties_data v2.1.2
Compiling zmij v1.0.21
Compiling icu_normalizer_data v2.1.1
Compiling thiserror v1.0.69
Compiling syn v1.0.109
Checking icu_provider v2.1.1
Checking icu_collections v2.1.1
Compiling thiserror-impl v1.0.69
Compiling serde_json v1.0.149
Checking equivalent v1.0.2
Checking indexmap v2.13.0
Checking ppv-lite86 v0.2.21
Checking num-integer v0.1.46
Checking hmac v0.12.1
Checking universal-hash v0.5.1
Compiling vcpkg v0.2.15
Compiling tree-sitter-language v0.1.7
Compiling ref-cast v1.0.25
Checking opaque-debug v0.3.1
Checking icu_normalizer v2.1.1
Compiling libz-sys v1.1.25
Checking icu_properties v2.1.2
Checking tempfile v3.27.0
Checking spki v0.7.3
Compiling ref-cast-impl v1.0.25
Checking signature v2.2.0
Checking ff v0.13.1
Checking base16ct v0.2.0
Checking spin v0.9.8
Checking lazy_static v1.5.0
Checking idna_adapter v1.2.1
Checking sec1 v0.7.3
Checking group v0.13.0
Checking rand_chacha v0.3.1
Checking crypto-bigint v0.5.5
Checking utf8_iter v1.0.4
Checking dyn-clone v1.0.20
Checking rand v0.8.5
Checking idna v1.1.0
Compiling amplify_syn v2.0.1
Checking num-iter v0.1.45
Compiling libgit2-sys v0.18.3+1.9.2
Checking aead v0.5.2
Compiling semver v1.0.27
Checking signature v1.6.4
Compiling amplify_derive v4.0.1
Checking ed25519 v1.5.3
Checking elliptic-curve v0.13.8
Compiling rustc_version v0.4.1
Checking poly1305 v0.8.0
Checking rfc6979 v0.4.0
Checking form_urlencoded v1.2.2
Checking chacha20 v0.9.1
Compiling serde_derive_internals v0.29.1
Checking ascii v1.1.0
Checking ct-codecs v1.1.6
Checking amplify_num v0.5.3
Compiling schemars_derive v1.2.1
Checking ec25519 v0.1.0
Checking url v2.5.8
Checking amplify v4.9.0
Checking ecdsa v0.16.9
Compiling curve25519-dalek v4.1.3
Checking primeorder v0.13.6
Checking git-ref-format-core v0.6.0
Checking polyval v0.6.2
Checking base64ct v1.8.3
Compiling num-bigint-dig v0.8.6
Checking ghash v0.5.1
Checking schemars v1.2.1
Checking pem-rfc7468 v0.7.0
Checking cyphergraphy v0.3.0
Checking pkcs8 v0.10.2
Checking pbkdf2 v0.12.2
Checking aes v0.8.4
Checking ctr v0.9.2
Compiling sqlite3-src v0.7.0
Compiling curve25519-dalek-derive v0.1.1
Checking keccak v0.1.6
Checking sha3 v0.10.8
Checking aes-gcm v0.10.3
Checking pkcs1 v0.7.5
Checking ssh-encoding v0.2.0
Checking ed25519 v2.2.3
Checking blowfish v0.9.1
Checking cbc v0.1.2
Compiling data-encoding v2.10.0
Checking base32 v0.4.0
Checking cypheraddr v0.4.0
Checking rsa v0.9.10
Compiling data-encoding-macro-internal v0.1.17
Checking ssh-cipher v0.2.0
Checking bcrypt-pbkdf v0.10.0
Checking ed25519-dalek v2.2.0
Checking p521 v0.13.3
Checking p256 v0.13.2
Checking p384 v0.13.1
Checking chacha20poly1305 v0.10.1
Checking qcheck v1.0.0
Compiling match-lookup v0.1.2
Checking jiff v0.2.23
Checking const-str v0.4.3
Checking base256emoji v1.0.2
Checking data-encoding-macro v0.1.19
Checking noise-framework v0.4.0
Checking ssh-key v0.6.7
Checking socks5-client v0.4.1
Checking secrecy v0.10.3
Checking base-x v0.2.11
Compiling crossbeam-utils v0.8.21
Checking multibase v0.9.2
Checking ssh-agent-lib v0.5.2
Checking cyphernet v0.5.2
Checking winnow v0.7.15
Checking crossbeam-channel v0.5.15
Checking anstyle-query v1.1.5
Checking utf8parse v0.2.2
Checking nonempty v0.9.0
Checking gix-hashtable v0.12.0
Checking siphasher v1.0.2
Checking radicle-git-metadata v0.2.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-git-metadata)
Checking gix-error v0.1.0
Checking radicle-dag v0.10.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-dag)
Checking memmap2 v0.9.10
Checking is_terminal_polyfill v1.70.2
Checking anstyle v1.0.14
Checking colorchoice v1.0.5
Checking radicle-git-ref-format v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-git-ref-format)
Checking iana-time-zone v0.1.65
Checking base64 v0.21.7
Compiling radicle v0.23.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle)
Checking chrono v0.4.44
Checking radicle-localtime v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-localtime)
Checking colored v2.2.0
Checking serde-untagged v0.1.9
Checking gix-error v0.0.0
Checking bytesize v2.3.1
Checking errno v0.3.14
Checking fast-glob v0.3.3
Checking dunce v1.0.5
Checking gix-date v0.14.0
Checking anstyle-parse v0.2.7
Checking anstream v0.6.21
Checking gix-actor v0.39.0
Checking gix-date v0.13.0
Checking gix-fs v0.19.1
Checking gix-actor v0.38.0
Checking gix-tempfile v21.0.1
Checking gix-object v0.56.0
Checking gix-chunk v0.6.0
Checking gix-quote v0.6.2
Checking gix-commitgraph v0.33.0
Checking gix-object v0.55.0
Checking gix-chunk v0.5.0
Checking mio v1.1.1
Checking sem_safe v0.2.1
Checking either v1.15.0
Checking shell-words v1.1.1
Checking gix-command v0.7.1
Checking signals_receipts v0.2.5
Checking gix-commitgraph v0.32.0
Checking gix-revwalk v0.27.0
Compiling rustversion v1.0.22
Compiling object v0.37.3
Checking gix-revwalk v0.26.0
Checking gix-lock v21.0.1
Checking gix-url v0.35.2
Checking gix-config-value v0.17.1
Checking gix-sec v0.13.1
Checking adler2 v2.0.1
Compiling signal-hook v0.3.18
Compiling unicode-segmentation v1.12.0
Checking gimli v0.32.3
Compiling convert_case v0.10.0
Checking miniz_oxide v0.8.9
Checking gix-prompt v0.13.1
Checking gix-traverse v0.52.0
Checking addr2line v0.25.1
Checking gix-revision v0.41.0
Checking radicle-signals v0.11.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-signals)
Checking gix-diff v0.58.0
Checking signal-hook-registry v1.4.8
Checking gix-packetline v0.21.1
Checking gix-glob v0.24.0
Compiling tree-sitter v0.24.7
Checking rustc-demangle v0.1.27
Compiling anyhow v1.0.102
Checking backtrace v0.3.76
Checking gix-refspec v0.37.0
Checking gix-transport v0.54.0
Checking gix-pack v0.65.0
Checking arc-swap v1.8.2
Checking gix-credentials v0.36.0
Compiling derive_more-impl v2.1.1
Checking gix-shallow v0.8.1
Checking gix-ref v0.59.0
Checking gix-negotiate v0.27.0
Compiling maybe-async v0.2.10
Checking regex v1.12.3
Compiling proc-macro-error-attr2 v2.0.0
Checking unicode-width v0.2.2
Compiling litrs v1.0.0
Compiling simd-adler32 v0.3.8
Compiling getrandom v0.3.4
Compiling portable-atomic v1.13.1
Compiling document-features v0.2.12
Compiling proc-macro-error2 v2.0.1
Checking gix-protocol v0.57.0
Checking derive_more v2.1.1
Checking gix-odb v0.75.0
Checking signal-hook-mio v0.2.5
Compiling xattr v1.6.1
Compiling filetime v0.2.27
Checking anstyle-parse v1.0.0
Checking uuid v1.22.0
Checking bytes v1.11.1
Checking anstream v1.0.0
Compiling flate2 v1.1.9
Compiling tar v0.4.45
Checking crossterm v0.29.0
Compiling git-ref-format-macro v0.6.0
Checking console v0.16.3
Checking snapbox-macros v0.3.10
Checking salsa20 v0.10.2
Checking siphasher v0.3.11
Checking streaming-iterator v0.1.9
Compiling heck v0.5.0
Checking clap_lex v1.1.0
Checking similar v2.7.0
Checking unit-prefix v0.5.2
Checking strsim v0.11.1
Checking normalize-line-endings v0.3.0
Checking clap_builder v4.6.0
Checking snapbox v0.4.17
Checking indicatif v0.18.4
Compiling clap_derive v4.6.0
Checking sqlite3-sys v0.18.0
Checking sqlite v0.37.0
Checking radicle-crypto v0.16.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-crypto)
Checking bloomy v1.2.0
Checking scrypt v0.11.0
Compiling radicle-surf v0.27.1
Checking git-ref-format v0.6.0
Checking inquire v0.9.4
Checking unicode-display-width v0.3.0
Checking systemd-journal-logger v2.2.2
Checking toml_datetime v0.7.5+spec-1.1.0
Checking serde_spanned v1.0.4
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-c v0.23.4
Compiling tree-sitter-rust v0.23.3
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-python v0.23.6
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-css v0.23.2
Checking pin-project-lite v0.2.17
Checking radicle-std-ext v0.2.0
Checking toml_writer v1.0.7+spec-1.1.0
Checking tokio v1.50.0
Checking toml v0.9.12+spec-1.1.0
Checking clap v4.6.0
Checking sysinfo v0.37.2
Checking yansi v1.0.1
Compiling radicle-node v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-node)
Checking diff v0.1.13
Compiling radicle-cli v0.20.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cli)
Checking pretty_assertions v1.4.1
Checking human-panic v2.0.6
Checking clap_complete v4.6.0
Checking structured-logger v1.0.5
Checking radicle-systemd v0.12.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-systemd)
Checking tree-sitter-highlight v0.24.7
Checking itertools v0.14.0
Compiling qcheck-macros v1.0.0
Checking socket2 v0.5.10
Checking humantime v2.3.0
Compiling escargot v0.5.15
Checking lexopt v0.3.2
Checking timeago v0.4.2
Checking bit-vec v0.8.0
Checking bit-set v0.8.0
Checking rand_core v0.9.5
Checking num-bigint v0.4.6
Compiling ahash v0.8.12
Checking num-complex v0.4.6
Checking env_filter v1.0.0
Checking borrow-or-share v0.2.4
Checking env_logger v0.11.9
Checking fluent-uri v0.3.2
Checking phf_shared v0.11.3
Checking num-rational v0.4.2
Compiling test-log-macros v0.2.19
Checking wait-timeout v0.2.1
Checking quick-error v1.2.3
Checking num v0.4.3
Checking outref v0.5.2
Checking vsimd v0.8.0
Checking fnv v1.0.7
Compiling radicle-remote-helper v0.16.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-remote-helper)
Checking rusty-fork v0.3.1
Checking test-log v0.2.19
Checking fraction v0.15.3
Checking uuid-simd v0.8.0
Checking phf v0.11.3
Checking referencing v0.30.0
Checking rand_xorshift v0.4.0
Checking rand_chacha v0.9.0
Checking rand v0.9.2
Checking fancy-regex v0.14.0
Checking email_address v0.2.9
Checking base64 v0.22.1
Checking num-cmp v0.1.0
Checking unarray v0.1.4
Checking bytecount v0.6.9
Checking proptest v1.10.0
Checking emojis v0.6.4
Checking jsonschema v0.30.0
Compiling pastey v0.2.1
Checking radicle-windows v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-windows)
Checking git2 v0.20.4
Checking radicle-oid v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-oid)
Checking radicle-git-ext v0.12.0
Checking radicle-term v0.17.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-term)
Checking radicle-cob v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cob)
Checking radicle-core v0.2.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-core)
Checking radicle-fetch v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-fetch)
Checking radicle-cli-test v0.13.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cli-test)
Checking radicle-schemars v0.7.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-schemars)
Checking radicle-protocol v0.7.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-protocol)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 46.39s
+ cargo build --all-targets --workspace
Compiling libc v0.2.183
Compiling cfg-if v1.0.4
Compiling zeroize v1.8.2
Compiling typenum v1.19.0
Compiling memchr v2.8.0
Compiling subtle v2.6.1
Compiling shlex v1.3.0
Compiling regex-syntax v0.8.10
Compiling generic-array v0.14.7
Compiling aho-corasick v1.1.4
Compiling getrandom v0.2.17
Compiling rand_core v0.6.4
Compiling crypto-common v0.1.7
Compiling jobserver v0.1.34
Compiling const-oid v0.9.6
Compiling cc v1.2.57
Compiling smallvec v1.15.1
Compiling serde_core v1.0.228
Compiling regex-automata v0.4.14
Compiling block-buffer v0.10.4
Compiling digest v0.10.7
Compiling cpufeatures v0.2.17
Compiling stable_deref_trait v1.2.1
Compiling thiserror v2.0.18
Compiling fastrand v2.3.0
Compiling scopeguard v1.2.0
Compiling lock_api v0.4.14
Compiling parking_lot_core v0.9.12
Compiling bitflags v2.11.0
Compiling parking_lot v0.12.5
Compiling tinyvec_macros v0.1.1
Compiling gix-trace v0.1.18
Compiling tinyvec v1.11.0
Compiling byteorder v1.5.0
Compiling crc32fast v1.5.0
Compiling unicode-normalization v0.1.25
Compiling itoa v1.0.17
Compiling typeid v1.0.3
Compiling hashbrown v0.16.1
Compiling same-file v1.0.6
Compiling gix-utils v0.3.1
Compiling walkdir v2.5.0
Compiling erased-serde v0.4.10
Compiling prodash v31.0.0
Compiling zlib-rs v0.6.3
Compiling serde v1.0.228
Compiling bstr v1.12.1
Compiling serde_fmt v1.1.0
Compiling value-bag-serde1 v1.12.0
Compiling gix-validate v0.11.0
Compiling gix-path v0.11.1
Compiling hash32 v0.3.1
Compiling heapless v0.8.0
Compiling value-bag v1.12.0
Compiling faster-hex v0.10.0
Compiling log v0.4.29
Compiling zerofrom v0.1.6
Compiling sha1 v0.10.6
Compiling sha1-checked v0.10.0
Compiling yoke v0.8.1
Compiling block-padding v0.3.3
Compiling linux-raw-sys v0.12.1
Compiling zerovec v0.11.5
Compiling inout v0.1.4
Compiling gix-features v0.46.1
Compiling sha2 v0.10.9
Compiling gix-hash v0.22.1
Compiling cipher v0.4.4
Compiling libm v0.2.16
Compiling rustix v1.1.4
Compiling zerocopy v0.8.42
Compiling getrandom v0.4.2
Compiling tinystr v0.8.2
Compiling der v0.7.10
Compiling num-traits v0.2.19
Compiling litemap v0.8.1
Compiling writeable v0.6.2
Compiling percent-encoding v2.3.2
Compiling once_cell v1.21.4
Compiling icu_locale_core v2.1.1
Compiling zerotrie v0.2.3
Compiling potential_utf v0.1.4
Compiling icu_collections v2.1.1
Compiling icu_provider v2.1.1
Compiling equivalent v1.0.2
Compiling indexmap v2.13.0
Compiling zmij v1.0.21
Compiling icu_normalizer_data v2.1.1
Compiling icu_properties_data v2.1.2
Compiling num-integer v0.1.46
Compiling hmac v0.12.1
Compiling universal-hash v0.5.1
Compiling opaque-debug v0.3.1
Compiling libz-sys v1.1.25
Compiling thiserror v1.0.69
Compiling serde_json v1.0.149
Compiling icu_properties v2.1.2
Compiling ppv-lite86 v0.2.21
Compiling icu_normalizer v2.1.1
Compiling tempfile v3.27.0
Compiling spki v0.7.3
Compiling signature v2.2.0
Compiling ff v0.13.1
Compiling base16ct v0.2.0
Compiling spin v0.9.8
Compiling sec1 v0.7.3
Compiling lazy_static v1.5.0
Compiling group v0.13.0
Compiling ref-cast v1.0.25
Compiling idna_adapter v1.2.1
Compiling rand_chacha v0.3.1
Compiling crypto-bigint v0.5.5
Compiling dyn-clone v1.0.20
Compiling utf8_iter v1.0.4
Compiling rand v0.8.5
Compiling idna v1.1.0
Compiling num-iter v0.1.45
Compiling libgit2-sys v0.18.3+1.9.2
Compiling aead v0.5.2
Compiling signature v1.6.4
Compiling ed25519 v1.5.3
Compiling poly1305 v0.8.0
Compiling rfc6979 v0.4.0
Compiling elliptic-curve v0.13.8
Compiling form_urlencoded v1.2.2
Compiling chacha20 v0.9.1
Compiling ct-codecs v1.1.6
Compiling ascii v1.1.0
Compiling amplify_num v0.5.3
Compiling ec25519 v0.1.0
Compiling ecdsa v0.16.9
Compiling primeorder v0.13.6
Compiling url v2.5.8
Compiling git-ref-format-core v0.6.0
Compiling polyval v0.6.2
Compiling amplify v4.9.0
Compiling base64ct v1.8.3
Compiling pem-rfc7468 v0.7.0
Compiling cyphergraphy v0.3.0
Compiling ghash v0.5.1
Compiling schemars v1.2.1
Compiling pkcs8 v0.10.2
Compiling pbkdf2 v0.12.2
Compiling ctr v0.9.2
Compiling aes v0.8.4
Compiling sqlite3-src v0.7.0
Compiling keccak v0.1.6
Compiling aes-gcm v0.10.3
Compiling sha3 v0.10.8
Compiling curve25519-dalek v4.1.3
Compiling pkcs1 v0.7.5
Compiling ssh-encoding v0.2.0
Compiling num-bigint-dig v0.8.6
Compiling ed25519 v2.2.3
Compiling cbc v0.1.2
Compiling blowfish v0.9.1
Compiling base32 v0.4.0
Compiling cypheraddr v0.4.0
Compiling rsa v0.9.10
Compiling bcrypt-pbkdf v0.10.0
Compiling ssh-cipher v0.2.0
Compiling ed25519-dalek v2.2.0
Compiling p256 v0.13.2
Compiling p384 v0.13.1
Compiling p521 v0.13.3
Compiling chacha20poly1305 v0.10.1
Compiling qcheck v1.0.0
Compiling jiff v0.2.23
Compiling const-str v0.4.3
Compiling data-encoding v2.10.0
Compiling data-encoding-macro v0.1.19
Compiling base256emoji v1.0.2
Compiling ssh-key v0.6.7
Compiling noise-framework v0.4.0
Compiling socks5-client v0.4.1
Compiling secrecy v0.10.3
Compiling base-x v0.2.11
Compiling multibase v0.9.2
Compiling ssh-agent-lib v0.5.2
Compiling cyphernet v0.5.2
Compiling crossbeam-utils v0.8.21
Compiling winnow v0.7.15
Compiling crossbeam-channel v0.5.15
Compiling anstyle-query v1.1.5
Compiling utf8parse v0.2.2
Compiling gix-hashtable v0.12.0
Compiling nonempty v0.9.0
Compiling siphasher v1.0.2
Compiling gix-error v0.1.0
Compiling radicle-dag v0.10.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-dag)
Compiling radicle-git-metadata v0.2.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-git-metadata)
Compiling memmap2 v0.9.10
Compiling anstyle v1.0.14
Compiling is_terminal_polyfill v1.70.2
Compiling colorchoice v1.0.5
Compiling radicle-git-ref-format v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-git-ref-format)
Compiling base64 v0.21.7
Compiling radicle v0.23.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle)
Compiling iana-time-zone v0.1.65
Compiling chrono v0.4.44
Compiling radicle-localtime v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-localtime)
Compiling colored v2.2.0
Compiling tree-sitter-language v0.1.7
Compiling gix-error v0.0.0
Compiling serde-untagged v0.1.9
Compiling bytesize v2.3.1
Compiling errno v0.3.14
Compiling dunce v1.0.5
Compiling fast-glob v0.3.3
Compiling gix-date v0.14.0
Compiling anstyle-parse v0.2.7
Compiling adler2 v2.0.1
Compiling gix-actor v0.39.0
Compiling anstream v0.6.21
Compiling gix-date v0.13.0
Compiling gix-fs v0.19.1
Compiling gix-tempfile v21.0.1
Compiling gix-actor v0.38.0
Compiling gix-object v0.56.0
Compiling gix-chunk v0.6.0
Compiling gix-quote v0.6.2
Compiling gix-commitgraph v0.33.0
Compiling gix-object v0.55.0
Compiling gix-chunk v0.5.0
Compiling mio v1.1.1
Compiling sem_safe v0.2.1
Compiling either v1.15.0
Compiling shell-words v1.1.1
Compiling gix-command v0.7.1
Compiling signals_receipts v0.2.5
Compiling gix-commitgraph v0.32.0
Compiling gix-revwalk v0.27.0
Compiling unicode-segmentation v1.12.0
Compiling gix-revwalk v0.26.0
Compiling gix-lock v21.0.1
Compiling gix-url v0.35.2
Compiling gix-config-value v0.17.1
Compiling gix-sec v0.13.1
Compiling gimli v0.32.3
Compiling gix-prompt v0.13.1
Compiling gix-traverse v0.52.0
Compiling convert_case v0.10.0
Compiling object v0.37.3
Compiling addr2line v0.25.1
Compiling gix-revision v0.41.0
Compiling radicle-signals v0.11.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-signals)
Compiling gix-diff v0.58.0
Compiling miniz_oxide v0.8.9
Compiling signal-hook-registry v1.4.8
Compiling gix-glob v0.24.0
Compiling gix-packetline v0.21.1
Compiling tree-sitter v0.24.7
Compiling rustc-demangle v0.1.27
Compiling backtrace v0.3.76
Compiling sqlite3-sys v0.18.0
Compiling sqlite v0.37.0
Compiling radicle-crypto v0.16.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-crypto)
Compiling gix-transport v0.54.0
Compiling gix-refspec v0.37.0
Compiling signal-hook v0.3.18
Compiling gix-pack v0.65.0
Compiling arc-swap v1.8.2
Compiling derive_more-impl v2.1.1
Compiling gix-credentials v0.36.0
Compiling gix-ref v0.59.0
Compiling gix-shallow v0.8.1
Compiling gix-negotiate v0.27.0
Compiling regex v1.12.3
Compiling unicode-width v0.2.2
Compiling gix-protocol v0.57.0
Compiling gix-odb v0.75.0
Compiling derive_more v2.1.1
Compiling signal-hook-mio v0.2.5
Compiling xattr v1.6.1
Compiling anstyle-parse v1.0.0
Compiling uuid v1.22.0
Compiling filetime v0.2.27
Compiling bytes v1.11.1
Compiling tar v0.4.45
Compiling git-ref-format-macro v0.6.0
Compiling anstream v1.0.0
Compiling crossterm v0.29.0
Compiling getrandom v0.3.4
Compiling anyhow v1.0.102
Compiling portable-atomic v1.13.1
Compiling flate2 v1.1.9
Compiling console v0.16.3
Compiling snapbox-macros v0.3.10
Compiling salsa20 v0.10.2
Compiling similar v2.7.0
Compiling siphasher v0.3.11
Compiling clap_lex v1.1.0
Compiling streaming-iterator v0.1.9
Compiling unit-prefix v0.5.2
Compiling strsim v0.11.1
Compiling normalize-line-endings v0.3.0
Compiling snapbox v0.4.17
Compiling clap_builder v4.6.0
Compiling indicatif v0.18.4
Compiling bloomy v1.2.0
Compiling scrypt v0.11.0
Compiling radicle-surf v0.27.1
Compiling inquire v0.9.4
Compiling git-ref-format v0.6.0
Compiling unicode-display-width v0.3.0
Compiling systemd-journal-logger v2.2.2
Compiling serde_spanned v1.0.4
Compiling toml_datetime v0.7.5+spec-1.1.0
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-c v0.23.4
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-python v0.23.6
Compiling tree-sitter-rust v0.23.3
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-css v0.23.2
Compiling toml_writer v1.0.7+spec-1.1.0
Compiling radicle-std-ext v0.2.0
Compiling pin-project-lite v0.2.17
Compiling tokio v1.50.0
Compiling toml v0.9.12+spec-1.1.0
Compiling clap v4.6.0
Compiling sysinfo v0.37.2
Compiling radicle-cli v0.20.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cli)
Compiling radicle-node v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-node)
Compiling diff v0.1.13
Compiling yansi v1.0.1
Compiling pretty_assertions v1.4.1
Compiling human-panic v2.0.6
Compiling clap_complete v4.6.0
Compiling structured-logger v1.0.5
Compiling radicle-systemd v0.12.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-systemd)
Compiling tree-sitter-highlight v0.24.7
Compiling itertools v0.14.0
Compiling socket2 v0.5.10
Compiling humantime v2.3.0
Compiling timeago v0.4.2
Compiling lexopt v0.3.2
Compiling bit-vec v0.8.0
Compiling bit-set v0.8.0
Compiling escargot v0.5.15
Compiling rand_core v0.9.5
Compiling num-bigint v0.4.6
Compiling num-complex v0.4.6
Compiling env_filter v1.0.0
Compiling borrow-or-share v0.2.4
Compiling fluent-uri v0.3.2
Compiling num-rational v0.4.2
Compiling env_logger v0.11.9
Compiling git2 v0.20.4
Compiling num v0.4.3
Compiling ahash v0.8.12
Compiling phf_shared v0.11.3
Compiling wait-timeout v0.2.1
Compiling vsimd v0.8.0
Compiling quick-error v1.2.3
Compiling fnv v1.0.7
Compiling radicle-remote-helper v0.16.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-remote-helper)
Compiling outref v0.5.2
Compiling rusty-fork v0.3.1
Compiling uuid-simd v0.8.0
Compiling phf v0.11.3
Compiling test-log v0.2.19
Compiling referencing v0.30.0
Compiling fraction v0.15.3
Compiling rand_chacha v0.9.0
Compiling rand_xorshift v0.4.0
Compiling rand v0.9.2
Compiling fancy-regex v0.14.0
Compiling email_address v0.2.9
Compiling bytecount v0.6.9
Compiling unarray v0.1.4
Compiling base64 v0.22.1
Compiling num-cmp v0.1.0
Compiling jsonschema v0.30.0
Compiling proptest v1.10.0
Compiling radicle-oid v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-oid)
Compiling radicle-cob v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cob)
Compiling radicle-core v0.2.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-core)
Compiling radicle-git-ext v0.12.0
Compiling radicle-term v0.17.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-term)
Compiling emojis v0.6.4
Compiling radicle-windows v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-windows)
Compiling radicle-fetch v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-fetch)
Compiling radicle-protocol v0.7.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-protocol)
Compiling radicle-cli-test v0.13.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cli-test)
Compiling radicle-schemars v0.7.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-schemars)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 01s
+ cargo doc --workspace --no-deps --all-features
Checking regex-automata v0.4.14
Compiling num-traits v0.2.19
Compiling syn v1.0.109
Checking once_cell v1.21.4
Checking tempfile v3.27.0
Checking idna v1.1.0
Checking url v2.5.8
Checking num-integer v0.1.46
Checking git2 v0.20.4
Checking num-iter v0.1.45
Checking num-bigint-dig v0.8.6
Compiling amplify_syn v2.0.1
Checking bstr v1.12.1
Checking gix-validate v0.11.0
Checking git-ref-format-core v0.6.0
Compiling amplify_derive v4.0.1
Checking gix-path v0.11.1
Checking rsa v0.9.10
Checking gix-features v0.46.1
Checking gix-hash v0.22.1
Checking ssh-key v0.6.7
Checking radicle-git-ref-format v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-git-ref-format)
Checking gix-error v0.1.0
Checking gix-hashtable v0.12.0
Checking radicle-oid v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-oid)
Checking rusty-fork v0.3.1
Checking gix-error v0.0.0
Checking proptest v1.10.0
Checking radicle-git-metadata v0.2.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-git-metadata)
Checking radicle-dag v0.10.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-dag)
Checking ssh-agent-lib v0.5.2
Checking gix-date v0.14.0
Checking chrono v0.4.44
Checking radicle-localtime v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-localtime)
Checking gix-actor v0.39.0
Checking amplify v4.9.0
Checking gix-date v0.13.0
Checking gix-fs v0.19.1
Checking cyphergraphy v0.3.0
Checking gix-tempfile v21.0.1
Checking cypheraddr v0.4.0
Checking noise-framework v0.4.0
Checking gix-actor v0.38.0
Checking gix-object v0.56.0
Checking gix-chunk v0.6.0
Checking socks5-client v0.4.1
Checking gix-quote v0.6.2
Checking cyphernet v0.5.2
Checking radicle-crypto v0.16.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-crypto)
Checking gix-commitgraph v0.33.0
Checking gix-object v0.55.0
Checking gix-chunk v0.5.0
Checking radicle-core v0.2.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-core)
Checking radicle-cob v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cob)
Checking gix-command v0.7.1
Checking gix-revwalk v0.27.0
Checking gix-commitgraph v0.32.0
Checking gix-lock v21.0.1
Checking gix-url v0.35.2
Checking radicle v0.23.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle)
Checking gix-config-value v0.17.1
Checking gix-revwalk v0.26.0
Checking gix-diff v0.58.0
Checking gix-prompt v0.13.1
Checking gix-traverse v0.52.0
Checking gix-revision v0.41.0
Checking radicle-signals v0.11.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-signals)
Checking gix-glob v0.24.0
Checking gix-packetline v0.21.1
Checking regex v1.12.3
Checking gix-refspec v0.37.0
Checking gix-transport v0.54.0
Checking tree-sitter v0.24.7
Checking gix-pack v0.65.0
Checking gix-credentials v0.36.0
Checking git-ref-format v0.6.0
Checking inquire v0.9.4
Checking gix-shallow v0.8.1
Checking gix-ref v0.59.0
Checking gix-negotiate v0.27.0
Checking radicle-git-ext v0.12.0
Checking gix-odb v0.75.0
Checking gix-protocol v0.57.0
Checking uuid v1.22.0
Compiling radicle-cli v0.20.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cli)
Checking human-panic v2.0.6
Checking radicle-surf v0.27.1
Checking tree-sitter-toml-ng v0.6.0
Checking radicle-term v0.17.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-term)
Checking tree-sitter-highlight v0.24.7
Checking radicle-systemd v0.12.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-systemd)
Documenting radicle-systemd v0.12.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-systemd)
Documenting radicle-term v0.17.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-term)
Documenting radicle v0.23.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle)
Documenting radicle-signals v0.11.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-signals)
Documenting radicle-core v0.2.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-core)
Documenting radicle-cob v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cob)
Documenting radicle-crypto v0.16.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-crypto)
Documenting radicle-oid v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-oid)
Documenting radicle-git-ref-format v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-git-ref-format)
Documenting radicle-localtime v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-localtime)
Documenting radicle-dag v0.10.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-dag)
Documenting radicle-git-metadata v0.2.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-git-metadata)
Documenting radicle-windows v0.1.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-windows)
Checking radicle-fetch v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-fetch)
Documenting radicle-cli v0.20.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cli)
Documenting radicle-cli-test v0.13.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-cli-test)
Checking radicle-protocol v0.7.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-protocol)
Documenting radicle-protocol v0.7.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-protocol)
Documenting radicle-node v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-node)
Documenting radicle-fetch v0.19.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-fetch)
Documenting radicle-schemars v0.7.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-schemars)
Documenting radicle-remote-helper v0.16.0 (/66e08728-e436-43fb-b216-04cbff1bdac9/w/crates/radicle-remote-helper)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.54s
Generated /66e08728-e436-43fb-b216-04cbff1bdac9/w/target/doc/radicle/index.html and 20 other files
+ cargo test --workspace --no-fail-fast
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.15s
Running unittests src/lib.rs (target/debug/deps/radicle-78952322fe29868b)
running 330 tests
test canonical::formatter::test::ascii_control_characters ... ok
test canonical::formatter::test::ordered_nested_object ... ok
test canonical::formatter::test::securesystemslib_asserts ... ok
test cob::cache::migrations::_2::tests::test_patch_json_deserialization ... ok
test cob::cache::tests::test_migrate_to ... ok
test cob::common::test::test_color ... ok
test cob::common::test::test_emojis ... ok
test cob::common::test::test_title ... ok
test cob::cache::migrations::_2::tests::test_migration_2 ... ok
test cob::cache::tests::test_check_version ... ok
test cob::identity::test::prop_json_eq_str ... ok
test cob::identity::test::test_identity_redact_revision ... ok
test cob::identity::test::test_identity_reject_concurrent ... ok
test cob::identity::test::test_identity_remove_delegate_concurrent ... ok
test cob::identity::test::test_identity_update_rejected ... ok
test cob::identity::test::test_identity_updates ... ok
test cob::issue::cache::tests::test_counts ... ok
test cob::issue::cache::tests::test_get ... ok
test cob::issue::cache::tests::test_is_empty ... ok
test cob::issue::cache::tests::test_list ... ok
test cob::issue::cache::tests::test_list_by_status ... ok
test cob::issue::cache::tests::test_remove ... ok
test cob::identity::test::test_valid_identity ... ok
test cob::identity::test::test_identity_updates_concurrent ... ok
test cob::issue::test::test_embeds ... ok
test cob::issue::test::test_embeds_edit ... ok
test cob::issue::test::test_invalid_actions ... ok
test cob::identity::test::test_identity_updates_concurrent_outdated ... ok
test cob::issue::test::test_invalid_tx ... ok
test cob::issue::test::test_invalid_tx_reference ... ok
test cob::issue::test::test_concurrency ... ok
test cob::issue::test::test_invalid_cob ... ok
test cob::issue::test::test_issue_all ... ok
test cob::issue::test::test_issue_comment ... ok
test cob::issue::test::test_issue_comment_redact ... ok
test cob::issue::test::test_issue_create_and_assign ... ok
test cob::issue::test::test_issue_create_and_get ... ok
test cob::issue::test::test_issue_create_and_change_state ... ok
test cob::issue::test::test_issue_create_and_unassign ... ok
test cob::issue::test::test_issue_create_and_reassign ... ok
test cob::issue::test::test_issue_edit ... ok
test cob::issue::test::test_issue_edit_description ... ok
test cob::issue::test::test_issue_label ... ok
test cob::issue::test::test_issue_state_serde ... ok
test cob::issue::test::test_ordering ... ok
test cob::patch::actions::test::test_review_edit ... ok
test cob::issue::test::test_issue_multilines ... ok
test cob::issue::test::test_issue_react ... ok
test cob::issue::test::test_issue_reply ... ok
test cob::patch::cache::tests::test_is_empty ... ok
test cob::patch::cache::tests::test_list ... ok
test cob::patch::cache::tests::test_list_by_status ... ok
test cob::patch::cache::tests::test_remove ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_migration_null_summary ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_migration_with_summary ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_migration_without_summary ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_v2 ... ok
test cob::patch::encoding::review::test::test_review_summary ... ok
test cob::patch::test::test_json ... ok
test cob::patch::test::test_json_serialization ... ok
test cob::patch::cache::tests::test_get ... ok
test cob::patch::test::test_patch_create_and_get ... ok
test cob::patch::test::test_patch_discussion ... ok
test cob::patch::test::test_patch_merge ... ok
test cob::patch::cache::tests::test_counts ... ok
test cob::patch::test::test_patch_redact ... ok
test cob::patch::test::test_patch_review_comment ... ok
test cob::patch::test::test_patch_review ... ok
test cob::patch::cache::tests::test_find_by_revision ... ok
test cob::patch::test::test_patch_review_duplicate ... ok
test cob::patch::test::test_patch_review_edit ... ok
test cob::patch::test::test_patch_review_remove_summary ... ok
test cob::patch::test::test_reactions_json_serialization ... ok
test cob::patch::test::test_revision_edit_redact ... ok
test cob::patch::test::test_revision_reaction ... ok
test cob::patch::test::test_revision_review_merge_redacted ... ok
test cob::patch::test::test_patch_review_edit_comment ... ok
test cob::patch::test::test_patch_review_revision_redact ... ok
test cob::stream::tests::test_all_from ... ok
test cob::stream::tests::test_from_until ... ok
test cob::stream::tests::test_all_from_until ... ok
test cob::stream::tests::test_regression_from_until ... ok
test cob::thread::tests::test_comment_edit_missing ... ok
test cob::thread::tests::test_comment_edit_redacted ... ok
test cob::thread::tests::test_comment_redact_missing ... ok
test cob::stream::tests::test_all_until ... ok
test cob::thread::tests::test_edit_comment ... ok
test cob::thread::tests::test_duplicate_comments ... ok
test cob::thread::tests::test_timeline ... ok
test git::canonical::protect::tests::refs_rad ... ok
test git::canonical::protect::tests::refs_rad_id ... ok
test git::canonical::protect::tests::refs_radieschen ... ok
test git::canonical::quorum::test::merge_base_commutative ... ok
test cob::thread::tests::test_redact_comment ... ok
test git::canonical::quorum::test::test_merge_bases ... ok
test git::canonical::rules::tests::test_deserialization ... ok
test git::canonical::rules::tests::test_deserialize_extensions ... ok
test git::canonical::rules::tests::test_order ... ok
test git::canonical::rules::tests::test_roundtrip ... ok
test cob::patch::test::test_patch_update ... ok
test git::canonical::rules::tests::test_rule_validate_success ... ok
test git::canonical::rules::tests::test_special_branches ... ok
test git::canonical::tests::test_commit_quorum_fork_of_a_fork ... ok
test git::canonical::tests::test_commit_quorum_forked_merge_commits ... ok
test git::canonical::tests::test_commit_quorum_groups ... ok
test git::canonical::tests::test_commit_quorum_linear ... ok
test git::canonical::tests::test_commit_quorum_merges ... ok
test git::canonical::tests::test_commit_quorum_single ... ok
test git::canonical::tests::test_commit_quorum_three_way_fork ... ok
test git::canonical::tests::test_commit_quorum_two_way_fork ... ok
test git::canonical::tests::test_quorum_different_types ... ok
test git::canonical::rules::tests::test_canonical ... ok
test git::canonical::tests::test_tag_quorum ... ok
test git::test::test_version_from_str ... ok
test git::test::test_version_ord ... ok
test identity::did::test::test_did_encode_decode ... ok
test identity::did::test::test_did_vectors ... ok
test git::canonical::rules::tests::test_rule_validate_failures ... ok
test identity::doc::test::test_canonical_doc ... ok
test identity::doc::test::test_canonical_example ... ok
test identity::doc::test::test_duplicate_dids ... ok
test identity::doc::test::test_future_version_error ... ok
test identity::doc::test::test_is_valid_version ... ok
test identity::doc::test::test_max_delegates ... ok
test identity::doc::test::test_not_found ... ok
test identity::doc::test::test_parse_version ... ok
test identity::doc::test::test_visibility_json ... ok
test identity::doc::update::test::test_can_update_crefs ... ok
test identity::doc::update::test::test_cannot_include_default_branch_rule ... ok
test identity::doc::update::test::test_default_branch_rule_exists_after_verification ... ok
test identity::project::test::test_project_name ... ok
test node::address::store::test::test_alias ... ok
test node::address::store::test::test_disconnected ... ok
test node::address::store::test::test_disconnected_ban ... ok
test node::address::store::test::test_empty ... ok
test node::address::store::test::test_entries ... ok
test node::address::store::test::test_get_none ... ok
test node::address::store::test::test_insert_and_get ... ok
test node::address::store::test::test_insert_and_remove ... ok
test node::address::store::test::test_insert_and_update ... ok
test node::address::store::test::test_insert_duplicate ... ok
test node::address::store::test::test_node_aliases ... ok
test node::address::store::test::test_remove_nothing ... ok
test node::command::test::command_result ... ok
test node::config::test::deserialize_migrating_scope ... ok
test node::config::test::fetch_level_min ... ok
test node::config::test::onion_absent ... ok
test node::config::test::onion_null ... ok
test node::config::test::partial ... ok
test node::config::test::regression_ipv6_address_brackets ... ok
test node::config::test::regression_ipv6_address_no_brackets ... ok
test node::config::test::serialize_migrating_scope ... ok
test node::config::test::user_agent_custom ... ok
test node::config::test::user_agent_default ... ok
test node::config::test::user_agent_default_explicit ... ok
test node::config::test::user_agent_opt_out ... ok
test node::db::config::test::database_config_valid_combinations ... ok
test node::db::config::test::invalid ... ok
test node::db::test::migration_8::all_ipv6_formatted_dns_addresses_are_retyped ... ok
test node::db::test::migration_8::dns_address_starting_with_bracket_but_missing_closing_bracket_colon_is_unaffected ... ok
test node::db::test::migration_8::dns_address_with_bracket_not_at_start_is_unaffected ... ok
test node::db::test::migration_8::ipv4_address_is_unaffected ... ok
test node::db::test::migration_8::ipv6_formatted_dns_address_is_deleted_when_correct_ipv6_row_already_exists ... ok
test node::db::test::migration_8::ipv6_formatted_dns_address_is_retyped_to_ipv6 ... ok
test node::db::test::migration_8::migration_applies_to_all_nodes ... ok
test node::db::test::migration_8::plain_dns_hostname_without_brackets_is_unaffected ... ok
test node::db::test::migration_8::retype_preserves_address_metadata ... ok
test node::db::test::test_version ... ok
test node::features::test::test_operations ... ok
test node::notifications::store::test::test_branch_notifications ... ok
test node::notifications::store::test::test_clear ... ok
test node::notifications::store::test::test_cob_notifications ... ok
test node::notifications::store::test::test_counts_by_repo ... ok
test node::notifications::store::test::test_duplicate_notifications ... ok
test node::notifications::store::test::test_notification_status ... ok
test node::policy::store::test::test_follow_and_unfollow_node ... ok
test node::policy::store::test::test_node_aliases ... ok
test node::policy::store::test::test_node_policies ... ok
test node::policy::store::test::test_node_policy ... ok
test node::policy::store::test::test_repo_policies ... ok
test node::policy::store::test::test_repo_policy ... ok
test node::policy::store::test::test_seed_and_unseed_repo ... ok
test node::policy::store::test::test_update_alias ... ok
test node::policy::store::test::test_update_scope ... ok
test node::refs::store::test::test_count ... ok
test node::refs::store::test::test_set_and_delete ... ok
test node::refs::store::test::test_set_and_get ... ok
test node::routing::test::test_count ... ok
test git::canonical::tests::test_quorum_properties ... ok
test node::routing::test::test_entries ... ok
test node::routing::test::test_insert_and_get ... ok
test node::routing::test::test_insert_and_get_resources ... ok
test node::routing::test::test_insert_duplicate ... ok
test node::routing::test::test_insert_existing_updated_time ... ok
test node::routing::test::test_len ... ok
test node::routing::test::test_insert_and_remove ... ok
test node::routing::test::test_remove_many ... ok
test node::routing::test::test_remove_redundant ... ok
test node::routing::test::test_update_existing_multi ... ok
test node::sync::announce::test::all_synced_nodes_are_preferred_seeds ... ok
test node::sync::announce::test::announcer_adapts_target_to_reach ... ok
test node::routing::test::test_prune ... ok
test node::sync::announce::test::announcer_preferred_seeds_or_replica_factor ... ok
test node::sync::announce::test::announcer_reached_max_replication_target ... ok
test node::sync::announce::test::announcer_reached_min_replication_target ... ok
test node::sync::announce::test::announcer_reached_preferred_seeds ... ok
test node::sync::announce::test::announcer_synced_with_unknown_node ... ok
test node::sync::announce::test::announcer_with_replication_factor_zero_and_preferred_seeds ... ok
test node::sync::announce::test::announcer_timed_out ... ok
test node::sync::announce::test::construct_node_appears_in_multiple_input_sets ... ok
test node::sync::announce::test::construct_only_preferred_seeds_provided ... ok
test node::sync::announce::test::cannot_construct_announcer ... ok
test node::sync::announce::test::local_node_in_multiple_sets ... ok
test node::sync::announce::test::invariant_progress_should_match_state ... ok
test node::sync::announce::test::local_node_in_preferred_seeds ... ok
test node::sync::announce::test::local_node_in_synced_set ... ok
test node::sync::announce::test::local_node_only_in_all_sets_results_in_no_seeds_error ... ok
test node::sync::announce::test::local_node_in_unsynced_set ... ok
test node::sync::announce::test::preferred_seeds_already_synced ... ok
test node::sync::announce::test::synced_with_local_node_is_ignored ... ok
test node::sync::announce::test::synced_with_same_node_multiple_times ... ok
test node::sync::announce::test::timed_out_after_reaching_success ... ok
test node::sync::fetch::test::all_nodes_are_candidates ... ok
test node::sync::fetch::test::could_not_reach_target ... ok
test node::sync::fetch::test::ignores_duplicates_and_local_node ... ok
test node::sync::fetch::test::all_nodes_are_fetchable ... ok
test node::sync::fetch::test::preferred_seeds_target_returned_over_replicas ... ok
test node::sync::fetch::test::reaches_target_of_max_replicas ... ok
test node::sync::fetch::test::reaches_target_of_preferred_seeds ... ok
test node::sync::test::ensure_replicas_construction ... ok
test node::sync::test::replicas_constrain_to ... ok
test node::test::test_address ... ok
test node::test::test_alias ... ok
test node::test::test_command_result ... ok
test node::test::test_user_agent ... ok
test node::timestamp::tests::test_timestamp_max ... ok
test node::sync::fetch::test::reaches_target_of_replicas ... ok
test profile::test::canonicalize_home ... ok
test profile::test::test_config ... ok
test cob::thread::tests::prop_ordering ... ok
test rad::tests::test_checkout ... ok
test rad::tests::test_fork ... ok
test rad::tests::test_init ... ok
test storage::git::tests::test_references_of ... ok
test storage::git::tests::test_sign_refs ... ok
test storage::git::transport::local::url::test::test_url_to_string ... ok
test storage::git::transport::remote::url::test::test_url_parse ... ok
test storage::git::transport::local::url::test::test_url_parse ... ok
test profile::config::test::schema ... ok
test storage::refs::sigrefs::read::test::commit_reader::identity_root_error ... ok
test storage::refs::sigrefs::read::test::commit_reader::missing_commit ... ok
test storage::refs::sigrefs::read::test::commit_reader::read_ok ... ok
test storage::refs::sigrefs::read::test::commit_reader::too_many_parents ... ok
test storage::refs::sigrefs::read::test::commit_reader::tree_error ... ok
test storage::refs::sigrefs::read::test::identity_root_reader::doc_blob_error ... ok
test storage::refs::sigrefs::read::test::identity_root_reader::missing_identity ... ok
test storage::refs::sigrefs::read::test::identity_root_reader::read_ok_none ... ok
test storage::refs::sigrefs::read::test::identity_root_reader::read_ok_some ... ok
test storage::refs::sigrefs::read::test::resolve_tip::find_reference_error ... ok
test storage::refs::sigrefs::read::test::resolve_tip::missing_sigrefs ... ok
test storage::refs::sigrefs::read::test::resolve_tip::resolve_tip_ok ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::detect_parent::root_without_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::detect_parent::root_without_root ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::downgrade::parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::downgrade::restore ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::downgrade::root ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::downgrade::root_with_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::head_commit_error ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::head_verify_mismatched_identity_error ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::head_verify_signature_error ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::invalid_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::read_ok_no_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::read_ok_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::read_ok_root ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::replay::alternating ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::replay::chain ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::replay::multiple ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::replay::root_at_head ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::single_commit ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::two_commits ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::walk_commit_error ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::walk_verify_error ... ok
test storage::refs::sigrefs::read::test::tree_reader::missing_both ... ok
test storage::refs::sigrefs::read::test::tree_reader::missing_refs ... ok
test storage::refs::sigrefs::read::test::tree_reader::missing_signature ... ok
test storage::refs::sigrefs::read::test::tree_reader::parse_refs_error ... ok
test storage::refs::sigrefs::read::test::tree_reader::parse_signature_error ... ok
test storage::refs::sigrefs::read::test::tree_reader::read_ok ... ok
test storage::refs::sigrefs::read::test::tree_reader::read_refs_error ... ok
test storage::refs::sigrefs::read::test::tree_reader::read_signature_error ... ok
test storage::refs::sigrefs::write::test::commit_writer::tree_error ... ok
test storage::refs::sigrefs::write::test::commit_writer::write_commit_error ... ok
test storage::refs::sigrefs::write::test::commit_writer::write_empty_refs ... ok
test storage::refs::sigrefs::write::test::commit_writer::write_root_ok ... ok
test storage::refs::sigrefs::write::test::commit_writer::write_with_parent_ok ... ok
test storage::refs::sigrefs::write::test::head_reader::no_head ... ok
test storage::refs::sigrefs::write::test::head_reader::read_ok ... ok
test storage::refs::sigrefs::write::test::head_reader::reference_error ... ok
test storage::refs::sigrefs::write::test::head_reader::refs_blob_error ... ok
test storage::refs::sigrefs::write::test::head_reader::refs_blob_missing ... ok
test storage::refs::sigrefs::write::test::head_reader::refs_parse_error ... ok
test storage::refs::sigrefs::write::test::head_reader::signature_blob_error ... ok
test storage::refs::sigrefs::write::test::head_reader::signature_blob_missing ... ok
test storage::refs::sigrefs::write::test::head_reader::signature_parse_error ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::commit_error ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::head_error ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::never_write_rad_sigrefs ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::reference_error ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::unchanged ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::unchanged_force_writes_new_commit ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::write_empty_refs ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::write_root_ok ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::write_with_parent_ok ... ok
test storage::refs::sigrefs::write::test::tree_writer::sign_error ... ok
test storage::refs::sigrefs::write::test::tree_writer::write_ok ... ok
test storage::refs::sigrefs::write::test::tree_writer::write_tree_error ... ok
test storage::refs::tests::prop_canonical_roundtrip ... ok
test storage::refs::tests::test_rid_verification ... ok
test storage::tests::test_storage ... ok
test test::assert::test::assert_with_message ... ok
test test::assert::test::test_assert_no_move ... ok
test test::assert::test::test_assert_panic_0 - should panic ... ok
test test::assert::test::test_assert_panic_1 - should panic ... ok
test test::assert::test::test_assert_panic_2 - should panic ... ok
test test::assert::test::test_assert_succeed ... ok
test test::assert::test::test_panic_message ... ok
test version::test::test_version ... ok
test storage::refs::sigrefs::property::idempotent ... ok
test identity::doc::test::prop_encode_decode ... ok
test storage::refs::sigrefs::property::roundtrip ... ok
test result: ok. 330 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.37s
Running unittests src/lib.rs (target/debug/deps/radicle_cli-e3cb8d8f3699a125)
running 46 tests
test commands::block::args::test::should_not_parse ... ok
test commands::block::args::test::should_parse_nid ... ok
test commands::clone::args::test::should_parse_rid_non_urn ... ok
test commands::block::args::test::should_parse_rid ... ok
test commands::clone::args::test::should_parse_rid_url ... ok
test commands::clone::args::test::should_parse_rid_urn ... ok
test commands::cob::args::test::should_allow_log_json_format ... ok
test commands::cob::args::test::should_allow_log_pretty_format ... ok
test commands::cob::args::test::should_allow_show_json_format ... ok
test commands::cob::args::test::should_not_allow_show_pretty_format ... ok
test commands::cob::args::test::should_allow_update_json_format ... ok
test commands::cob::args::test::should_not_allow_update_pretty_format ... ok
test commands::fork::args::test::should_not_parse_rid_url ... ok
test commands::fork::args::test::should_parse_rid_non_urn ... ok
test commands::fork::args::test::should_parse_rid_urn ... ok
test commands::id::args::test::should_not_parse_into_payload - should panic ... ok
test commands::id::args::test::should_not_clobber_payload_args ... ok
test commands::id::args::test::should_parse_into_payload ... ok
test commands::id::args::test::should_not_parse_single_payload ... ok
test commands::id::args::test::should_not_parse_single_payloads ... ok
test commands::init::args::test::should_not_parse_rid_url ... ok
test commands::id::args::test::should_parse_multiple_payloads ... ok
test commands::init::args::test::should_parse_rid_non_urn ... ok
test commands::id::args::test::should_parse_single_payload ... ok
test commands::inspect::test::test_tree ... ok
test commands::init::args::test::should_parse_rid_urn ... ok
test commands::patch::review::builder::tests::test_review_comments_before ... ok
test commands::patch::review::builder::tests::test_review_comments_basic ... ok
test commands::patch::review::builder::tests::test_review_comments_multiline ... ok
test commands::patch::review::builder::tests::test_review_comments_split_hunk ... ok
test commands::publish::args::test::should_not_parse_rid_url ... ok
test commands::publish::args::test::should_parse_rid_non_urn ... ok
test commands::publish::args::test::should_parse_rid_urn ... ok
test git::pretty_diff::test::test_pretty ... ignored
test git::ddiff::tests::diff_encode_decode_ddiff_hunk ... ok
test git::unified_diff::test::test_diff_content_encode_decode_content ... ok
test git::unified_diff::test::test_diff_encode_decode_diff ... ok
test terminal::args::test::should_not_parse ... ok
test terminal::args::test::should_parse_nid ... ok
test terminal::args::test::should_parse_rid ... ok
test terminal::format::test::test_bytes ... ok
test terminal::format::test::test_strip_comments ... ok
test terminal::patch::test::test_edit_display_message ... ok
test commands::watch::args::test::should_parse_ref_str ... ok
test terminal::patch::test::test_create_display_message ... ok
test terminal::patch::test::test_update_display_message ... ok
test result: ok. 45 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running unittests src/main.rs (target/debug/deps/rad-76470bccbc8f646f)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/commands.rs (target/debug/deps/commands-b5d502a8f09cbdd4)
running 115 tests
test commands::checkout::rad_checkout ... ok
test commands::clone::rad_clone_bare ... ok
test commands::clone::rad_clone ... ok
test commands::clone::rad_clone_all ... ok
test commands::clone::rad_clone_scope ... ok
test commands::clone::rad_clone_unknown ... ok
test commands::clone::rad_clone_directory ... ok
test commands::clone::rad_clone_connect ... ok
test commands::clone::rad_clone_partial_fail ... ok
test commands::cob::rad_cob_multiset ... ok
test commands::clone::test_clone_without_seeds ... ok
test commands::cob::rad_cob_log ... ok
test commands::cob::rad_cob_migrate ... ok
test commands::cob::rad_cob_operations ... ok
test commands::cob::rad_cob_show ... ok
test commands::cob::rad_cob_update_identity ... ok
test commands::cob::rad_cob_update ... ok
test commands::cob::test_cob_deletion ... ok
test commands::cob::test_cob_replication ... ok
test commands::git::git_push_amend ... ok
test commands::git::git_push_and_fetch ... ok
test commands::git::git_push_canonical_annotated_tags ... ok
test commands::git::git_push_canonical_lightweight_tags ... ok
test commands::git::git_push_force_with_lease ... ok
test commands::git::git_push_diverge ... ok
test commands::id::rad_id ... ok
test commands::id::rad_id_collaboration ... ignored, slow
test commands::git::git_push_rollback ... ok
test commands::git::git_tag ... ok
test commands::git::git_push_converge ... ok
test commands::id::rad_id_private ... ok
test commands::id::rad_id_threshold_soft_fork ... ok
test commands::id::rad_id_conflict ... ok
test commands::id::rad_id_unknown_field ... ok
test commands::id::rad_id_threshold ... ok
test commands::id::rad_id_update_delete_field ... ok
test commands::init::rad_init ... ignored, part of many other tests
test commands::id::rad_id_unauthorized_delegate ... ok
test commands::id::rad_id_multi_delegate ... ok
test commands::init::rad_init_bare ... ok
test commands::init::rad_init_detached_head ... ok
test commands::init::rad_init_no_git ... ok
test commands::init::rad_init_existing_bare ... ok
test commands::init::rad_init_existing ... ok
test commands::init::rad_init_no_seed ... ok
test commands::init::rad_init_private ... ok
test commands::init::rad_init_private_no_seed ... ok
test commands::init::rad_init_private_clone ... ok
test commands::inbox::rad_inbox ... ok
test commands::init::rad_init_private_clone_seed ... ok
test commands::init::rad_init_private_seed ... ok
test commands::init::rad_init_sync_not_connected ... ok
test commands::init::rad_init_sync_preferred ... ok
test commands::init::rad_init_with_existing_remote ... ok
test commands::init::rad_publish ... ok
test commands::issue::rad_issue ... ok
test commands::jj::rad_jj_bare ... ok
test commands::jj::rad_jj_colocated_patch ... ok
test commands::issue::rad_issue_list ... ok
test commands::node::rad_node_connect ... ok
test commands::node::rad_node_connect_without_address ... ok
test commands::patch::rad_merge_after_update ... ok
test commands::node::rad_node ... ok
test commands::patch::rad_merge_no_ff ... ok
test commands::patch::rad_merge_via_push ... ok
test commands::patch::rad_patch ... ok
test commands::patch::rad_patch_ahead_behind ... ok
test commands::patch::rad_patch_change_base ... ok
test commands::patch::rad_patch_checkout ... ok
test commands::init::rad_init_sync_and_clone ... ok
test commands::init::rad_init_sync_timeout ... ok
test commands::patch::rad_patch_checkout_revision ... ok
test commands::patch::rad_patch_detached_head ... ok
test commands::patch::rad_patch_diff ... ok
test commands::patch::rad_patch_checkout_force ... ok
test commands::patch::rad_patch_draft ... ok
test commands::patch::rad_patch_edit ... ok
test commands::patch::rad_patch_fetch_2 ... FAILED
test commands::patch::rad_patch_merge_draft ... ok
test commands::patch::rad_patch_fetch_1 ... ok
test commands::patch::rad_patch_delete ... ok
test commands::patch::rad_patch_revert_merge ... ok
test commands::patch::rad_patch_open_explore ... ok
test commands::patch::rad_patch_via_push ... FAILED
test commands::patch::rad_patch_update ... ok
test commands::policy::rad_block ... ok
test commands::policy::rad_seed_and_follow ... ok
test commands::patch::rad_review_by_hunk ... ok
test commands::policy::rad_seed_policy_allow_no_scope ... ok
test commands::policy::rad_seed_scope ... ok
test commands::policy::rad_seed_many ... ok
test commands::policy::rad_unseed ... ok
test commands::policy::rad_unseed_many ... ok
test commands::patch::rad_push_and_pull_patches ... ok
test commands::remote::rad_remote ... ok
test commands::sync::rad_sync_without_node ... ok
test commands::sync::rad_sync ... ok
test commands::utility::framework_home ... ok
test commands::utility::rad_auth ... ok
test commands::utility::rad_auth_errors ... ok
test commands::patch::rad_patch_pull_update ... ok
test commands::utility::rad_clean ... ok
test commands::utility::rad_config ... ok
test commands::utility::rad_diff ... ok
test commands::utility::rad_help ... ok
test commands::utility::rad_inspect ... ok
test commands::utility::rad_key_mismatch ... ok
test commands::utility::rad_self ... ok
test commands::utility::rad_warn_old_nodes ... ok
test commands::sync::rad_fetch ... ok
test commands::watch::rad_watch ... ok
test rad_remote ... ok
test commands::sync::test_replication_via_seed ... ok
test commands::workflow::rad_workflow ... ok
test commands::utility::rad_fork ... ok
failures:
---- commands::patch::rad_patch_fetch_2 stdout ----
1776178015 test: rad-init:6: `rad init --name heartwood --description Radicle Heartwood Protocol & Stack --no-confirm --public -v` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-init:28: `rad init` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-init:35: `rad ls` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-init:46: `rad node inventory` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:6: `git checkout -b alice/1 -q` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:7: `git commit --allow-empty -m Changes #1 -q` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:8: `git push rad -o patch.message=Changes HEAD:refs/patches` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:12: `git checkout master -q` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:13: `git branch -D alice/1 -q` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:14: `git update-ref -d refs/remotes/rad/alice/1` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:15: `git update-ref -d refs/remotes/rad/patches/5e2dedcc5d515fcbc1cca483d3376609fe889bfb` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:16: `git gc --prune=now` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:17: `git branch -r` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:22: `git pull` @ /tmp/.tmp4mQVO9/alice/work
1776178015 test: rad-patch-fetch-2:24: `git branch -r` @ /tmp/.tmp4mQVO9/alice/work
thread 'commands::patch::rad_patch_fetch_2' panicked at crates/radicle-cli-test/src/lib.rs:502:36:
--- Expected
++++ actual: stdout
1 - rad/HEAD -> rad/master
2 1 | rad/master
3 2 | rad/patches/5e2dedcc5d515fcbc1cca483d3376609fe889bfb
Exit status: 0
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
---- commands::patch::rad_patch_via_push stdout ----
1776178016 test: rad-init:6: `rad init --name heartwood --description Radicle Heartwood Protocol & Stack --no-confirm --public -v` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-init:28: `rad init` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-init:35: `rad ls` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-init:46: `rad node inventory` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-patch-via-push:7: `git checkout -b feature/1` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-patch-via-push:9: `git commit -a -m Add things -q --allow-empty` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-patch-via-push:10: `git push -o patch.message=Add things #1 -o patch.message=See commits for details. rad HEAD:refs/patches` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-patch-via-push:22: `rad patch show 6035d2f582afbe01ff23ea87528ae523d76875b6` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-patch-via-push:45: `git branch -vv` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-patch-via-push:53: `git status --short --branch` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-patch-via-push:55: `git fetch` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-patch-via-push:56: `git push` @ /tmp/.tmpg2r56J/alice/work
1776178017 test: rad-patch-via-push:62: `git show-ref` @ /tmp/.tmpg2r56J/alice/work
thread 'commands::patch::rad_patch_via_push' panicked at crates/radicle-cli-test/src/lib.rs:502:36:
--- Expected
++++ actual: stdout
1 1 | 42d894a83c9c356552a57af09ccdbd5587a99045 refs/heads/feature/1
2 2 | f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/heads/master
3 - f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/remotes/rad/HEAD
4 3 | f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/remotes/rad/master
5 4 | 42d894a83c9c356552a57af09ccdbd5587a99045 refs/remotes/rad/patches/6035d2f582afbe01ff23ea87528ae523d76875b6
Exit status: 0
failures:
commands::patch::rad_patch_fetch_2
commands::patch::rad_patch_via_push
test result: FAILED. 111 passed; 2 failed; 2 ignored; 0 measured; 0 filtered out; finished in 75.20s
error: test failed, to rerun pass `-p radicle-cli --test commands`
Running unittests src/lib.rs (target/debug/deps/radicle_cli_test-3ce7bfa2d1e6f852)
running 3 tests
test tests::test_parse ... ok
test tests::test_run ... ok
test tests::test_example_spaced_brackets ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_cob-6fe139a7978b5280)
running 9 tests
test object::tests::test_serde ... ok
test tests::git::roundtrip ... ok
test tests::invalid_parse_refstr ... ok
test tests::parse_refstr ... ok
test tests::git::traverse_cobs ... ok
test type_name::test::invalid_typenames ... ok
test type_name::test::valid_typenames ... ok
test tests::git::update_cob ... ok
test tests::git::list_cobs ... ok
test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
Running unittests src/lib.rs (target/debug/deps/radicle_core-e6bfed2c189a2d2c)
running 4 tests
test repo::test::valid ... ok
test repo::test::invalid ... ok
test repo::test::assert_prop_roundtrip_parse ... ok
test repo::serde_impls::test::assert_prop_roundtrip_serde_json ... ok
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running unittests src/lib.rs (target/debug/deps/radicle_crypto-99d51a8f68c92ad6)
running 11 tests
test ssh::agent::test::test_agent_encoding_sign ... ok
test ssh::agent::test::test_agent_encoding_remove ... ok
test ssh::fmt::test::test_key ... ok
test ssh::fmt::test::test_fingerprint ... ok
test ssh::keystore::tests::test_init_no_passphrase ... ok
test tests::prop_encode_decode ... ok
test tests::test_e25519_dh ... ok
test tests::test_encode_decode ... ok
test tests::prop_key_equality ... ok
test ssh::keystore::tests::test_signer ... ok
test ssh::keystore::tests::test_init_passphrase ... ok
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.87s
Running unittests src/lib.rs (target/debug/deps/radicle_dag-05f7457e7194a495)
running 20 tests
test tests::test_cycle ... ok
test tests::test_contains ... ok
test tests::test_diamond ... ok
test tests::test_fold_diamond ... ok
test tests::test_fold_multiple_roots ... ok
test tests::test_complex ... ok
test tests::test_dependencies ... ok
test tests::test_fold_sorting_1 ... ok
test tests::test_fold_reject ... ok
test tests::test_fold_sorting_2 ... ok
test tests::test_get ... ok
test tests::test_is_empty ... ok
test tests::test_len ... ok
test tests::test_merge_1 ... ok
test tests::test_merge_2 ... ok
test tests::test_prune_1 ... ok
test tests::test_prune_2 ... ok
test tests::test_remove ... ok
test tests::test_siblings ... ok
test tests::test_prune_by_sorting ... ok
test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_fetch-09006be51f522f0f)
running 1 test
test stage::test::valid_refspecs ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_git_metadata-7266929c438027dc)
running 24 tests
test commit::parse::test::error::invalid_committer ... ok
test commit::parse::test::error::invalid_author ... ok
test commit::parse::test::error::invalid_parent ... ok
test commit::parse::test::error::missing_author ... ok
test commit::parse::test::error::invalid_format_continuation_without_preceding_header ... ok
test commit::parse::test::error::missing_committer ... ok
test commit::parse::test::error::missing_header_body_separator ... ok
test commit::parse::test::error::missing_tree_empty_header ... ok
test commit::parse::test::error::invalid_tree ... ok
test commit::parse::test::success::commit_gpgsig_is_preserved_and_strip_removes_it ... ok
test commit::parse::test::success::commit_last_paragraph_kept_in_message_when_not_all_trailers ... ok
test commit::parse::test::success::commit_with_multiline_gpgsig ... ok
test commit::parse::test::success::commit_with_trailers ... ok
test commit::parse::test::error::missing_tree_wrong_first_line ... ok
test commit::parse::test::success::commit_with_extra_headers ... ok
test commit::parse::test::success::commit_with_single_parent ... ok
test commit::parse::test::success::merge_commit ... ok
test commit::parse::test::success::root_commit ... ok
test commit::parse::test::success::roundtrip ... ok
test commit::parse::test::unit::trailers_accepts_empty_input ... ok
test commit::parse::test::unit::trailers_rejects_line_without_separator ... ok
test commit::parse::test::unit::body_last_paragraph_not_trailers_stays_in_message ... ok
test commit::parse::test::unit::body_no_paragraph_separator_means_no_trailers ... ok
test commit::parse::test::unit::trailers_rejects_invalid_token_chars ... ok
test result: ok. 24 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_git_ref_format-b95a9bd0637298c8)
running 9 tests
test test::component ... ok
test test::pattern ... ok
test test::qualified ... ok
test test::qualified_invalid - should panic ... ok
test test::qualified_pattern ... ok
test test::qualified_pattern_invalid - should panic ... ok
test test::refname ... ok
test test::refname_invalid - should panic ... ok
test test::component_invalid - should panic ... ok
test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_localtime-9ecb37b1e50cb4e3)
running 1 test
test serde_impls::test::test_localtime ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_node-a8bcec91b47d72c4)
running 79 tests
test reactor::timer::tests::test_next ... ok
test reactor::timer::tests::test_wake ... ok
test reactor::timer::tests::test_wake_exact ... ok
test control::tests::test_control_socket ... ok
test control::tests::test_seed_unseed ... ok
test fingerprint::tests::matching ... ok
test tests::e2e::fetch_does_not_contain_rad_sigrefs_parent ... ok
test tests::e2e::missing_default_branch ... ok
test tests::e2e::missing_delegate_default_branch ... ok
test tests::e2e::test_background_foreground_fetch ... ok
test tests::e2e::test_block_prevents_connection ... ok
test tests::e2e::test_block_active_connection ... ok
test tests::e2e::test_block_prevents_fetch ... ok
test tests::e2e::test_channel_reader_limit ... ok
test tests::e2e::test_catchup_on_refs_announcements ... ok
test tests::e2e::test_clone ... ok
test tests::e2e::test_dont_fetch_owned_refs ... ok
test tests::e2e::test_fetch_followed_remotes ... ok
test tests::e2e::test_connection_crossing ... ok
test tests::e2e::test_concurrent_fetches ... ok
test tests::e2e::test_fetch_preserve_owned_refs ... ok
test tests::e2e::test_fetch_unseeded ... ok
test tests::e2e::test_fetch_up_to_date ... ok
test tests::e2e::test_inventory_sync_basic ... ok
test tests::e2e::test_fetch_emits_canonical_ref_update ... ok
test tests::e2e::test_large_fetch ... ok
test tests::e2e::test_migrated_clone ... ok
test tests::e2e::test_missing_remote ... ok
test tests::e2e::test_multiple_offline_inits ... ok
test tests::e2e::test_non_fastforward_identity_doc ... ok
test tests::e2e::test_non_fastforward_sigrefs ... ok
test tests::e2e::test_outdated_delegate_sigrefs ... ok
test tests::e2e::test_outdated_sigrefs ... ok
test tests::e2e::test_replication ... ok
test tests::e2e::test_inventory_sync_bridge ... ok
test tests::e2e::test_replication_invalid ... ok
test tests::e2e::test_inventory_sync_ring ... ok
test tests::e2e::test_replication_ref_in_sigrefs ... ok
test tests::e2e::test_inventory_sync_star ... ok
test tests::test_announcement_rebroadcast ... ok
test tests::test_announcement_rebroadcast_duplicates ... ok
test tests::test_announcement_rebroadcast_timestamp_filtered ... ok
test tests::test_connection_kept_alive ... ok
test tests::test_announcement_relay ... ok
test tests::test_disconnecting_unresponsive_peer ... ok
test tests::test_fetch_missing_inventory_on_gossip ... ok
test tests::test_fetch_missing_inventory_on_schedule ... ok
test tests::test_inbound_connection ... ok
test tests::test_inventory_decode ... ok
test tests::test_init_and_seed ... ok
test tests::test_inventory_relay ... ok
test tests::test_inventory_relay_bad_timestamp ... ok
test tests::test_inventory_sync ... ok
test tests::test_maintain_connections ... ok
test tests::test_maintain_connections_failed_attempt ... ok
test tests::test_maintain_connections_transient ... ok
test tests::test_outbound_connection ... ok
test tests::test_inventory_pruning ... ok
test tests::test_persistent_peer_connect ... ok
test tests::test_persistent_peer_reconnect_attempt ... ok
test tests::test_persistent_peer_reconnect_success ... ok
test tests::test_ping_response ... ok
test tests::test_queued_fetch_from_ann_same_rid ... ok
test tests::test_queued_fetch_from_command_same_rid ... ok
test tests::test_queued_fetch_max_capacity ... ok
test tests::test_redundant_connect ... ok
test tests::test_refs_announcement_fetch_trusted_no_inventory ... ok
test tests::test_refs_announcement_followed ... ok
test tests::test_refs_announcement_no_subscribe ... ok
test tests::test_refs_announcement_offline ... ok
test tests::test_announcement_message_amplification ... ok
test tests::prop_inventory_exchange_dense ... ok
test tests::test_refs_announcement_relay_private ... ok
test tests::test_seed_repo_subscribe ... ok
test wire::test::test_inventory_ann_with_extension ... ok
test wire::test::test_pong_message_with_extension ... ok
test tests::test_seeding ... ok
test tests::test_refs_announcement_relay_public ... ok
test tests::test_refs_synced_event ... ok
test result: ok. 79 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.00s
Running unittests src/main.rs (target/debug/deps/radicle_node-13b601e570a6915f)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_oid-32b41d88203b7116)
running 10 tests
test fmt::test::fixture ... ok
test fmt::test::zero ... ok
test git2::test::zero ... ok
test gix::test::zero ... ok
test str::test::fixture ... ok
test fmt::test::git2 ... ok
test fmt::test::gix ... ok
test str::test::gix_roundrip ... ok
test str::test::zero ... ok
test str::test::git2_roundtrip ... ok
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_protocol-bb37557218aa85e5)
running 99 tests
test deserializer::test::test_unparsed ... ok
test fetcher::service::tests::test_fetch_coalescing_different_refs ... ok
test deserializer::test::test_decode_next ... ok
test deserializer::test::prop_decode_next ... ok
test fetcher::test::queue::properties::capacity::rejection ... ok
test fetcher::test::queue::properties::capacity::bounded ... ok
test fetcher::test::queue::properties::dequeue::empty_queue_returns_none ... ok
test fetcher::test::queue::properties::dequeue::enables_reenqueue ... ok
test fetcher::test::queue::properties::capacity::capacity_reached_returns_same_item ... ok
test fetcher::test::queue::properties::dequeue::drained_queue_returns_none ... ok
test fetcher::test::queue::properties::capacity::restored_after_dequeue ... ok
test fetcher::test::queue::properties::fifo::interleaved_operations ... ok
test fetcher::test::queue::properties::fifo::ordering ... ok
test fetcher::test::queue::properties::equality::reflexive ... ok
test fetcher::test::queue::properties::merge::different_rid_accepted ... ok
test fetcher::test::queue::properties::equality::symmetric ... ok
test fetcher::test::queue::properties::merge::combines_refs ... ok
test fetcher::test::queue::properties::merge::longer_timeout_preserved ... ok
test fetcher::test::queue::properties::equality::transitive ... ok
test fetcher::test::queue::properties::merge::does_not_increase_queue_length ... ok
test fetcher::test::queue::properties::merge::empty_refs_fetches_all ... ok
test fetcher::test::queue::unit::capacity_takes_precedence_over_merge_for_new_items ... ok
test fetcher::test::queue::unit::max_timeout_accepted ... ok
test fetcher::test::queue::unit::empty_refs_items_can_be_equal ... ok
test fetcher::test::queue::unit::zero_timeout_accepted ... ok
test fetcher::test::queue::unit::merge_preserves_position_in_queue ... ok
test fetcher::test::state::command::cancel::non_existent_returns_unexpected ... ok
test fetcher::test::state::command::cancel::cancellation_is_isolated ... ok
test fetcher::test::state::command::cancel::ongoing_and_queued ... ok
test fetcher::test::state::command::cancel::single_ongoing ... ok
test fetcher::test::state::command::fetch::fetch_after_previous_completed ... ok
test fetcher::test::state::command::fetch::fetch_at_capacity_enqueues ... ok
test fetcher::test::state::command::fetch::fetch_different_repo_same_node_within_capacity ... ok
test fetcher::test::state::command::fetch::fetch_duplicate_returns_already_fetching ... ok
test fetcher::test::state::command::fetch::fetch_queue_merge_empty_refs_fetches_all ... ok
test fetcher::test::state::command::fetch::fetch_queue_merge_takes_longer_timeout ... ok
test fetcher::test::state::command::fetch::fetch_queue_merges_already_queued ... ok
test fetcher::test::state::command::fetch::fetch_queue_rejected_capacity_reached ... ok
test fetcher::test::state::command::fetch::fetch_same_repo_different_nodes_queues_second ... ok
test fetcher::test::state::command::fetch::fetch_same_repo_different_refs_enqueues ... ok
test fetcher::test::state::command::fetch::fetch_start_first_fetch_for_node ... ok
test fetcher::test::state::command::fetched::complete_one_of_multiple ... ok
test fetcher::test::state::command::fetched::complete_single_ongoing ... ok
test fetcher::test::state::command::fetched::complete_then_dequeue_fifo ... ok
test fetcher::test::state::command::fetched::non_existent_returns_not_found ... ok
test fetcher::test::state::concurrent::fetched_then_cancel ... ok
test fetcher::test::state::concurrent::interleaved_operations ... ok
test fetcher::test::state::config::min_queue_size ... ok
test fetcher::test::state::dequeue::cannot_dequeue_while_node_at_capacity ... ok
test fetcher::test::state::dequeue::empty_queue_returns_none ... ok
test fetcher::test::state::dequeue::maintains_fifo_order ... ok
test fetcher::test::state::invariant::queue_integrity_after_merge ... ok
test fetcher::test::queue::properties::merge::same_rid_merges_anywhere_in_queue ... ok
test fetcher::test::state::multinode::independent_queues ... ok
test service::filter::test::compatible ... ok
test service::filter::test::test_parameters ... ok
test service::filter::test::test_sizes ... ok
test fetcher::test::queue::properties::merge::succeed_when_at_capacity ... ok
test service::limiter::test::test_limiter_different_rates ... ok
test service::gossip::store::test::test_announced ... ok
test service::limiter::test::test_limiter_multi ... ok
test service::limiter::test::test_limiter_refill ... ok
test fetcher::test::state::config::high_concurrency ... ok
test service::message::tests::test_inventory_limit ... ok
test service::message::tests::test_ref_remote_limit ... ok
test wire::frame::test::test_encode_git_large ... ok
test wire::frame::test::test_stream_id ... ok
test fetcher::test::state::multinode::high_count ... ok
test wire::message::tests::prop_roundtrip_address ... ok
test service::message::tests::prop_refs_announcement_signing ... ok
test wire::message::tests::prop_zero_bytes_encode_decode ... ok
test wire::message::tests::test_inv_ann_max_size ... ok
test wire::message::tests::test_node_ann_max_size ... ok
test wire::message::tests::test_ping_encode_size_overflow - should panic ... ok
test wire::message::tests::test_pingpong_encode_max_size ... ok
test wire::message::tests::test_pong_encode_size_overflow - should panic ... ok
test service::message::tests::test_node_announcement_validate ... ok
test wire::tests::prop_oid ... ok
test wire::tests::prop_roundtrip_filter ... ok
test wire::message::tests::prop_roundtrip_message ... ok
test wire::tests::prop_roundtrip_refs ... ok
test wire::tests::prop_roundtrip_repoid ... ok
test wire::tests::prop_roundtrip_tuple ... ok
test wire::tests::prop_roundtrip_u16 ... ok
test wire::tests::prop_roundtrip_u32 ... ok
test wire::tests::prop_roundtrip_u64 ... ok
test wire::tests::prop_roundtrip_vec ... ok
test wire::tests::prop_signature ... ok
test wire::tests::prop_string ... ok
test wire::tests::test_alias ... ok
test wire::tests::test_bounded_vec_limit ... ok
test wire::tests::test_filter_invalid ... ok
test wire::tests::test_string ... ok
test wire::varint::test::prop_roundtrip_varint ... ok
test wire::varint::test::test_encode_overflow - should panic ... ok
test wire::varint::test::test_encoding ... ok
test wire::tests::prop_roundtrip_publickey ... ok
test wire::message::tests::test_refs_ann_max_size ... ok
test wire::message::tests::prop_message_decoder ... ok
test result: ok. 99 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.06s
Running unittests src/main.rs (target/debug/deps/git_remote_rad-c8a416587342b30d)
running 12 tests
test protocol::tests::test_empty ... ok
test protocol::tests::test_fetch ... ok
test protocol::tests::test_invalid ... ok
test protocol::tests::test_list ... ok
test protocol::tests::test_list_for_push ... ok
test protocol::tests::test_fetch_whitespace ... ok
test protocol::tests::test_capabilities ... ok
test protocol::tests::test_option ... ok
test protocol::tests::test_push ... ok
test protocol::tests::test_push_delete ... ok
test protocol::tests::test_option_whitespace_preservation ... ok
test protocol::tests::test_push_force ... ok
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/main.rs (target/debug/deps/radicle_schemars-2a9809926acfa67a)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_signals-edd60ee35e85748c)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_systemd-d0fb15a14ac3d4e9)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_term-51db4123a6bc434a)
running 21 tests
test ansi::tests::wrapping ... ok
test ansi::tests::colors_enabled ... ok
test ansi::tests::colors_disabled ... ok
test element::test::test_spaced ... ok
test cell::test::test_width ... ok
test element::test::test_truncate ... ok
test table::test::test_table ... ok
test element::test::test_width ... ok
test table::test::test_table_border_maximized ... ok
test table::test::test_table_border_truncated ... ok
test table::test::test_table_truncate ... ok
test table::test::test_table_border ... ok
test table::test::test_table_unicode ... ok
test table::test::test_table_unicode_truncate ... ok
test table::test::test_truncate ... ok
test textarea::test::test_wrapping ... ok
test textarea::test::test_wrapping_fenced_block ... ok
test textarea::test::test_wrapping_code_block ... ok
test vstack::test::test_vstack ... ok
test textarea::test::test_wrapping_paragraphs ... ok
test vstack::test::test_vstack_maximize ... ok
test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_windows-2c067555aa9e0165)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle
running 1 test
test crates/radicle/src/cob/patch/encoding/review.rs - cob::patch::encoding::review::Review (line 23) ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_cli
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_cli_test
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_cob
running 1 test
test crates/radicle-cob/src/backend/stable.rs - backend::stable::with_advanced_timestamp (line 56) ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_core
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_crypto
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_dag
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_fetch
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_git_metadata
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_git_ref_format
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_localtime
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_node
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_oid
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_protocol
running 6 tests
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::max (line 96) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::collect_from (line 30) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::truncate (line 50) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::with_capacity (line 66) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::unbound (line 149) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::push (line 122) ... ok
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_signals
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_systemd
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_term
running 1 test
test crates/radicle-term/src/table.rs - table (line 4) ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_windows
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
error: 1 target failed:
`-p radicle-cli --test commands`
Exit code: 101
{
"response": "finished",
"result": "failure"
}