From 8865b5596e7c3a154cd90fe171d373139fec8636 Mon Sep 17 00:00:00 2001 From: Lorenz Leutgeb Date: Wed, 27 Nov 2024 17:00:13 +0100 Subject: [PATCH] cli/cob: Allow showing multiple COBs at once --- radicle-cli/src/commands/cob.rs | 65 ++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/radicle-cli/src/commands/cob.rs b/radicle-cli/src/commands/cob.rs index 2f4f2aab..916b2f26 100644 --- a/radicle-cli/src/commands/cob.rs +++ b/radicle-cli/src/commands/cob.rs @@ -72,7 +72,7 @@ enum Operation { Migrate, Show { repo: RepoId, - rev: Rev, + revs: Vec, type_name: cob::TypeName, }, } @@ -94,7 +94,7 @@ impl Args for Options { let mut parser = lexopt::Parser::from_args(args); let mut op: Option = None; let mut type_name: Option = None; - let mut oid: Option = None; + let mut revs: Vec = vec![]; let mut rid: Option = None; let mut format: Option = None; @@ -118,7 +118,7 @@ impl Args for Options { let v = parser.value()?; let v = term::args::string(&v); - oid = Some(Rev::from(v)); + revs.push(Rev::from(v)); } Long("repo") => { let v = parser.value()?; @@ -156,19 +156,22 @@ impl Args for Options { }, OperationName::Log => Operation::Log { repo: repo?, - rev: oid.ok_or_else(|| { + rev: revs.pop().ok_or_else(|| { anyhow!("an object id must be specified with `--object`") })?, type_name: type_name?, }, OperationName::Migrate => Operation::Migrate, - OperationName::Show => Operation::Show { - repo: repo?, - rev: oid.ok_or_else(|| { - anyhow!("an object id must be specified with `--object`") - })?, - type_name: type_name?, - }, + OperationName::Show => { + if revs.is_empty() { + anyhow::bail!("an object id must be specified with `--object`") + } + Operation::Show { + repo: repo?, + revs, + type_name: type_name?, + } + } } }, format: format.unwrap_or(Format::Pretty), @@ -219,33 +222,43 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> { } Operation::Show { repo, - rev: oid, + revs, type_name, } => { let repo = storage.repository(repo)?; - let oid = &oid.resolve(&repo.backend)?; if type_name == cob::patch::TYPENAME.clone() { let patches = term::cob::patches(&profile, &repo)?; - let Some(patch) = patches.get(oid)? else { - anyhow::bail!(cob::store::Error::NotFound(type_name, *oid)) - }; - serde_json::to_writer_pretty(std::io::stdout(), &patch)? + for oid in revs { + let oid = &oid.resolve(&repo.backend)?; + let Some(patch) = patches.get(oid)? else { + anyhow::bail!(cob::store::Error::NotFound(type_name, *oid)) + }; + serde_json::to_writer_pretty(std::io::stdout(), &patch)?; + println!() + } } else if type_name == cob::issue::TYPENAME.clone() { let issues = term::cob::issues(&profile, &repo)?; - let Some(issue) = issues.get(oid)? else { - anyhow::bail!(cob::store::Error::NotFound(type_name, *oid)) - }; - serde_json::to_writer_pretty(std::io::stdout(), &issue)? + for oid in revs { + let oid = &oid.resolve(&repo.backend)?; + let Some(issue) = issues.get(oid)? else { + anyhow::bail!(cob::store::Error::NotFound(type_name, *oid)) + }; + serde_json::to_writer_pretty(std::io::stdout(), &issue)?; + println!() + } } else if type_name == cob::identity::TYPENAME.clone() { - let Some(cob) = cob::get::(&repo, &type_name, oid)? else { - anyhow::bail!(cob::store::Error::NotFound(type_name, *oid)) - }; - serde_json::to_writer_pretty(std::io::stdout(), &cob.object)? + for oid in revs { + let oid = &oid.resolve(&repo.backend)?; + let Some(cob) = cob::get::(&repo, &type_name, oid)? else { + anyhow::bail!(cob::store::Error::NotFound(type_name, *oid)) + }; + serde_json::to_writer_pretty(std::io::stdout(), &cob.object)?; + println!() + } } else { anyhow::bail!("the type name '{type_name}' is unknown"); } - println!(); } }