summaryrefslogtreecommitdiffstats
path: root/src/commands/tree_of.rs
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-12-11 13:12:58 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-12-11 13:12:58 +0100
commit19337f3581dc3430615d6d019b8dc7aeb7c2d1b2 (patch)
treebfa8e672b91f6a5dee2884b7f5ee4ed9f1df0348 /src/commands/tree_of.rs
parenta9a10ab8e50c51c2bbdab93f7275f82372f94901 (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.rs44
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<()>>()
+}
+
+