rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood99f76542bc7a54c40d708d4d7e8d26291209ddea
{
"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": "Updated",
"patch": {
"id": "3cdbca1ba0685e41b5fad287563a3e1aaf5a513b",
"author": {
"id": "did:key:z6Mku8hpprWTmCv3BqkssCYDfr2feUdyLSUnycVajFo9XVAx",
"alias": "levitte"
},
"title": "Have 'rad patch show {git-oid}' show the oid range of each revision",
"state": {
"status": "open",
"conflicts": []
},
"before": "9fda8c6d8f8a00102a7983d9dfa9bc624c91daab",
"after": "99f76542bc7a54c40d708d4d7e8d26291209ddea",
"commits": [
"99f76542bc7a54c40d708d4d7e8d26291209ddea"
],
"target": "edde15d9ea700a70de04558fafc0b55360e9f5d2",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "3cdbca1ba0685e41b5fad287563a3e1aaf5a513b",
"author": {
"id": "did:key:z6Mku8hpprWTmCv3BqkssCYDfr2feUdyLSUnycVajFo9XVAx",
"alias": "levitte"
},
"description": "Each revision now shows a {base}..{head} range instead of just the\nhead. This is meant to clarify when a patch is rebased, and to be\nhelpful when one might want to observe changes using 'git range-diff'.\n\nAs an aside, convenient formatters of full oid, as well as both\nabridged and full oid range are added.",
"base": "7bac17146c40b32b2ce0e27b96a555a44f3ef2ba",
"oid": "54ab3a3828f05312b5722803ac60a130ae29f5cb",
"timestamp": 1774266099
},
{
"id": "771c137a07b928cdd484b11a5e87ac59c84faad4",
"author": {
"id": "did:key:z6Mku8hpprWTmCv3BqkssCYDfr2feUdyLSUnycVajFo9XVAx",
"alias": "levitte"
},
"description": "Fixup alignment of \"by ...\" in review lines",
"base": "7bac17146c40b32b2ce0e27b96a555a44f3ef2ba",
"oid": "ef07c1d113638feb2372a3ff5364c21f109a4b34",
"timestamp": 1774267029
},
{
"id": "f3130e93b26d1e30d2e6a3f592f6f8538304a7ca",
"author": {
"id": "did:key:z6Mku8hpprWTmCv3BqkssCYDfr2feUdyLSUnycVajFo9XVAx",
"alias": "levitte"
},
"description": "Rebased on fresher master",
"base": "9fda8c6d8f8a00102a7983d9dfa9bc624c91daab",
"oid": "99f76542bc7a54c40d708d4d7e8d26291209ddea",
"timestamp": 1774272140
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "d545a169-c602-4af7-8612-2c3d96f9cc5c"
},
"info_url": "https://cci.rad.levitte.org//d545a169-c602-4af7-8612-2c3d96f9cc5c.html"
}
Started at: 2026-03-30 15:35:51.515416+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/d545a169-c602-4af7-8612-2c3d96f9cc5c/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 153 issues · 40 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 3cdbca1ba0685e41b5fad287563a3e1aaf5a513b
✓ Switched to branch patch/3cdbca1 at revision f3130e9
✓ Branch patch/3cdbca1 setup to track rad/patches/3cdbca1ba0685e41b5fad287563a3e1aaf5a513b
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 99f76542bc7a54c40d708d4d7e8d26291209ddea
HEAD is now at 99f76542 Have 'rad patch show {git-oid}' show the oid range of each revision
Exit code: 0
$ rad patch show 3cdbca1ba0685e41b5fad287563a3e1aaf5a513b -p
╭───────────────────────────────────────────────────────────────────────────────╮
│ Title Have 'rad patch show {git-oid}' show the oid range of each revision │
│ Patch 3cdbca1ba0685e41b5fad287563a3e1aaf5a513b │
│ Author levitte z6Mku8h…Fo9XVAx │
│ Head 99f76542bc7a54c40d708d4d7e8d26291209ddea │
│ Base 9fda8c6d8f8a00102a7983d9dfa9bc624c91daab │
│ Branches patch/3cdbca1 │
│ Commits ahead 1, behind 31 │
│ Status open │
│ │
│ Each revision now shows a {base}..{head} range instead of just the │
│ head. This is meant to clarify when a patch is rebased, and to be │
│ helpful when one might want to observe changes using 'git range-diff'. │
│ │
│ As an aside, convenient formatters of full oid, as well as both │
│ abridged and full oid range are added. │
├───────────────────────────────────────────────────────────────────────────────┤
│ 99f7654 Have 'rad patch show {git-oid}' show the oid range of each revision │
├───────────────────────────────────────────────────────────────────────────────┤
│ ● Revision 3cdbca1 @ 54ab3a3 by levitte z6Mku8h…Fo9XVAx 1 week ago │
│ ↑ Revision 771c137 @ ef07c1d by levitte z6Mku8h…Fo9XVAx 1 week ago │
│ ↑ Revision f3130e9 @ 99f7654 by levitte z6Mku8h…Fo9XVAx 1 week ago │
╰───────────────────────────────────────────────────────────────────────────────╯
commit 99f76542bc7a54c40d708d4d7e8d26291209ddea
Author: Richard Levitte <richard@levitte.org>
Date: Mon Mar 23 12:37:19 2026 +0100
Have 'rad patch show {git-oid}' show the oid range of each revision
Each revision now shows a {base}..{head} range instead of just the
head. This is meant to clarify when a patch is rebased, and to be
helpful when one might want to observe changes using 'git range-diff'.
As an aside, convenient formatters of full oid, as well as both
abridged and full oid range are added.
diff --git a/crates/radicle-cli/src/terminal/format.rs b/crates/radicle-cli/src/terminal/format.rs
index f5b702f39..b95274514 100644
--- a/crates/radicle-cli/src/terminal/format.rs
+++ b/crates/radicle-cli/src/terminal/format.rs
@@ -32,11 +32,26 @@ pub fn node_id_human(node: &NodeId) -> Paint<String> {
Paint::new(node.to_human())
}
+/// Format a full git Oid.
+pub fn oid_full(oid: impl Into<radicle::git::Oid>) -> Paint<String> {
+ Paint::new(format!("{}", oid.into()))
+}
+
/// Format a git Oid.
pub fn oid(oid: impl Into<radicle::git::Oid>) -> Paint<String> {
Paint::new(format!("{:.7}", oid.into()))
}
+/// Format a full git Oid range.
+pub fn range_full(base: impl Into<radicle::git::Oid>, head: impl Into<radicle::git::Oid>) -> Paint<String> {
+ Paint::new(format!("{}..{}", base.into(), head.into()))
+}
+
+/// Format a git Oid range.
+pub fn range(base: impl Into<radicle::git::Oid>, head: impl Into<radicle::git::Oid>) -> Paint<String> {
+ Paint::new(format!("{:.7}..{:.7}", base.into(), head.into()))
+}
+
/// Wrap parenthesis around styled input, eg. `"input"` -> `"(input)"`.
pub fn parens<D: fmt::Display>(input: Paint<D>) -> Paint<String> {
Paint::new(format!("({})", input.item)).with_style(input.style)
diff --git a/crates/radicle-cli/src/terminal/patch/timeline.rs b/crates/radicle-cli/src/terminal/patch/timeline.rs
index b7a8e8343..4359e667c 100644
--- a/crates/radicle-cli/src/terminal/patch/timeline.rs
+++ b/crates/radicle-cli/src/terminal/patch/timeline.rs
@@ -53,6 +53,8 @@ struct RevisionEntry<'a> {
timestamp: cob::Timestamp,
/// The id of the [`Revision`].
id: RevisionId,
+ /// The commit base of the [`Revision`].
+ base: git::Oid,
/// The commit head of the [`Revision`].
head: git::Oid,
/// All [`Update`]s that occurred on the [`Revision`].
@@ -100,6 +102,7 @@ impl<'a> RevisionEntry<'a> {
author: Author::new(&revision.author().id, profile, verbose),
timestamp: revision.timestamp(),
id,
+ base: *revision.base(),
head: revision.head(),
updates: updates.into_iter().map(|(_, up)| up).collect(),
}
@@ -127,13 +130,13 @@ impl<'a> RevisionEntry<'a> {
let line = Line::spaced([icon.into(), dim("Revision").into(), id]).space();
let line = line
- .item(dim(if verbose { "with head" } else { "@" }))
+ .item(dim(if verbose { "with range" } else { "@" }))
.space();
let line = line.item(secondary(if verbose {
- Paint::new(self.head.to_string())
+ range_full(self.base, self.head)
} else {
- oid(self.head)
+ range(self.base, self.head)
}));
iter::once(
@@ -169,7 +172,7 @@ impl Update<'_> {
match self {
Update::Reviewed { review } => {
- let by = " ".repeat(if verbose { 0 } else { 13 }) + "by";
+ let by = " ".repeat(if verbose { 0 } else { 22 }) + "by";
let (symbol, verb) = match review.verdict() {
Some(Verdict::Accept) => (PREFIX_SUCCESS, positive("accepted")),
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 d545a169-c602-4af7-8612-2c3d96f9cc5c -v /opt/radcis/ci.rad.levitte.org/cci/state/d545a169-c602-4af7-8612-2c3d96f9cc5c/s:/d545a169-c602-4af7-8612-2c3d96f9cc5c/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/d545a169-c602-4af7-8612-2c3d96f9cc5c/w:/d545a169-c602-4af7-8612-2c3d96f9cc5c/w -w /d545a169-c602-4af7-8612-2c3d96f9cc5c/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /d545a169-c602-4af7-8612-2c3d96f9cc5c/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
Diff in /d545a169-c602-4af7-8612-2c3d96f9cc5c/w/crates/radicle-cli/src/terminal/format.rs:43:
}
/// Format a full git Oid range.
-pub fn range_full(base: impl Into<radicle::git::Oid>, head: impl Into<radicle::git::Oid>) -> Paint<String> {
+pub fn range_full(
+ base: impl Into<radicle::git::Oid>,
+ head: impl Into<radicle::git::Oid>,
+) -> Paint<String> {
Paint::new(format!("{}..{}", base.into(), head.into()))
}
Diff in /d545a169-c602-4af7-8612-2c3d96f9cc5c/w/crates/radicle-cli/src/terminal/format.rs:50:
/// Format a git Oid range.
-pub fn range(base: impl Into<radicle::git::Oid>, head: impl Into<radicle::git::Oid>) -> Paint<String> {
+pub fn range(
+ base: impl Into<radicle::git::Oid>,
+ head: impl Into<radicle::git::Oid>,
+) -> Paint<String> {
Paint::new(format!("{:.7}..{:.7}", base.into(), head.into()))
}
Exit code: 1
{
"response": "finished",
"result": "failure"
}