diff options
author | Lars Wirzenius <liw@sequoia-pgp.org> | 2022-09-21 18:26:42 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@sequoia-pgp.org> | 2022-09-21 18:26:42 +0300 |
commit | 629078c5acdb2a434172a2831bde89d2c05d77d7 (patch) | |
tree | f4faf33e382683d2c92b6166bf75fec47ceee081 | |
parent | caef8e0d97e941d94d71219d34a15aefdd4c02a2 (diff) | |
download | missing-dependencies-629078c5acdb2a434172a2831bde89d2c05d77d7.tar.gz |
feat: allow asking feature selection from cargo
Sponsored-by: pep.foundation
-rw-r--r-- | src/main.rs | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs index 293468e..4f0d66a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use anyhow::anyhow; -use cargo_metadata::MetadataCommand; +use cargo_metadata::{CargoOpt, MetadataCommand}; use clap::Parser; -use log::{debug, error, info}; +use log::{trace, debug, error, info}; use semver::{Version, VersionReq}; use std::collections::HashMap; use std::fmt; @@ -23,9 +23,17 @@ fn fallible_main() -> anyhow::Result<()> { let packaged = Crates::from_file(&args.packaged)?; info!("load dependencies with version requirements"); - let metadata = MetadataCommand::new() - .manifest_path(&args.dirname.join("Cargo.toml")) - .exec()?; + let mut metadata = MetadataCommand::new(); + metadata.manifest_path(&args.dirname.join("Cargo.toml")); + + if args.all_features { + metadata.features(CargoOpt::AllFeatures); + } else if !args.features.is_empty() { + metadata.features(CargoOpt::NoDefaultFeatures); + metadata.features(CargoOpt::SomeFeatures(args.features.clone())); + }; + + let metadata = metadata.exec()?; let mut dependencies: HashMap<String, VersionReq> = HashMap::new(); for package in metadata.packages { @@ -84,6 +92,14 @@ fn fallible_main() -> anyhow::Result<()> { /// to "cargo tree" to select features you need. #[derive(Parser)] struct Args { + /// Ask cargo for all features. + #[clap(long)] + all_features: bool, + + /// Ask cargo for specifid features (use once per feature). + #[clap(short, long)] + features: Vec<String>, + /// List of crates and versions packaged in the target operating system. packaged: PathBuf, @@ -123,6 +139,7 @@ impl Crates { let mut crates = Crates::default(); for (lineno, line) in text.lines().enumerate() { + trace!("parsing line {}: {:?}", lineno, line); let mut words = line.split(' '); if let Some(name) = words.next() { if let Some(version) = words.next() { |