rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood130cf1096601fa01f013379c2c3c42cf5362197a
{
"request": "trigger",
"version": 1,
"event_type": "patch",
"repository": {
"id": "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5",
"name": "heartwood",
"description": "Radicle Heartwood Protocol & Stack",
"private": false,
"default_branch": "master",
"delegates": [
"did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT",
"did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
]
},
"action": "Created",
"patch": {
"id": "37aa2b6c81a500fb146aa24a1dd6b3c46acb41f3",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": null
},
"title": "remote-helper: Update Patch by ID Prefix",
"state": {
"status": "draft",
"conflicts": []
},
"before": "ee49e28766ce7c703b95e22d177cce046072f03d",
"after": "130cf1096601fa01f013379c2c3c42cf5362197a",
"commits": [
"130cf1096601fa01f013379c2c3c42cf5362197a",
"2fbdaac76c8a7fc3fbe3fb186b0344b6bec01050"
],
"target": "3419821106e274c96f56948a05d2f51f28f5a6c7",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "37aa2b6c81a500fb146aa24a1dd6b3c46acb41f3",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": null
},
"description": "`rad patch list` does not show full patch IDs by default, and overly\nlong patch IDs are cumbersome to handle.\n\nIf a unique prefix is used, allow updating patches identified by\nthat prefix.\n\nE.g. when there is exactly one patch with an ID that has a prefix of\n\"a\", then pushing to `refs/heads/patches/a` updates that patch.",
"base": "ee49e28766ce7c703b95e22d177cce046072f03d",
"oid": "361bf804b83b604a152f301492f87bee14915265",
"timestamp": 1759341679
},
{
"id": "af8688592d72980d51435f158944da64aa7f3888",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": null
},
"description": "Use variables directly in `format!` string.",
"base": "ee49e28766ce7c703b95e22d177cce046072f03d",
"oid": "130cf1096601fa01f013379c2c3c42cf5362197a",
"timestamp": 1759342461
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d"
},
"info_url": "https://cci.rad.levitte.org//7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d.html"
}
Started at: 2026-09-08 10:58:56.609372+02:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ Remote lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz added
✓ Remote-tracking branch lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz/master created for z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz
✓ Repository successfully cloned under /opt/radcis/ci.rad.levitte.org/cci/state/7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 189 issues · 37 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 37aa2b6c81a500fb146aa24a1dd6b3c46acb41f3
✓ Switched to branch patch/37aa2b6 at revision af86885
✓ Branch patch/37aa2b6 setup to track rad/patches/37aa2b6c81a500fb146aa24a1dd6b3c46acb41f3
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 130cf1096601fa01f013379c2c3c42cf5362197a
HEAD is now at 130cf109 remote-helper/push: Refactor ownership
Exit code: 0
$ rad patch show 37aa2b6c81a500fb146aa24a1dd6b3c46acb41f3 -p
╭───────────────────────────────────────────────────────────────────────────────╮
│ Title remote-helper: Update Patch by ID Prefix │
│ Patch 37aa2b6c81a500fb146aa24a1dd6b3c46acb41f3 │
│ Author lorenz z6MkkPv…WX5sTEz │
│ Head 130cf1096601fa01f013379c2c3c42cf5362197a │
│ Base ee49e28766ce7c703b95e22d177cce046072f03d │
│ Target master │
│ Branches patch/37aa2b6 │
│ Commits ahead 2, behind 772 │
│ Status draft │
│ │
│ `rad patch list` does not show full patch IDs by default, and overly │
│ long patch IDs are cumbersome to handle. │
│ │
│ If a unique prefix is used, allow updating patches identified by │
│ that prefix. │
│ │
│ E.g. when there is exactly one patch with an ID that has a prefix of │
│ "a", then pushing to `refs/heads/patches/a` updates that patch. │
├───────────────────────────────────────────────────────────────────────────────┤
│ 130cf10 remote-helper/push: Refactor ownership │
│ 2fbdaac remote-helper: Update Patch by ID Prefix │
├───────────────────────────────────────────────────────────────────────────────┤
│ ● Revision 37aa2b6 @ ee49e28..361bf80 by lorenz z6MkkPv…WX5sTEz 11 months ago │
│ ↑ Revision af86885 @ ee49e28..130cf10 by lorenz z6MkkPv…WX5sTEz 11 months ago │
╰───────────────────────────────────────────────────────────────────────────────╯
commit 130cf1096601fa01f013379c2c3c42cf5362197a
Author: Lorenz Leutgeb <lorenz.leutgeb@radicle.xyz>
Date: Wed Oct 1 19:48:54 2025 +0200
remote-helper/push: Refactor ownership
With the exception of keeping a copy of `dst`, ownership of the command
can be passed on. This makes for nicer format strings and slightly less
awkward argument handling and preambles in the functions:
- `patch_open`
- `patch_update`
- `push`
diff --git a/crates/radicle-remote-helper/src/push.rs b/crates/radicle-remote-helper/src/push.rs
index 394359657..1519cd22d 100644
--- a/crates/radicle-remote-helper/src/push.rs
+++ b/crates/radicle-remote-helper/src/push.rs
@@ -220,17 +220,17 @@ enum PushAction {
impl PushAction {
fn new(
- dst: &git::RefString,
+ dst: git::RefString,
patches: &cob::patch::Cache<
cob::patch::Patches<'_, storage::git::Repository>,
cob::cache::StoreWriter,
>,
) -> Result<Self, error::PushAction> {
- if dst == &*rad::PATCHES_REFNAME {
+ if dst == *rad::PATCHES_REFNAME {
return Ok(Self::OpenPatch);
}
- let dst = git::Qualified::from_refstr(dst)
+ let dst = git::Qualified::from_refstr(&dst)
.ok_or_else(|| error::PushAction::InvalidRef {
refname: dst.clone(),
})?
@@ -322,8 +322,9 @@ pub fn run(
let Ok(cmd) = Command::parse(&spec, &working) else {
return Err(Error::InvalidCommand(format!("push {spec}")));
};
- let result = match &cmd {
- Command::Delete(dst) => {
+ let dst = cmd.dst().to_string();
+ let result = match cmd {
+ Command::Delete(ref dst) => {
// Delete refs.
let refname = nid.to_namespace().join(dst);
let (canonical_ref, _) = &stored.head()?;
@@ -359,7 +360,7 @@ pub fn run(
patch,
} => patch_update(
src,
- *force,
+ force,
patch_id,
*patch,
&nid,
@@ -381,7 +382,7 @@ pub fn run(
let explorer = push(
src,
&dst,
- *force,
+ force,
&nid,
&working,
stored,
@@ -397,9 +398,9 @@ pub fn run(
// canonical branch.
if let Some(canonical) = rules.canonical(dst.clone(), stored) {
let object = working
- .find_object(**src, None)
+ .find_object(*src, None)
.map(|obj| git::canonical::Object::new(&obj))?
- .ok_or(Error::UnknownObjectType { oid: *src })?;
+ .ok_or(Error::UnknownObjectType { oid: src })?;
let canonical = canonical::Canonical::new(me, object, canonical)?;
match canonical.quorum() {
@@ -416,11 +417,11 @@ pub fn run(
match result {
// Let Git tooling know that this ref has been pushed.
Ok(resource) => {
- println!("ok {}", cmd.dst());
+ println!("ok {dst}");
ok.insert(spec, resource);
}
// Let Git tooling know that there was an error pushing the ref.
- Err(e) => println!("error {} {e}", cmd.dst()),
+ Err(e) => println!("error {dst} {e}"),
}
}
@@ -502,7 +503,7 @@ pub fn run(
/// Open a new patch.
fn patch_open<G>(
- src: &git::Oid,
+ src: git::Oid,
upstream: &Option<git::RefString>,
nid: &NodeId,
working: &git::raw::Repository,
@@ -518,7 +519,7 @@ fn patch_open<G>(
where
G: crypto::signature::Signer<crypto::Signature>,
{
- let head = *src;
+ let head = src;
let dst = git::refs::storage::staging::patch(nid, head);
// Before creating the patch, we must push the associated git objects to storage.
@@ -528,7 +529,7 @@ where
//
// In case the reference is not properly deleted, the next attempt to open a patch should
// not fail, since the reference will already exist with the correct OID.
- push_ref(src, &dst, false, stored.raw(), opts.verbosity)?;
+ push_ref(&src, &dst, false, stored.raw(), opts.verbosity)?;
let (_, target) = stored.canonical_head()?;
let base = if let Some(base) = opts.base {
@@ -660,7 +661,7 @@ where
/// Update an existing patch.
#[allow(clippy::too_many_arguments)]
fn patch_update<G>(
- src: &git::Oid,
+ commit: git::Oid,
force: bool,
patch_id: patch::PatchId,
patch: patch::Patch,
@@ -677,10 +678,9 @@ fn patch_update<G>(
where
G: crypto::signature::Signer<crypto::Signature>,
{
- let commit = *src;
let dst = git::refs::patch(&patch_id).with_namespace(nid.into());
- push_ref(src, &dst, force, stored.raw(), opts.verbosity)?;
+ push_ref(&commit, &dst, force, stored.raw(), opts.verbosity)?;
// Don't update patch if it already has a revision matching this commit.
if patch.revisions().any(|(_, r)| r.head() == commit) {
@@ -735,7 +735,7 @@ where
}
fn push<G>(
- src: &git::Oid,
+ head: git::Oid,
dst: &git::Qualified,
force: bool,
nid: &NodeId,
@@ -751,12 +751,11 @@ fn push<G>(
where
G: crypto::signature::Signer<crypto::Signature>,
{
- let head = *src;
let dst = dst.with_namespace(nid.into());
// It's ok for the destination reference to be unknown, eg. when pushing a new branch.
let old = stored.backend.find_reference(dst.as_str()).ok();
- push_ref(src, &dst, force, stored.raw(), verbosity)?;
+ push_ref(&head, &dst, force, stored.raw(), verbosity)?;
if let Some(old) = old {
let proj = stored.project()?;
commit 2fbdaac76c8a7fc3fbe3fb186b0344b6bec01050
Author: Lorenz Leutgeb <lorenz.leutgeb@radicle.xyz>
Date: Wed Oct 1 19:31:59 2025 +0200
remote-helper: Update Patch by ID Prefix
`rad patch list` does not show full patch IDs by default, and overly
long patch IDs are cumbersome to handle.
If a unique prefix is used, allow updating patches identified by
that prefix.
E.g. when there is exactly one patch with an ID that has a prefix of
"a", then pushing to `refs/heads/patches/a` updates that patch.
diff --git a/crates/radicle-cli/examples/rad-patch-update.md b/crates/radicle-cli/examples/rad-patch-update.md
index 55917b4e8..65d10d84a 100644
--- a/crates/radicle-cli/examples/rad-patch-update.md
+++ b/crates/radicle-cli/examples/rad-patch-update.md
@@ -72,3 +72,30 @@ $ rad patch show b6a23eb08656de0ef1fcc0b5fe8820841e5cb2e5
│ ↑ Revision ea7def3 @ 4d27214 by alice (you) now │
╰────────────────────────────────────────────────────╯
```
+
+Of course it is possible to update the patch via `git push` directly:
+
+```
+$ git mv README.md README.markdown
+$ git commit -q -m "Longer file extension"
+$ git push rad HEAD:patches/b6a23eb08656d
+$ rad patch show b6a23eb08656de0ef1fcc0b5fe8820841e5cb2e5
+╭────────────────────────────────────────────────────╮
+│ Title Not a real change │
+│ Patch b6a23eb08656de0ef1fcc0b5fe8820841e5cb2e5 │
+│ Author alice (you) │
+│ Head 344e9ca07a4bf4b68cae3676d42727e17135f889 │
+│ Base [.. ] │
+│ Branches feature/1 │
+│ Commits ahead 3, behind 0 │
+│ Status open │
+├────────────────────────────────────────────────────┤
+│ 344e9ca Longer file extension │
+│ 4d27214 Rename readme file │
+│ 51b2f0f Not a real change │
+├────────────────────────────────────────────────────┤
+│ ● Revision b6a23eb @ 51b2f0f by alice (you) now │
+│ ↑ Revision ea7def3 @ 4d27214 by alice (you) now │
+│ ↑ Revision 226fa43 @ 344e9ca by alice (you) now │
+╰────────────────────────────────────────────────────╯
+```
\ No newline at end of file
diff --git a/crates/radicle-remote-helper/src/push.rs b/crates/radicle-remote-helper/src/push.rs
index 2d305c070..394359657 100644
--- a/crates/radicle-remote-helper/src/push.rs
+++ b/crates/radicle-remote-helper/src/push.rs
@@ -6,7 +6,6 @@ mod error;
use std::collections::HashMap;
use std::io::IsTerminal;
use std::process::ExitStatus;
-use std::str::FromStr;
use std::{assert_eq, io};
use radicle::identity::crefs::GetCanonicalRefs as _;
@@ -211,8 +210,8 @@ impl Command {
enum PushAction {
OpenPatch,
UpdatePatch {
- dst: git::Qualified<'static>,
- patch: patch::PatchId,
+ patch_id: patch::PatchId,
+ patch: Box<patch::Patch>,
},
PushRef {
dst: git::Qualified<'static>,
@@ -220,28 +219,50 @@ enum PushAction {
}
impl PushAction {
- fn new(dst: &git::RefString) -> Result<Self, error::PushAction> {
+ fn new(
+ dst: &git::RefString,
+ patches: &cob::patch::Cache<
+ cob::patch::Patches<'_, storage::git::Repository>,
+ cob::cache::StoreWriter,
+ >,
+ ) -> Result<Self, error::PushAction> {
if dst == &*rad::PATCHES_REFNAME {
- Ok(Self::OpenPatch)
- } else {
- let dst = git::Qualified::from_refstr(dst)
- .ok_or_else(|| error::PushAction::InvalidRef {
- refname: dst.clone(),
- })?
- .to_owned();
-
- if let Some(oid) = dst.strip_prefix(git::refname!("refs/heads/patches")) {
- let patch = git::Oid::from_str(oid)
- .map_err(|err| error::PushAction::InvalidPatchId {
- suffix: oid.to_string(),
- source: err,
- })
- .map(patch::PatchId::from)?;
- Ok(Self::UpdatePatch { dst, patch })
- } else {
- Ok(Self::PushRef { dst })
- }
+ return Ok(Self::OpenPatch);
+ }
+
+ let dst = git::Qualified::from_refstr(dst)
+ .ok_or_else(|| error::PushAction::InvalidRef {
+ refname: dst.clone(),
+ })?
+ .to_owned();
+
+ let Some(oid) = dst.strip_prefix(git::refname!("refs/heads/patches")) else {
+ return Ok(Self::PushRef { dst });
+ };
+
+ let candidates = {
+ let result: Result<Vec<_>, _> = patches.list_by_prefix(oid.to_string())?.collect();
+ result?
+ };
+
+ if candidates.is_empty() {
+ return Err(error::PushAction::InvalidPatchId {
+ suffix: oid.to_string(),
+ });
+ } else if candidates.len() > 1 {
+ return Err(error::PushAction::AmbiguousPatchId {
+ suffix: oid.to_string(),
+ candidates: candidates.iter().map(|(id, _)| id.to_string()).collect(),
+ });
}
+
+ let mut candidates = candidates;
+ let (patch_id, patch) = candidates.remove(0);
+
+ Ok(Self::UpdatePatch {
+ patch_id,
+ patch: Box::new(patch),
+ })
}
}
@@ -319,7 +340,7 @@ pub fn run(
}
Command::Push(git::Refspec { src, dst, force }) => {
let patches = crate::patches_mut(profile, stored)?;
- let action = PushAction::new(dst)?;
+ let action = PushAction::new(dst, &patches)?;
match action {
PushAction::OpenPatch => patch_open(
@@ -333,11 +354,14 @@ pub fn run(
profile,
opts.clone(),
),
- PushAction::UpdatePatch { dst, patch } => patch_update(
+ PushAction::UpdatePatch {
+ patch_id,
+ patch,
+ } => patch_update(
src,
- &dst,
*force,
- patch,
+ patch_id,
+ *patch,
&nid,
&working,
stored,
@@ -637,9 +661,9 @@ where
#[allow(clippy::too_many_arguments)]
fn patch_update<G>(
src: &git::Oid,
- dst: &git::Qualified,
force: bool,
patch_id: patch::PatchId,
+ patch: patch::Patch,
nid: &NodeId,
working: &git::raw::Repository,
stored: &storage::git::Repository,
@@ -654,14 +678,10 @@ where
G: crypto::signature::Signer<crypto::Signature>,
{
let commit = *src;
- let dst = dst.with_namespace(nid.into());
+ let dst = git::refs::patch(&patch_id).with_namespace(nid.into());
push_ref(src, &dst, force, stored.raw(), opts.verbosity)?;
- let Ok(Some(patch)) = patches.get(&patch_id) else {
- return Err(Error::NotFound(patch_id));
- };
-
// Don't update patch if it already has a revision matching this commit.
if patch.revisions().any(|(_, r)| r.head() == commit) {
return Ok(None);
diff --git a/crates/radicle-remote-helper/src/push/error.rs b/crates/radicle-remote-helper/src/push/error.rs
index e65be9e1b..bd4067a92 100644
--- a/crates/radicle-remote-helper/src/push/error.rs
+++ b/crates/radicle-remote-helper/src/push/error.rs
@@ -1,5 +1,6 @@
use radicle::git;
use radicle::git::canonical;
+use radicle::patch;
use thiserror::Error;
#[derive(Debug, Error)]
@@ -36,11 +37,17 @@ pub struct HeadsDiverge {
#[derive(Debug, Error)]
pub enum PushAction {
+ #[error(transparent)]
+ Cache(#[from] patch::cache::Error),
#[error("invalid reference {refname}, expected qualified reference starting with `refs/`")]
InvalidRef { refname: git::RefString },
#[error("found refs/heads/patches/{suffix} where {suffix} was an invalid Patch ID")]
- InvalidPatchId {
+ InvalidPatchId { suffix: String },
+ #[error(
+ "found refs/heads/patches/{suffix} where {suffix} was an ambiguous among {candidates:?}"
+ )]
+ AmbiguousPatchId {
suffix: String,
- source: git::raw::Error,
+ candidates: Vec<String>,
},
}
diff --git a/crates/radicle/src/cob/patch/cache.rs b/crates/radicle/src/cob/patch/cache.rs
index b0b513891..842834207 100644
--- a/crates/radicle/src/cob/patch/cache.rs
+++ b/crates/radicle/src/cob/patch/cache.rs
@@ -46,6 +46,10 @@ pub trait Patches {
/// [`Patches::drafted`], [`Patches::merged`].
fn list_by_status(&self, status: &Status) -> Result<Self::Iter<'_>, Self::Error>;
+ /// List all patches in the store with an id that starts with the
+ /// given `prefix`.
+ fn list_by_prefix(&self, prefix: String) -> Result<Self::Iter<'_>, Self::Error>;
+
/// Get the [`PatchCounts`] of all the patches in the store.
fn counts(&self) -> Result<PatchCounts, Self::Error>;
@@ -469,6 +473,10 @@ where
query::list_by_status(&self.cache.db, &self.rid(), status)
}
+ fn list_by_prefix(&self, prefix: String) -> Result<Self::Iter<'_>, Self::Error> {
+ query::list_by_prefix(&self.cache.db, &self.rid(), prefix)
+ }
+
fn counts(&self) -> Result<PatchCounts, Self::Error> {
query::counts(&self.cache.db, &self.rid())
}
@@ -530,6 +538,22 @@ where
.map_err(super::Error::from)
}
+ fn list_by_prefix(&self, prefix: String) -> Result<Self::Iter<'_>, Self::Error> {
+ self.store
+ .all()
+ .map(move |inner| NoCacheIter {
+ inner: Box::new(inner.into_iter().filter_map(move |res| {
+ match res {
+ Ok((id, patch)) => (id.to_string().starts_with(&prefix))
+ .then_some((id, patch))
+ .map(Ok),
+ Err(e) => Some(Err(e.into())),
+ }
+ })),
+ })
+ .map_err(super::Error::from)
+ }
+
fn counts(&self) -> Result<PatchCounts, Self::Error> {
self.store.counts().map_err(super::Error::from)
}
@@ -561,6 +585,10 @@ where
query::list_by_status(&self.cache.db, &self.rid(), status)
}
+ fn list_by_prefix(&self, prefix: String) -> Result<Self::Iter<'_>, Self::Error> {
+ query::list_by_prefix(&self.cache.db, &self.rid(), prefix)
+ }
+
fn counts(&self) -> Result<PatchCounts, Self::Error> {
query::counts(&self.cache.db, &self.rid())
}
@@ -650,6 +678,26 @@ mod query {
})
}
+ pub(super) fn list_by_prefix<'a>(
+ db: &'a sql::ConnectionThreadSafe,
+ rid: &RepoId,
+ prefix: String,
+ ) -> Result<PatchesIter<'a>, Error> {
+ let mut stmt = db.prepare(
+ "SELECT patches.id, patch
+ FROM patches
+ WHERE repo = ?1
+ AND id LIKE ?2 || '%'
+ ORDER BY id
+ ",
+ )?;
+ stmt.bind((1, rid))?;
+ stmt.bind((2, sql::Value::String(prefix)))?;
+ Ok(PatchesIter {
+ inner: stmt.into_iter(),
+ })
+ }
+
pub(super) fn list_by_status<'a>(
db: &'a sql::ConnectionThreadSafe,
rid: &RepoId,
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 cargo test --workspace --no-fail-fast '
Commands:
$ podman run --name 7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d -v /opt/radcis/ci.rad.levitte.org/cci/state/7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d/s:/7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d/w:/7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d/w -w /7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d/s/script.sh
+ export 'RUSTDOCFLAGS=-D warnings'
+ RUSTDOCFLAGS='-D warnings'
+ cargo --version
info: syncing channel updates for '1.88-x86_64-unknown-linux-gnu'
info: latest update on 2025-06-26, rust version 1.88.0 (6b00bc388 2025-06-23)
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.88.0 (873a06493 2025-05-10)
+ rustc --version
rustc 1.88.0 (6b00bc388 2025-06-23)
+ cargo fmt --check
Diff in /7e89c5f0-5358-41aa-b8a2-f0c4b89cd89d/w/crates/radicle-remote-helper/src/push.rs:355:
profile,
opts.clone(),
),
- PushAction::UpdatePatch {
- patch_id,
- patch,
- } => patch_update(
+ PushAction::UpdatePatch { patch_id, patch } => patch_update(
src,
force,
patch_id,
Exit code: 1
{
"response": "finished",
"result": "failure"
}