diff --git a/src/args.rs b/src/args.rs index 67a280f..10b1dce 100644 --- a/src/args.rs +++ b/src/args.rs @@ -10,7 +10,7 @@ pub enum Opts { Tree(Args), } -#[derive(Parser)] +#[derive(Parser, Clone)] pub struct Args { #[clap(long = "package", short = 'p', value_name = "SPEC")] /// Package to be used as the root of the tree @@ -30,6 +30,12 @@ pub struct Args { #[clap(long = "all-targets")] /// Return dependencies for all targets. By default only the host target is matched. pub all_targets: bool, + #[clap(long = "skip-cache")] + /// Do not read from disk cache for Debian database results + pub skip_cache: bool, + #[clap(long = "concurrency", short = 'j', default_value = "24")] + /// How many database connections to use concurrently + pub concurrency: usize, #[clap(long = "no-dev-dependencies")] /// Skip dev dependencies. pub no_dev_dependencies: bool, diff --git a/src/db.rs b/src/db.rs index 914b8c7..7fb25dc 100644 --- a/src/db.rs +++ b/src/db.rs @@ -102,7 +102,7 @@ impl Connection { if SystemTime::now().duration_since(cache.from)? > CACHE_EXPIRE { Ok(None) } else { - debug!("{package} {:?}", cache.info); + debug!("Found package in cache: {package} -> {:?}", cache.info); Ok(Some(cache.info)) } } @@ -123,9 +123,16 @@ impl Connection { Ok(()) } - pub fn search(&mut self, package: &str, version: &Version) -> Result { - if let Some(info) = self.check_cache("sid", package, version)? { - return Ok(info); + pub fn search( + &mut self, + package: &str, + version: &Version, + skip_cache: bool, + ) -> Result { + if !skip_cache { + if let Some(info) = self.check_cache("sid", package, version)? { + return Ok(info); + } } // config.shell().status("Querying", format!("sid: {}", package))?; @@ -140,9 +147,16 @@ impl Connection { Ok(info) } - pub fn search_new(&mut self, package: &str, version: &Version) -> Result { - if let Some(info) = self.check_cache("new", package, version)? { - return Ok(info); + pub fn search_new( + &mut self, + package: &str, + version: &Version, + skip_cache: bool, + ) -> Result { + if !skip_cache { + if let Some(info) = self.check_cache("new", package, version)? { + return Ok(info); + } } // config.shell().status("Querying", format!("new: {}", package))?; diff --git a/src/debian.rs b/src/debian.rs index 917eb2e..b15a95a 100644 --- a/src/debian.rs +++ b/src/debian.rs @@ -1,3 +1,4 @@ +use crate::args::Args; use crate::db::{Connection, PkgStatus}; use crate::errors::*; use crate::graph::Graph; @@ -8,8 +9,6 @@ use semver::Version; use std::path::PathBuf; use std::thread; -const QUERY_THREADS: usize = 24; - #[derive(Debug, Clone)] pub struct Pkg { pub id: PackageId, @@ -122,7 +121,7 @@ pub struct DebianInfo { pub version: String, } -fn run_task(db: &mut Connection, pkg: Pkg) -> Result { +fn run_task(db: &mut Connection, pkg: Pkg, skip_cache: bool) -> Result { let mut deb = DebianInfo { in_unstable: false, in_new: false, @@ -132,9 +131,9 @@ fn run_task(db: &mut Connection, pkg: Pkg) -> Result { version: String::new(), }; - let mut info = db.search(&pkg.name, &pkg.version).unwrap(); + let mut info = db.search(&pkg.name, &pkg.version, skip_cache).unwrap(); if info.status == PkgStatus::NotFound { - info = db.search_new(&pkg.name, &pkg.version).unwrap(); + info = db.search_new(&pkg.name, &pkg.version, skip_cache).unwrap(); if info.status != PkgStatus::NotFound { deb.in_new = true; deb.version = info.version; @@ -154,12 +153,13 @@ fn run_task(db: &mut Connection, pkg: Pkg) -> Result { Ok(deb) } -pub fn populate(graph: &mut Graph) -> Result<(), Error> { +pub fn populate(graph: &mut Graph, args: &Args) -> Result<(), Error> { let (task_tx, task_rx) = crossbeam_channel::unbounded(); let (return_tx, return_rx) = crossbeam_channel::unbounded(); info!("Creating thread-pool"); - for _ in 0..QUERY_THREADS { + for _ in 0..args.concurrency { + let args = args.clone(); let task_rx = task_rx.clone(); let return_tx = return_tx.clone(); @@ -173,7 +173,7 @@ pub fn populate(graph: &mut Graph) -> Result<(), Error> { }; for (idx, pkg) in task_rx { - let deb = run_task(&mut db, pkg); + let deb = run_task(&mut db, pkg, args.skip_cache); if return_tx.send(Ok((idx, deb))).is_err() { break; } @@ -196,12 +196,16 @@ pub fn populate(graph: &mut Graph) -> Result<(), Error> { info!("Processing debian results"); - let pb = ProgressBar::new(jobs as u64) - .with_style( - ProgressStyle::default_bar() - .template("[{pos:.green}/{len:.green}] {prefix:.bold} {wide_bar}")?, - ) - .with_prefix("Resolving debian packages"); + let pb = if args.quiet { + ProgressBar::hidden() + } else { + ProgressBar::new(jobs as u64) + .with_style( + ProgressStyle::default_bar() + .template("[{pos:.green}/{len:.green}] {prefix:.bold} {wide_bar}")?, + ) + .with_prefix("Resolving debian packages") + }; pb.tick(); for result in return_rx.iter().take(jobs) { diff --git a/src/main.rs b/src/main.rs index 68d03e6..b4c9c77 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,7 @@ fn main() -> Result<(), Error> { info!("Building graph"); let mut graph = graph::build(&args, metadata)?; info!("Populating with debian data"); - debian::populate(&mut graph)?; + debian::populate(&mut graph, &args)?; info!("Printing graph"); tree::print(&args, &graph)?; diff --git a/src/tree.rs b/src/tree.rs index 8677b19..8c287ee 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -280,11 +280,16 @@ fn print_dependencies<'a>( if let Prefix::Indent = prefix { if let Some(name) = name { + // start with padding used by packaging status icons + print!(" "); + + // print tree graph parts for continues in &**levels_continue { let c = if *continues { symbols.down } else { " " }; print!("{c} "); } + // print the actual texts println!("{name}"); } }