summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@sequoia-pgp.org>2022-09-21 18:26:42 +0300
committerLars Wirzenius <liw@sequoia-pgp.org>2022-09-21 18:26:42 +0300
commit629078c5acdb2a434172a2831bde89d2c05d77d7 (patch)
treef4faf33e382683d2c92b6166bf75fec47ceee081
parentcaef8e0d97e941d94d71219d34a15aefdd4c02a2 (diff)
downloadmissing-dependencies-629078c5acdb2a434172a2831bde89d2c05d77d7.tar.gz
feat: allow asking feature selection from cargo
Sponsored-by: pep.foundation
-rw-r--r--src/main.rs27
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() {