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,
Show {
repo: RepoId,
rev: Rev,
revs: Vec<Rev>,
type_name: cob::TypeName,
},
}
@ -94,7 +94,7 @@ impl Args for Options {
let mut parser = lexopt::Parser::from_args(args);
let mut op: Option<OperationName> = 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 format: Option<Format> = 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::<Identity, _>(&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::<Identity, _>(&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!();
}
}