cli/cob: Allow showing multiple COBs at once

This commit is contained in:
Lorenz Leutgeb 2024-11-27 17:00:13 +01:00 committed by cloudhead
parent 289e59bbfa
commit 8865b5596e
No known key found for this signature in database
1 changed files with 39 additions and 26 deletions

View File

@ -72,7 +72,7 @@ enum Operation {
Migrate, Migrate,
Show { Show {
repo: RepoId, repo: RepoId,
rev: Rev, revs: Vec<Rev>,
type_name: cob::TypeName, type_name: cob::TypeName,
}, },
} }
@ -94,7 +94,7 @@ impl Args for Options {
let mut parser = lexopt::Parser::from_args(args); let mut parser = lexopt::Parser::from_args(args);
let mut op: Option<OperationName> = None; let mut op: Option<OperationName> = None;
let mut type_name: Option<cob::TypeName> = None; let mut type_name: Option<cob::TypeName> = None;
let mut oid: Option<Rev> = None; let mut revs: Vec<Rev> = vec![];
let mut rid: Option<RepoId> = None; let mut rid: Option<RepoId> = None;
let mut format: Option<Format> = None; let mut format: Option<Format> = None;
@ -118,7 +118,7 @@ impl Args for Options {
let v = parser.value()?; let v = parser.value()?;
let v = term::args::string(&v); let v = term::args::string(&v);
oid = Some(Rev::from(v)); revs.push(Rev::from(v));
} }
Long("repo") => { Long("repo") => {
let v = parser.value()?; let v = parser.value()?;
@ -156,19 +156,22 @@ impl Args for Options {
}, },
OperationName::Log => Operation::Log { OperationName::Log => Operation::Log {
repo: repo?, repo: repo?,
rev: oid.ok_or_else(|| { rev: revs.pop().ok_or_else(|| {
anyhow!("an object id must be specified with `--object`") anyhow!("an object id must be specified with `--object`")
})?, })?,
type_name: type_name?, type_name: type_name?,
}, },
OperationName::Migrate => Operation::Migrate, OperationName::Migrate => Operation::Migrate,
OperationName::Show => Operation::Show { OperationName::Show => {
if revs.is_empty() {
anyhow::bail!("an object id must be specified with `--object`")
}
Operation::Show {
repo: repo?, repo: repo?,
rev: oid.ok_or_else(|| { revs,
anyhow!("an object id must be specified with `--object`")
})?,
type_name: type_name?, type_name: type_name?,
}, }
}
} }
}, },
format: format.unwrap_or(Format::Pretty), format: format.unwrap_or(Format::Pretty),
@ -219,33 +222,43 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
} }
Operation::Show { Operation::Show {
repo, repo,
rev: oid, revs,
type_name, type_name,
} => { } => {
let repo = storage.repository(repo)?; let repo = storage.repository(repo)?;
let oid = &oid.resolve(&repo.backend)?;
if type_name == cob::patch::TYPENAME.clone() { if type_name == cob::patch::TYPENAME.clone() {
let patches = term::cob::patches(&profile, &repo)?; let patches = term::cob::patches(&profile, &repo)?;
for oid in revs {
let oid = &oid.resolve(&repo.backend)?;
let Some(patch) = patches.get(oid)? else { let Some(patch) = patches.get(oid)? else {
anyhow::bail!(cob::store::Error::NotFound(type_name, *oid)) anyhow::bail!(cob::store::Error::NotFound(type_name, *oid))
}; };
serde_json::to_writer_pretty(std::io::stdout(), &patch)? serde_json::to_writer_pretty(std::io::stdout(), &patch)?;
println!()
}
} else if type_name == cob::issue::TYPENAME.clone() { } else if type_name == cob::issue::TYPENAME.clone() {
let issues = term::cob::issues(&profile, &repo)?; let issues = term::cob::issues(&profile, &repo)?;
for oid in revs {
let oid = &oid.resolve(&repo.backend)?;
let Some(issue) = issues.get(oid)? else { let Some(issue) = issues.get(oid)? else {
anyhow::bail!(cob::store::Error::NotFound(type_name, *oid)) anyhow::bail!(cob::store::Error::NotFound(type_name, *oid))
}; };
serde_json::to_writer_pretty(std::io::stdout(), &issue)? serde_json::to_writer_pretty(std::io::stdout(), &issue)?;
println!()
}
} else if type_name == cob::identity::TYPENAME.clone() { } else if type_name == cob::identity::TYPENAME.clone() {
for oid in revs {
let oid = &oid.resolve(&repo.backend)?;
let Some(cob) = cob::get::<Identity, _>(&repo, &type_name, oid)? else { let Some(cob) = cob::get::<Identity, _>(&repo, &type_name, oid)? else {
anyhow::bail!(cob::store::Error::NotFound(type_name, *oid)) anyhow::bail!(cob::store::Error::NotFound(type_name, *oid))
}; };
serde_json::to_writer_pretty(std::io::stdout(), &cob.object)? serde_json::to_writer_pretty(std::io::stdout(), &cob.object)?;
println!()
}
} else { } else {
anyhow::bail!("the type name '{type_name}' is unknown"); anyhow::bail!("the type name '{type_name}' is unknown");
} }
println!();
} }
} }