rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood82eb1699ed68d52f15831446c8850d72800053aa
{
"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": "3097a313c10fb5800026755f0634634582f14aea",
"author": {
"id": "did:key:z6Mku8hpprWTmCv3BqkssCYDfr2feUdyLSUnycVajFo9XVAx",
"alias": "levitte"
},
"title": "cli/inspect: use Clap",
"state": {
"status": "draft",
"conflicts": []
},
"before": "38ca038a0d695875bc6ea73ae88e048622dbc846",
"after": "82eb1699ed68d52f15831446c8850d72800053aa",
"commits": [
"82eb1699ed68d52f15831446c8850d72800053aa"
],
"target": "38ca038a0d695875bc6ea73ae88e048622dbc846",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "3097a313c10fb5800026755f0634634582f14aea",
"author": {
"id": "did:key:z6Mku8hpprWTmCv3BqkssCYDfr2feUdyLSUnycVajFo9XVAx",
"alias": "levitte"
},
"description": "",
"base": "38ca038a0d695875bc6ea73ae88e048622dbc846",
"oid": "c09fca6aee40b575d3224ce39bdf9bb6e85362e2",
"timestamp": 1760873000
},
{
"id": "75e35bdfe09f236fc52497e21c114c1885371fe8",
"author": {
"id": "did:key:z6Mku8hpprWTmCv3BqkssCYDfr2feUdyLSUnycVajFo9XVAx",
"alias": "levitte"
},
"description": "A bit better structuring, I hope",
"base": "38ca038a0d695875bc6ea73ae88e048622dbc846",
"oid": "82eb1699ed68d52f15831446c8850d72800053aa",
"timestamp": 1760878533
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "157b879f-da8d-48fa-8fcf-fae376502157"
},
"info_url": "https://cci.rad.levitte.org//157b879f-da8d-48fa-8fcf-fae376502157.html"
}
Started at: 2025-10-19 14:55:34.937838+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/157b879f-da8d-48fa-8fcf-fae376502157/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 125 issues · 15 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 3097a313c10fb5800026755f0634634582f14aea
✓ Switched to branch patch/3097a31 at revision 75e35bd
✓ Branch patch/3097a31 setup to track rad/patches/3097a313c10fb5800026755f0634634582f14aea
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 82eb1699ed68d52f15831446c8850d72800053aa
HEAD is now at 82eb1699 cli/inspect: use Clap
Exit code: 0
$ git show 82eb1699ed68d52f15831446c8850d72800053aa
commit 82eb1699ed68d52f15831446c8850d72800053aa
Author: Richard Levitte <richard@levitte.org>
Date: Sun Oct 19 12:13:18 2025 +0200
cli/inspect: use Clap
diff --git a/crates/radicle-cli/examples/rad-init-existing-bare.md b/crates/radicle-cli/examples/rad-init-existing-bare.md
index ea727896..21cc7ea2 100644
--- a/crates/radicle-cli/examples/rad-init-existing-bare.md
+++ b/crates/radicle-cli/examples/rad-init-existing-bare.md
@@ -7,7 +7,7 @@ f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354
```
We can see it's not a Radicle working copy:
-``` (fail)
+``` (stderr) (fail)
$ rad .
✗ Error: Current directory is not a Radicle repository
```
diff --git a/crates/radicle-cli/examples/rad-init-existing.md b/crates/radicle-cli/examples/rad-init-existing.md
index db77e809..b333c10e 100644
--- a/crates/radicle-cli/examples/rad-init-existing.md
+++ b/crates/radicle-cli/examples/rad-init-existing.md
@@ -7,7 +7,7 @@ f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354
```
We can see it's not a Radicle working copy:
-``` (fail)
+``` (stderr) (fail)
$ rad .
✗ Error: Current directory is not a Radicle repository
```
diff --git a/crates/radicle-cli/src/commands/help.rs b/crates/radicle-cli/src/commands/help.rs
index fee59faa..c23a6c00 100644
--- a/crates/radicle-cli/src/commands/help.rs
+++ b/crates/radicle-cli/src/commands/help.rs
@@ -72,7 +72,10 @@ const COMMANDS: &[CommandItem] = &[
about: crate::commands::init::ABOUT,
},
CommandItem::Lexopt(crate::commands::inbox::HELP),
- CommandItem::Lexopt(crate::commands::inspect::HELP),
+ CommandItem::Clap {
+ name: "inspect",
+ about: crate::commands::inspect::ABOUT,
+ },
CommandItem::Clap {
name: "issue",
about: crate::commands::issue::ABOUT,
diff --git a/crates/radicle-cli/src/commands/inspect.rs b/crates/radicle-cli/src/commands/inspect.rs
index 92e5c821..6c68a691 100644
--- a/crates/radicle-cli/src/commands/inspect.rs
+++ b/crates/radicle-cli/src/commands/inspect.rs
@@ -1,6 +1,12 @@
#![allow(clippy::or_fun_call)]
+
+mod args;
+
+pub use args::Args;
+pub(crate) use args::Target;
+pub(crate) use args::ABOUT;
+
use std::collections::HashMap;
-use std::ffi::OsString;
use std::path::Path;
use std::str::FromStr;
@@ -16,262 +22,167 @@ use radicle::storage::refs::RefsAt;
use radicle::storage::{ReadRepository, ReadStorage};
use crate::terminal as term;
-use crate::terminal::args::{Args, Error, Help};
use crate::terminal::json;
use crate::terminal::Element;
-pub const HELP: Help = Help {
- name: "inspect",
- description: "Inspect a Radicle repository",
- version: env!("RADICLE_VERSION"),
- usage: r#"
-Usage
-
- rad inspect <path> [<option>...]
- rad inspect <rid> [<option>...]
- rad inspect [<option>...]
-
- Inspects the given path or RID. If neither is specified,
- the current repository is inspected.
-
-Options
-
- --rid Return the repository identifier (RID)
- --payload Inspect the repository's identity payload
- --refs Inspect the repository's refs on the local device
- --sigrefs Inspect the values of `rad/sigrefs` for all remotes of this repository
- --identity Inspect the identity document
- --visibility Inspect the repository's visibility
- --delegates Inspect the repository's delegates
- --policy Inspect the repository's seeding policy
- --history Show the history of the repository identity document
- --help Print help
-"#,
-};
-
-#[derive(Default, Debug, Eq, PartialEq)]
-pub enum Target {
- Refs,
- Payload,
- Delegates,
- Identity,
- Visibility,
- Sigrefs,
- Policy,
- History,
- #[default]
- RepoId,
-}
-
-#[derive(Default, Debug, Eq, PartialEq)]
-pub struct Options {
- pub rid: Option<RepoId>,
- pub target: Target,
-}
-
-impl Args for Options {
- fn from_args(args: Vec<OsString>) -> anyhow::Result<(Self, Vec<OsString>)> {
- use lexopt::prelude::*;
-
- let mut parser = lexopt::Parser::from_args(args);
- let mut rid: Option<RepoId> = None;
- let mut target = Target::default();
-
- while let Some(arg) = parser.next()? {
- match arg {
- Long("help") | Short('h') => {
- return Err(Error::Help.into());
- }
- Long("refs") => {
- target = Target::Refs;
- }
- Long("payload") => {
- target = Target::Payload;
- }
- Long("policy") => {
- target = Target::Policy;
- }
- Long("delegates") => {
- target = Target::Delegates;
- }
- Long("history") => {
- target = Target::History;
- }
- Long("identity") => {
- target = Target::Identity;
- }
- Long("sigrefs") => {
- target = Target::Sigrefs;
- }
- Long("rid") => {
- target = Target::RepoId;
- }
- Long("visibility") => {
- target = Target::Visibility;
- }
- Value(val) if rid.is_none() => {
- let val = val.to_string_lossy();
-
- if let Ok(val) = RepoId::from_str(&val) {
- rid = Some(val);
- } else {
- rid = radicle::rad::at(Path::new(val.as_ref()))
- .map(|(_, id)| Some(id))
- .context("Supplied argument is not a valid path")?;
- }
- }
- _ => anyhow::bail!(arg.unexpected()),
+pub fn run(args: Args, ctx: impl term::Context) -> anyhow::Result<()> {
+ let rid = match args.repo {
+ Some(rid) => {
+ if let Ok(val) = RepoId::from_str(&rid) {
+ val
+ } else {
+ radicle::rad::at(Path::new(&rid))
+ .map(|(_, id)| id)
+ .context("Supplied argument is not a valid path")?
}
- }
-
- Ok((Options { rid, target }, vec![]))
- }
-}
-
-pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
- let rid = match options.rid {
- Some(rid) => rid,
+ },
None => radicle::rad::cwd()
.map(|(_, rid)| rid)
.context("Current directory is not a Radicle repository")?,
};
- if options.target == Target::RepoId {
+ let target = match args.target {
+ None => Target {
+ rid: true,
+ payload: false,
+ refs: false,
+ sigrefs: false,
+ identity: false,
+ visibility: false,
+ delegates: false,
+ policy: false,
+ history: false,
+ },
+ Some(target) => target,
+ };
+
+ if target.rid {
term::info!("{}", term::format::highlight(rid.urn()));
return Ok(());
}
+
let profile = ctx.profile()?;
let storage = &profile.storage;
- match options.target {
- Target::Refs => {
- let (repo, _) = repo(rid, storage)?;
- refs(&repo)?;
- }
- Target::Payload => {
- let (_, doc) = repo(rid, storage)?;
- json::to_pretty(&doc.payload(), Path::new("radicle.json"))?.print();
+ if target.refs {
+ let (repo, _) = repo(rid, storage)?;
+ refs(&repo)?;
+ } else if target.payload {
+ let (_, doc) = repo(rid, storage)?;
+ json::to_pretty(&doc.payload(), Path::new("radicle.json"))?.print();
+ } else if target.identity {
+ let (_, doc) = repo(rid, storage)?;
+ json::to_pretty(&*doc, Path::new("radicle.json"))?.print();
+ } else if target.sigrefs {
+ let (repo, _) = repo(rid, storage)?;
+ for remote in repo.remote_ids()? {
+ let remote = remote?;
+ let refs = RefsAt::new(&repo, remote)?;
+
+ println!(
+ "{:<48} {}",
+ term::format::tertiary(remote.to_human()),
+ term::format::secondary(refs.at)
+ );
}
- Target::Identity => {
- let (_, doc) = repo(rid, storage)?;
- json::to_pretty(&*doc, Path::new("radicle.json"))?.print();
- }
- Target::Sigrefs => {
- let (repo, _) = repo(rid, storage)?;
- for remote in repo.remote_ids()? {
- let remote = remote?;
- let refs = RefsAt::new(&repo, remote)?;
-
+ } else if target.policy {
+ let policies = profile.policies()?;
+ let seed = policies.seed_policy(&rid)?;
+ match seed.policy {
+ SeedingPolicy::Allow { scope } => {
println!(
- "{:<48} {}",
- term::format::tertiary(remote.to_human()),
- term::format::secondary(refs.at)
+ "Repository {} is {} with scope {}",
+ term::format::tertiary(&rid),
+ term::format::positive("being seeded"),
+ term::format::dim(format!("`{scope}`"))
);
}
- }
- Target::Policy => {
- let policies = profile.policies()?;
- let seed = policies.seed_policy(&rid)?;
- match seed.policy {
- SeedingPolicy::Allow { scope } => {
- println!(
- "Repository {} is {} with scope {}",
- term::format::tertiary(&rid),
- term::format::positive("being seeded"),
- term::format::dim(format!("`{scope}`"))
- );
- }
- SeedingPolicy::Block => {
- println!(
- "Repository {} is {}",
- term::format::tertiary(&rid),
- term::format::negative("not being seeded"),
- );
- }
+ SeedingPolicy::Block => {
+ println!(
+ "Repository {} is {}",
+ term::format::tertiary(&rid),
+ term::format::negative("not being seeded"),
+ );
}
}
- Target::Delegates => {
- let (_, doc) = repo(rid, storage)?;
- let aliases = profile.aliases();
- for did in doc.delegates().iter() {
- if let Some(alias) = aliases.alias(did) {
- println!(
- "{} {}",
- term::format::tertiary(&did),
- term::format::parens(term::format::dim(alias))
- );
- } else {
- println!("{}", term::format::tertiary(&did));
- }
+ } else if target.delegates {
+ let (_, doc) = repo(rid, storage)?;
+ let aliases = profile.aliases();
+ for did in doc.delegates().iter() {
+ if let Some(alias) = aliases.alias(did) {
+ println!(
+ "{} {}",
+ term::format::tertiary(&did),
+ term::format::parens(term::format::dim(alias))
+ );
+ } else {
+ println!("{}", term::format::tertiary(&did));
}
}
- Target::Visibility => {
- let (_, doc) = repo(rid, storage)?;
- println!("{}", term::format::visibility(doc.visibility()));
- }
- Target::History => {
- let (repo, _) = repo(rid, storage)?;
- let identity = Identity::load(&repo)?;
- let head = repo.identity_head()?;
- let history = repo.revwalk(head)?;
-
- for oid in history {
- let oid = oid?.into();
- let tip = repo.commit(oid)?;
-
- let Some(revision) = identity.revision(&tip.id().into()) else {
- continue;
- };
- if !revision.is_accepted() {
- continue;
- }
- let doc = &revision.doc;
- let timezone = if tip.time().sign() == '+' {
- #[allow(deprecated)]
- FixedOffset::east(tip.time().offset_minutes() * 60)
- } else {
- #[allow(deprecated)]
- FixedOffset::west(tip.time().offset_minutes() * 60)
- };
- let time = DateTime::<Utc>::from(
- std::time::UNIX_EPOCH
- + std::time::Duration::from_secs(tip.time().seconds() as u64),
- )
+ } else if target.visibility {
+ let (_, doc) = repo(rid, storage)?;
+ println!("{}", term::format::visibility(doc.visibility()));
+ } else if target.history {
+ let (repo, _) = repo(rid, storage)?;
+ let identity = Identity::load(&repo)?;
+ let head = repo.identity_head()?;
+ let history = repo.revwalk(head)?;
+
+ for oid in history {
+ let oid = oid?.into();
+ let tip = repo.commit(oid)?;
+
+ let Some(revision) = identity.revision(&tip.id().into()) else {
+ continue;
+ };
+ if !revision.is_accepted() {
+ continue;
+ }
+ let doc = &revision.doc;
+ let timezone = if tip.time().sign() == '+' {
+ #[allow(deprecated)]
+ FixedOffset::east(tip.time().offset_minutes() * 60)
+ } else {
+ #[allow(deprecated)]
+ FixedOffset::west(tip.time().offset_minutes() * 60)
+ };
+ let time = DateTime::<Utc>::from(
+ std::time::UNIX_EPOCH
+ + std::time::Duration::from_secs(tip.time().seconds() as u64),
+ )
.with_timezone(&timezone)
.to_rfc2822();
- println!(
- "{} {}",
- term::format::yellow("commit"),
- term::format::yellow(oid),
- );
- if let Ok(parent) = tip.parent_id(0) {
- println!("parent {parent}");
- }
- println!("blob {}", revision.blob);
- println!("date {time}");
- println!();
-
- if let Some(msg) = tip.message() {
- for line in msg.lines() {
- if line.is_empty() {
- println!();
- } else {
- term::indented(term::format::dim(line));
- }
+ println!(
+ "{} {}",
+ term::format::yellow("commit"),
+ term::format::yellow(oid),
+ );
+ if let Ok(parent) = tip.parent_id(0) {
+ println!("parent {parent}");
+ }
+ println!("blob {}", revision.blob);
+ println!("date {time}");
+ println!();
+
+ if let Some(msg) = tip.message() {
+ for line in msg.lines() {
+ if line.is_empty() {
+ println!();
+ } else {
+ term::indented(term::format::dim(line));
}
- term::blank();
- }
- for line in json::to_pretty(&doc, Path::new("radicle.json"))? {
- println!(" {line}");
}
-
- println!();
+ term::blank();
}
+ for line in json::to_pretty(&doc, Path::new("radicle.json"))? {
+ println!(" {line}");
+ }
+
+ println!();
}
- Target::RepoId => {
- // Handled above.
- }
+ } else if target.rid {
+ // Handled above.
}
Ok(())
diff --git a/crates/radicle-cli/src/commands/inspect/args.rs b/crates/radicle-cli/src/commands/inspect/args.rs
new file mode 100644
index 00000000..d4450000
--- /dev/null
+++ b/crates/radicle-cli/src/commands/inspect/args.rs
@@ -0,0 +1,50 @@
+use clap::Parser;
+
+pub(crate) const ABOUT: &str = "Inspect a Radicle repository";
+const LONG_ABOUT: &str = r#"Inspects the given path or RID. If neither is specified,
+the current repository is inspected.
+"#;
+
+// Idea stolen from https://stackoverflow.com/a/76315811/6108256 - /RL
+
+#[derive(Debug, clap::Args)]
+#[group(multiple = false)]
+pub(crate) struct Target {
+ /// Return the repository identifier (RID)
+ #[arg(long)]
+ pub(crate) rid: bool,
+ /// Inspect the repository's identity payload
+ #[arg(long)]
+ pub(crate) payload: bool,
+ /// Inspect the repository's refs on the local device
+ #[arg(long)]
+ pub(crate) refs: bool,
+ /// Inspect the values of `rad/sigrefs` for all remotes of this repository
+ #[arg(long)]
+ pub(crate) sigrefs: bool,
+ /// Inspect the identity document
+ #[arg(long)]
+ pub(crate) identity: bool,
+ /// Inspect the repository's visibility
+ #[arg(long)]
+ pub(crate) visibility: bool,
+ /// Inspect the repository's delegates
+ #[arg(long)]
+ pub(crate) delegates: bool,
+ /// Inspect the repository's seeding policy
+ #[arg(long)]
+ pub(crate) policy: bool,
+ /// Show the history of the repository identity document
+ #[arg(long)]
+ pub(crate) history: bool,
+}
+
+#[derive(Debug, Parser)]
+#[command(about = ABOUT, long_about = LONG_ABOUT, disable_version_flag = true)]
+pub struct Args {
+ /// Repository, byt RID or by path
+ #[arg(value_name = "RID|PATH")]
+ pub(crate) repo: Option<String>,
+ #[clap(flatten)]
+ pub(crate) target: Option<Target>,
+}
diff --git a/crates/radicle-cli/src/main.rs b/crates/radicle-cli/src/main.rs
index 8d6be2cf..b9959d27 100644
--- a/crates/radicle-cli/src/main.rs
+++ b/crates/radicle-cli/src/main.rs
@@ -67,6 +67,7 @@ enum Commands {
Fork(fork::Args),
Id(id::Args),
Init(init::Args),
+ Inspect(inspect::Args),
Issue(issue::Args),
Ls(ls::Args),
Path(path::Args),
@@ -267,11 +268,9 @@ pub(crate) fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyho
}
}
"inspect" => {
- term::run_command_args::<inspect::Options, _>(
- inspect::HELP,
- inspect::run,
- args.to_vec(),
- );
+ if let Some(Commands::Inspect(args)) = CliArgs::parse().command {
+ term::run_command_fn(inspect::run, args);
+ }
}
"issue" => {
if let Some(Commands::Issue(args)) = CliArgs::parse().command {
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 157b879f-da8d-48fa-8fcf-fae376502157 -v /opt/radcis/ci.rad.levitte.org/cci/state/157b879f-da8d-48fa-8fcf-fae376502157/s:/157b879f-da8d-48fa-8fcf-fae376502157/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/157b879f-da8d-48fa-8fcf-fae376502157/w:/157b879f-da8d-48fa-8fcf-fae376502157/w -w /157b879f-da8d-48fa-8fcf-fae376502157/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:bookworm bash /157b879f-da8d-48fa-8fcf-fae376502157/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 /157b879f-da8d-48fa-8fcf-fae376502157/w/crates/radicle-cli/src/commands/inspect.rs:35:
.map(|(_, id)| id)
.context("Supplied argument is not a valid path")?
}
- },
+ }
None => radicle::rad::cwd()
.map(|(_, rid)| rid)
.context("Current directory is not a Radicle repository")?,
Diff in /157b879f-da8d-48fa-8fcf-fae376502157/w/crates/radicle-cli/src/commands/inspect.rs:147:
FixedOffset::west(tip.time().offset_minutes() * 60)
};
let time = DateTime::<Utc>::from(
- std::time::UNIX_EPOCH
- + std::time::Duration::from_secs(tip.time().seconds() as u64),
+ std::time::UNIX_EPOCH + std::time::Duration::from_secs(tip.time().seconds() as u64),
)
- .with_timezone(&timezone)
- .to_rfc2822();
+ .with_timezone(&timezone)
+ .to_rfc2822();
println!(
"{} {}",
Exit code: 1
{
"response": "finished",
"result": "failure"
}