Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Treat --all-features flag as one of feature combinations #61

Merged
merged 1 commit into from
Oct 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ This project adheres to [Semantic Versioning](https://semver.org).

## [Unreleased]

* Treat `--all-features` flag as one of feature combinations. See [#42][42] for details.

* Add `--skip-all-features` flag. See [#42][42] for details.

[42]: https://github.com/taiki-e/cargo-hack/pull/42

## [0.3.14] - 2020-10-10

* [Add `--depth` option.][59] See [#59][59] for details.
Expand Down
32 changes: 19 additions & 13 deletions src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,12 @@ const HELP: &[(&str, &str, &str, &[&str])] = &[
("", "--exclude <SPEC>...", "Exclude packages from the check", &[]),
("", "--manifest-path <PATH>", "Path to Cargo.toml", &[]),
("", "--features <FEATURES>...", "Space-separated list of features to activate", &[]),
(
"",
"--each-feature",
"Perform for each feature which includes --no-default-features flag and default features of the package",
&[],
),
(
"",
"--feature-powerset",
"Perform for the feature powerset which includes --no-default-features flag and default features of the package",
&[],
),
("", "--each-feature", "Perform for each feature of the package", &[
"This also includes runs with just --no-default-features flag, --all-features flag, and default features.",
]),
("", "--feature-powerset", "Perform for the feature powerset of the package", &[
"This also includes runs with just --no-default-features flag, --all-features flag, and default features.",
]),
("", "--optional-deps [DEPS]...", "Use optional dependencies as features", &[
"If DEPS are not specified, all optional dependencies are considered as features.",
"This flag can only be used with either --each-feature flag or --feature-powerset flag.",
Expand All @@ -39,6 +33,9 @@ const HELP: &[(&str, &str, &str, &[&str])] = &[
("", "--skip-no-default-features", "Skip run of just --no-default-features flag", &[
"This flag can only be used with either --each-feature flag or --feature-powerset flag.",
]),
("", "--skip-all-features", "Skip run of just --all-features flag", &[
"This flag can only be used with either --each-feature flag or --feature-powerset flag.",
]),
(
"",
"--depth <NUM>",
Expand Down Expand Up @@ -121,7 +118,7 @@ impl fmt::Display for Help {
writeln!(
f,
"\
{0} {1}\n\n{2}
{0} {1}\n{2}
USAGE:
cargo hack [OPTIONS] [SUBCOMMAND]\n
Use -h for short descriptions and --help for more details.\n
Expand Down Expand Up @@ -195,6 +192,8 @@ pub(crate) struct Args {
pub(crate) optional_deps: Option<Vec<String>>,
/// --skip-no-default-features
pub(crate) skip_no_default_features: bool,
/// --skip-all-features
pub(crate) skip_all_features: bool,
/// --clean-per-run
pub(crate) clean_per_run: bool,
/// -v, --verbose, -vv
Expand Down Expand Up @@ -279,6 +278,7 @@ pub(crate) fn args(coloring: &mut Option<Coloring>) -> Result<Option<Args>> {
let mut ignore_unknown_features = false;
let mut ignore_non_exist_features = false;
let mut skip_no_default_features = false;
let mut skip_all_features = false;
let mut clean_per_run = false;
let mut verbose = false;
let mut depth = None;
Expand Down Expand Up @@ -420,6 +420,7 @@ pub(crate) fn args(coloring: &mut Option<Coloring>) -> Result<Option<Args>> {
"--feature-powerset" => parse_flag!(feature_powerset),
"--ignore-private" => parse_flag!(ignore_private),
"--skip-no-default-features" => parse_flag!(skip_no_default_features),
"--skip-all-features" => parse_flag!(skip_all_features),
"--clean-per-run" => parse_flag!(clean_per_run),
"--ignore-unknown-features" => {
if ignore_unknown_features || ignore_non_exist_features {
Expand Down Expand Up @@ -474,6 +475,10 @@ pub(crate) fn args(coloring: &mut Option<Coloring>) -> Result<Option<Args>> {
bail!(
"--skip-no-default-features can only be used with either --each-feature or --feature-powerset"
);
} else if skip_all_features {
bail!(
"--skip-all-features can only be used with either --each-feature or --feature-powerset"
);
}
}
if depth.is_some() && !feature_powerset {
Expand Down Expand Up @@ -562,6 +567,7 @@ For more information try --help
ignore_unknown_features: ignore_unknown_features || ignore_non_exist_features,
optional_deps,
skip_no_default_features,
skip_all_features,
clean_per_run,
depth,

Expand Down
40 changes: 22 additions & 18 deletions src/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,10 @@ impl<'a> Kind<'a> {
*total += 1;
Kind::Nomal { show_progress: true }
} else {
*total += features.len();
if !args.skip.iter().any(|x| x == "default") {
*total += 1;
}
if !args.skip_no_default_features {
*total += 1;
}
*total += features.len()
+ (!args.skip.iter().any(|x| x == "default")) as usize
+ (!args.skip_no_default_features) as usize
+ (!args.skip_all_features) as usize;
Kind::Each { features }
}
} else if args.feature_powerset {
Expand All @@ -102,13 +99,10 @@ impl<'a> Kind<'a> {
Kind::Nomal { show_progress: true }
} else {
// -1: the first element of a powerset is `[]`
*total += features.len() - 1;
if !args.skip.iter().any(|x| x == "default") {
*total += 1;
}
if !args.skip_no_default_features {
*total += 1;
}
*total += features.len() - 1
+ (!args.skip.iter().any(|x| x == "default")) as usize
+ (!args.skip_no_default_features) as usize
+ (!args.skip_all_features) as usize;
Kind::Powerset { features }
}
} else {
Expand Down Expand Up @@ -151,18 +145,28 @@ pub(crate) fn exec(
}

match &package.kind {
Kind::Each { features } => features
.iter()
.try_for_each(|f| exec_cargo_with_features(args, package, &line, info, Some(f))),
Kind::Each { features } => {
features
.iter()
.try_for_each(|f| exec_cargo_with_features(args, package, &line, info, Some(f)))?;
}
Kind::Powerset { features } => {
// The first element of a powerset is `[]` so it should be skipped.
features
.iter()
.skip(1)
.try_for_each(|f| exec_cargo_with_features(args, package, &line, info, f))
.try_for_each(|f| exec_cargo_with_features(args, package, &line, info, f))?;
}
_ => unreachable!(),
}

if !args.skip_all_features {
// run with all features
line.arg("--all-features");
exec_cargo(args, package, &mut line, info, true)?;
}

Ok(())
}

fn exec_cargo_with_features(
Expand Down
14 changes: 11 additions & 3 deletions tests/long-help.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
cargo-hack 0.3.14

A tool to work around some limitations on cargo.

USAGE:
Expand Down Expand Up @@ -27,10 +26,14 @@ OPTIONS:
Space-separated list of features to activate.

--each-feature
Perform for each feature which includes --no-default-features flag and default features of the package.
Perform for each feature of the package.

This also includes runs with just --no-default-features flag, --all-features flag, and default features.

--feature-powerset
Perform for the feature powerset which includes --no-default-features flag and default features of the package.
Perform for the feature powerset of the package.

This also includes runs with just --no-default-features flag, --all-features flag, and default features.

--optional-deps [DEPS]...
Use optional dependencies as features.
Expand All @@ -51,6 +54,11 @@ OPTIONS:

This flag can only be used with either --each-feature flag or --feature-powerset flag.

--skip-all-features
Skip run of just --all-features flag.

This flag can only be used with either --each-feature flag or --feature-powerset flag.

--depth <NUM>
Specify a max number of simultaneous feature flags of --feature-powerset.

Expand Down
6 changes: 3 additions & 3 deletions tests/short-help.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
cargo-hack 0.3.14

A tool to work around some limitations on cargo.

USAGE:
Expand All @@ -14,11 +13,12 @@ OPTIONS:
--exclude <SPEC>... Exclude packages from the check
--manifest-path <PATH> Path to Cargo.toml
--features <FEATURES>... Space-separated list of features to activate
--each-feature Perform for each feature which includes --no-default-features flag and default features of the package
--feature-powerset Perform for the feature powerset which includes --no-default-features flag and default features of the package
--each-feature Perform for each feature of the package
--feature-powerset Perform for the feature powerset of the package
--optional-deps [DEPS]... Use optional dependencies as features
--skip <FEATURES>... Space-separated list of features to skip
--skip-no-default-features Skip run of just --no-default-features flag
--skip-all-features Skip run of just --all-features flag
--depth <NUM> Specify a max number of simultaneous feature flags of --feature-powerset
--no-dev-deps Perform without dev-dependencies
--remove-dev-deps Equivalent to --no-dev-deps flag except for does not restore the original `Cargo.toml` after performed
Expand Down
Loading