diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-12-11 13:12:58 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-12-11 13:12:58 +0100 |
commit | 19337f3581dc3430615d6d019b8dc7aeb7c2d1b2 (patch) | |
tree | bfa8e672b91f6a5dee2884b7f5ee4ed9f1df0348 /src/commands/tree_of.rs | |
parent | a9a10ab8e50c51c2bbdab93f7275f82372f94901 (diff) |
Add "tree-of" subcommand to print dependency tree of a package
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/commands/tree_of.rs')
-rw-r--r-- | src/commands/tree_of.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/commands/tree_of.rs b/src/commands/tree_of.rs new file mode 100644 index 0000000..7281349 --- /dev/null +++ b/src/commands/tree_of.rs @@ -0,0 +1,44 @@ +use std::io::Write; + +use anyhow::Result; +use clap::ArgMatches; +use resiter::AndThen; + +use crate::package::PackageName; +use crate::package::PackageVersionConstraint; +use crate::repository::Repository; +use crate::package::Tree; +use crate::util::progress::ProgressBars; + +pub async fn tree_of(matches: &ArgMatches, repo: Repository, progressbars: ProgressBars) -> Result<()> { + let pname = matches.value_of("package_name").map(String::from).map(PackageName::from); + let pvers = matches.value_of("package_version").map(String::from).map(PackageVersionConstraint::new).transpose()?; + + fn print_package_tree(out: &mut dyn Write, indent: usize, tree: Tree) -> Result<()> { + for (pkg, tree) in tree.into_iter() { + writeln!(out, "{:indent$}{name} {version}", "", indent = indent, name = pkg.name(), version = pkg.version())?; + print_package_tree(out, indent + 2, tree)?; + } + Ok(()) + } + + repo.packages() + .filter(|p| pname.as_ref().map(|n| p.name() == n).unwrap_or(true)) + .filter(|p| pvers.as_ref().map(|v| v.matches(p.version())).unwrap_or(true)) + .map(|package| { + let bar_tree_building = progressbars.bar(); + let mut tree = Tree::new(); + let _ = tree.add_package(package.clone(), &repo, bar_tree_building.clone())?; + bar_tree_building.finish_with_message("Finished loading Tree"); + Ok(tree) + }) + .and_then_ok(|tree| { + let stdout = std::io::stdout(); + let mut outlock = stdout.lock(); + + print_package_tree(&mut outlock, 0, tree) + }) + .collect::<Result<()>>() +} + + |