rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwoodd060da6253b538fd6497c8053cef3bc8c1e780bd
{
"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": "1f5ef78b13b9bf2405bd9e41f68839511694b42a",
"author": {
"id": "did:key:z6MksR6r1FyqPwYstkA5NVPvf4tRkwye1tcwBBzLtYWR75m7",
"alias": "blocr"
},
"title": "radicle-remote-helper: Setting remote.rad.home for custom home",
"state": {
"status": "open",
"conflicts": []
},
"before": "07f748475beacd41463ee5ebc0d7a93539ab8f55",
"after": "d060da6253b538fd6497c8053cef3bc8c1e780bd",
"commits": [
"d060da6253b538fd6497c8053cef3bc8c1e780bd"
],
"target": "07f748475beacd41463ee5ebc0d7a93539ab8f55",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "1f5ef78b13b9bf2405bd9e41f68839511694b42a",
"author": {
"id": "did:key:z6MksR6r1FyqPwYstkA5NVPvf4tRkwye1tcwBBzLtYWR75m7",
"alias": "blocr"
},
"description": "This adds the ability to configure a RADICLE_HOME directory for the\nradicle-remote-helper in a gitconfig file, e.g. doing:\n\n```\n$ git config remote.rad.home ~/.radicle-alternative\n```\n\nThis is useful e.g. if one has multiple radicle home directories\non one machine.",
"base": "07f748475beacd41463ee5ebc0d7a93539ab8f55",
"oid": "d060da6253b538fd6497c8053cef3bc8c1e780bd",
"timestamp": 1781908494
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "b7e5846a-0d5d-4c8e-881a-af92e63c6abb"
},
"info_url": "https://cci.rad.levitte.org//b7e5846a-0d5d-4c8e-881a-af92e63c6abb.html"
}
Started at: 2026-06-20 00:35:04.885039+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/b7e5846a-0d5d-4c8e-881a-af92e63c6abb/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 186 issues · 42 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 1f5ef78b13b9bf2405bd9e41f68839511694b42a
✓ Switched to branch patch/1f5ef78 at revision 1f5ef78
✓ Branch patch/1f5ef78 setup to track rad/patches/1f5ef78b13b9bf2405bd9e41f68839511694b42a
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout d060da6253b538fd6497c8053cef3bc8c1e780bd
HEAD is now at d060da62 radicle-remote-helper: Setting remote.rad.home for custom home
Exit code: 0
$ rad patch show 1f5ef78b13b9bf2405bd9e41f68839511694b42a -p
╭───────────────────────────────────────────────────────────────────────────────╮
│ Title radicle-remote-helper: Setting remote.rad.home for custom home │
│ Patch 1f5ef78b13b9bf2405bd9e41f68839511694b42a │
│ Author blocr z6MksR6…YWR75m7 │
│ Head d060da6253b538fd6497c8053cef3bc8c1e780bd │
│ Base 07f748475beacd41463ee5ebc0d7a93539ab8f55 │
│ Branches patch/1f5ef78 │
│ Commits ahead 1, behind 0 │
│ Status open │
│ │
│ This adds the ability to configure a RADICLE_HOME directory for the │
│ radicle-remote-helper in a gitconfig file, e.g. doing: │
│ │
│ ``` │
│ $ git config remote.rad.home ~/.radicle-alternative │
│ ``` │
│ │
│ This is useful e.g. if one has multiple radicle home directories │
│ on one machine. │
├───────────────────────────────────────────────────────────────────────────────┤
│ d060da6 radicle-remote-helper: Setting remote.rad.home for custom home │
├───────────────────────────────────────────────────────────────────────────────┤
│ ● Revision 1f5ef78 @ 07f7484..d060da6 by blocr z6MksR6…YWR75m7 13 seconds ago │
╰───────────────────────────────────────────────────────────────────────────────╯
commit d060da6253b538fd6497c8053cef3bc8c1e780bd
Author: David Gumberg <davidzgumberg@gmail.com>
Date: Fri Jun 19 22:27:29 2026 +0000
radicle-remote-helper: Setting remote.rad.home for custom home
This adds the ability to configure a RADICLE_HOME directory for the
radicle-remote-helper in a gitconfig file, e.g. doing:
```
$ git config remote.rad.home ~/.radicle-alternative
```
This is useful e.g. if one has multiple radicle home directories
on one machine.
diff --git a/crates/radicle-remote-helper/src/main.rs b/crates/radicle-remote-helper/src/main.rs
index 5fc451959d..cbdb3da7c2 100644
--- a/crates/radicle-remote-helper/src/main.rs
+++ b/crates/radicle-remote-helper/src/main.rs
@@ -48,6 +48,26 @@ const VERSION: Version = Version {
timestamp: env!("SOURCE_DATE_EPOCH"),
};
+fn try_load_profile_from_repo() -> Result<Option<radicle::Profile>, String> {
+ let home_str = match git::raw::Repository::open_from_env()
+ .ok()
+ .and_then(|repo| repo.config().ok())
+ .and_then(|config| config.get_string("remote.rad.home").ok())
+ {
+ Some(s) => s,
+ // It is ok to continue if no home is set.
+ None => return Ok(None),
+ };
+
+ // It is not OK to continue if a home is set and there's an error loading it.
+ let home = radicle::profile::Home::new(PathBuf::from(home_str))
+ .map_err(|e| format!("Home::new(): {e}"))?;
+ let profile = radicle::Profile::load_from(home)
+ .map_err(|e| format!("Profile::load_from(): {e}"))?;
+
+ Ok(Some(profile))
+}
+
fn main() {
let mut args = env::args();
@@ -64,11 +84,18 @@ fn main() {
};
process::exit(0);
}
-
- let profile = match radicle::Profile::load() {
- Ok(profile) => profile,
- Err(err) => {
- eprintln!("error: couldn't load profile: {err}");
+
+ let profile = match try_load_profile_from_repo() {
+ Ok(Some(p)) => p,
+ Ok(None) => match radicle::Profile::load() {
+ Ok(profile) => profile,
+ Err(err) => {
+ eprintln!("error: couldn't load default profile: {err}");
+ process::exit(1);
+ }
+ }
+ Err(e) => {
+ eprintln!("error: loading profile from remote.rad.home: {e}");
process::exit(1);
}
};
diff --git a/crates/radicle/src/profile.rs b/crates/radicle/src/profile.rs
index b70867e8d2..5283b5fc76 100644
--- a/crates/radicle/src/profile.rs
+++ b/crates/radicle/src/profile.rs
@@ -275,8 +275,7 @@ impl Profile {
})
}
- pub fn load() -> Result<Self, Error> {
- let home = self::home()?;
+ pub fn load_from(home: Home) -> Result<Self, Error> {
let keystore = Keystore::new(&home.keys());
let public_key = keystore
.public_key()?
@@ -300,6 +299,11 @@ impl Profile {
})
}
+ pub fn load() -> Result<Self, Error> {
+ let home = self::home()?;
+ Self::load_from(home)
+ }
+
pub fn id(&self) -> &PublicKey {
&self.public_key
}
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 b7e5846a-0d5d-4c8e-881a-af92e63c6abb -v /opt/radcis/ci.rad.levitte.org/cci/state/b7e5846a-0d5d-4c8e-881a-af92e63c6abb/s:/b7e5846a-0d5d-4c8e-881a-af92e63c6abb/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/b7e5846a-0d5d-4c8e-881a-af92e63c6abb/w:/b7e5846a-0d5d-4c8e-881a-af92e63c6abb/w -w /b7e5846a-0d5d-4c8e-881a-af92e63c6abb/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /b7e5846a-0d5d-4c8e-881a-af92e63c6abb/s/script.sh
+ export 'RUSTDOCFLAGS=-D warnings'
+ RUSTDOCFLAGS='-D warnings'
+ cargo --version
info: syncing channel updates for '1.95-x86_64-unknown-linux-gnu'
info: latest update on 2026-04-16, rust version 1.95.0 (59807616e 2026-04-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.95.0 (f2d3ce0bd 2026-03-21)
+ rustc --version
rustc 1.95.0 (59807616e 2026-04-14)
+ cargo fmt --check
Diff in /b7e5846a-0d5d-4c8e-881a-af92e63c6abb/w/crates/radicle-remote-helper/src/main.rs:52:
let home_str = match git::raw::Repository::open_from_env()
.ok()
.and_then(|repo| repo.config().ok())
- .and_then(|config| config.get_string("remote.rad.home").ok())
+ .and_then(|config| config.get_string("remote.rad.home").ok())
{
Some(s) => s,
// It is ok to continue if no home is set.
Diff in /b7e5846a-0d5d-4c8e-881a-af92e63c6abb/w/crates/radicle-remote-helper/src/main.rs:62:
// It is not OK to continue if a home is set and there's an error loading it.
let home = radicle::profile::Home::new(PathBuf::from(home_str))
.map_err(|e| format!("Home::new(): {e}"))?;
- let profile = radicle::Profile::load_from(home)
- .map_err(|e| format!("Profile::load_from(): {e}"))?;
+ let profile =
+ radicle::Profile::load_from(home).map_err(|e| format!("Profile::load_from(): {e}"))?;
Ok(Some(profile))
}
Diff in /b7e5846a-0d5d-4c8e-881a-af92e63c6abb/w/crates/radicle-remote-helper/src/main.rs:84:
};
process::exit(0);
}
-
+
let profile = match try_load_profile_from_repo() {
Ok(Some(p)) => p,
Ok(None) => match radicle::Profile::load() {
Diff in /b7e5846a-0d5d-4c8e-881a-af92e63c6abb/w/crates/radicle-remote-helper/src/main.rs:93:
eprintln!("error: couldn't load default profile: {err}");
process::exit(1);
}
- }
+ },
Err(e) => {
eprintln!("error: loading profile from remote.rad.home: {e}");
process::exit(1);
Exit code: 1
{
"response": "finished",
"result": "failure"
}