Fix panic with cargo tree --target=all -Zfeatures=all

This commit is contained in:
Eric Huss 2020-05-22 14:35:07 -07:00
parent d662f2559b
commit d267fac227
9 changed files with 61 additions and 5 deletions

View File

@ -111,6 +111,7 @@ pub fn resolve_std<'cfg>(
&opts, &opts,
&specs, &specs,
HasDevUnits::No, HasDevUnits::No,
crate::core::resolver::features::ForceAllTargets::No,
)?; )?;
Ok(( Ok((
resolve.pkg_set, resolve.pkg_set,

View File

@ -91,6 +91,13 @@ pub enum HasDevUnits {
No, No,
} }
/// Flag to indicate that target-specific filtering should be disabled.
#[derive(Copy, Clone, PartialEq)]
pub enum ForceAllTargets {
Yes,
No,
}
/// Flag to indicate if features are requested for a build dependency or not. /// Flag to indicate if features are requested for a build dependency or not.
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq)]
pub enum FeaturesFor { pub enum FeaturesFor {
@ -110,7 +117,11 @@ impl FeaturesFor {
} }
impl FeatureOpts { impl FeatureOpts {
fn new(ws: &Workspace<'_>, has_dev_units: HasDevUnits) -> CargoResult<FeatureOpts> { fn new(
ws: &Workspace<'_>,
has_dev_units: HasDevUnits,
force_all_targets: ForceAllTargets,
) -> CargoResult<FeatureOpts> {
let mut opts = FeatureOpts::default(); let mut opts = FeatureOpts::default();
let unstable_flags = ws.config().cli_unstable(); let unstable_flags = ws.config().cli_unstable();
opts.package_features = unstable_flags.package_features; opts.package_features = unstable_flags.package_features;
@ -155,6 +166,9 @@ impl FeatureOpts {
// Dev deps cannot be decoupled when they are in use. // Dev deps cannot be decoupled when they are in use.
opts.decouple_dev_deps = false; opts.decouple_dev_deps = false;
} }
if let ForceAllTargets::Yes = force_all_targets {
opts.ignore_inactive_targets = false;
}
Ok(opts) Ok(opts)
} }
} }
@ -269,11 +283,12 @@ impl<'a, 'cfg> FeatureResolver<'a, 'cfg> {
specs: &[PackageIdSpec], specs: &[PackageIdSpec],
requested_targets: &[CompileKind], requested_targets: &[CompileKind],
has_dev_units: HasDevUnits, has_dev_units: HasDevUnits,
force_all_targets: ForceAllTargets,
) -> CargoResult<ResolvedFeatures> { ) -> CargoResult<ResolvedFeatures> {
use crate::util::profile; use crate::util::profile;
let _p = profile::start("resolve features"); let _p = profile::start("resolve features");
let opts = FeatureOpts::new(ws, has_dev_units)?; let opts = FeatureOpts::new(ws, has_dev_units, force_all_targets)?;
if !opts.new_resolver { if !opts.new_resolver {
// Legacy mode. // Legacy mode.
return Ok(ResolvedFeatures { return Ok(ResolvedFeatures {

View File

@ -69,7 +69,7 @@ use self::types::{FeaturesSet, RcVecIter, RemainingDeps, ResolverProgress};
pub use self::encode::Metadata; pub use self::encode::Metadata;
pub use self::encode::{EncodableDependency, EncodablePackageId, EncodableResolve}; pub use self::encode::{EncodableDependency, EncodablePackageId, EncodableResolve};
pub use self::errors::{ActivateError, ActivateResult, ResolveError}; pub use self::errors::{ActivateError, ActivateResult, ResolveError};
pub use self::features::HasDevUnits; pub use self::features::{ForceAllTargets, HasDevUnits};
pub use self::resolve::{Resolve, ResolveVersion}; pub use self::resolve::{Resolve, ResolveVersion};
pub use self::types::{ResolveBehavior, ResolveOpts}; pub use self::types::{ResolveBehavior, ResolveOpts};

View File

@ -327,6 +327,7 @@ pub fn create_bcx<'a, 'cfg>(
&opts, &opts,
&specs, &specs,
has_dev_units, has_dev_units,
crate::core::resolver::features::ForceAllTargets::No,
)?; )?;
let WorkspaceResolve { let WorkspaceResolve {
mut pkg_set, mut pkg_set,

View File

@ -33,6 +33,7 @@ pub fn doc(ws: &Workspace<'_>, options: &DocOptions) -> CargoResult<()> {
&opts, &opts,
&specs, &specs,
HasDevUnits::No, HasDevUnits::No,
crate::core::resolver::features::ForceAllTargets::No,
)?; )?;
let ids = ws_resolve.targeted_resolve.specs_to_ids(&specs)?; let ids = ws_resolve.targeted_resolve.specs_to_ids(&specs)?;

View File

@ -123,6 +123,7 @@ fn build_resolve_graph(
&resolve_opts, &resolve_opts,
&specs, &specs,
HasDevUnits::Yes, HasDevUnits::Yes,
crate::core::resolver::features::ForceAllTargets::No,
)?; )?;
// Download all Packages. This is needed to serialize the information // Download all Packages. This is needed to serialize the information
// for every package. In theory this could honor target filtering, // for every package. In theory this could honor target filtering,

View File

@ -12,7 +12,7 @@
use crate::core::compiler::{CompileKind, RustcTargetData}; use crate::core::compiler::{CompileKind, RustcTargetData};
use crate::core::registry::PackageRegistry; use crate::core::registry::PackageRegistry;
use crate::core::resolver::features::{FeatureResolver, ResolvedFeatures}; use crate::core::resolver::features::{FeatureResolver, ForceAllTargets, ResolvedFeatures};
use crate::core::resolver::{self, HasDevUnits, Resolve, ResolveOpts}; use crate::core::resolver::{self, HasDevUnits, Resolve, ResolveOpts};
use crate::core::summary::Summary; use crate::core::summary::Summary;
use crate::core::Feature; use crate::core::Feature;
@ -79,6 +79,7 @@ pub fn resolve_ws_with_opts<'cfg>(
opts: &ResolveOpts, opts: &ResolveOpts,
specs: &[PackageIdSpec], specs: &[PackageIdSpec],
has_dev_units: HasDevUnits, has_dev_units: HasDevUnits,
force_all_targets: ForceAllTargets,
) -> CargoResult<WorkspaceResolve<'cfg>> { ) -> CargoResult<WorkspaceResolve<'cfg>> {
let mut registry = PackageRegistry::new(ws.config())?; let mut registry = PackageRegistry::new(ws.config())?;
let mut add_patches = true; let mut add_patches = true;
@ -148,6 +149,7 @@ pub fn resolve_ws_with_opts<'cfg>(
specs, specs,
requested_targets, requested_targets,
has_dev_units, has_dev_units,
force_all_targets,
)?; )?;
Ok(WorkspaceResolve { Ok(WorkspaceResolve {

View File

@ -3,7 +3,7 @@
use self::format::Pattern; use self::format::Pattern;
use crate::core::compiler::{CompileKind, RustcTargetData}; use crate::core::compiler::{CompileKind, RustcTargetData};
use crate::core::dependency::DepKind; use crate::core::dependency::DepKind;
use crate::core::resolver::{HasDevUnits, ResolveOpts}; use crate::core::resolver::{ForceAllTargets, HasDevUnits, ResolveOpts};
use crate::core::{Package, PackageId, PackageIdSpec, Workspace}; use crate::core::{Package, PackageId, PackageIdSpec, Workspace};
use crate::ops::{self, Packages}; use crate::ops::{self, Packages};
use crate::util::{CargoResult, Config}; use crate::util::{CargoResult, Config};
@ -150,6 +150,11 @@ pub fn build_and_print(ws: &Workspace<'_>, opts: &TreeOptions) -> CargoResult<()
} else { } else {
HasDevUnits::No HasDevUnits::No
}; };
let force_all = if opts.target == Target::All {
ForceAllTargets::Yes
} else {
ForceAllTargets::No
};
let ws_resolve = ops::resolve_ws_with_opts( let ws_resolve = ops::resolve_ws_with_opts(
ws, ws,
&target_data, &target_data,
@ -157,6 +162,7 @@ pub fn build_and_print(ws: &Workspace<'_>, opts: &TreeOptions) -> CargoResult<()
&resolve_opts, &resolve_opts,
&specs, &specs,
has_dev, has_dev,
force_all,
)?; )?;
// Download all Packages. Some display formats need to display package metadata. // Download all Packages. Some display formats need to display package metadata.
let package_map: HashMap<PackageId, &Package> = ws_resolve let package_map: HashMap<PackageId, &Package> = ws_resolve

View File

@ -1720,3 +1720,32 @@ resolver = "2"
&[("Cargo.toml", &rewritten_toml)], &[("Cargo.toml", &rewritten_toml)],
); );
} }
#[cargo_test]
fn tree_all() {
// `cargo tree` with the new feature resolver.
Package::new("log", "0.4.8").feature("serde", &[]).publish();
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.1.0"
[target.'cfg(whatever)'.dependencies]
log = {version="*", features=["serde"]}
"#,
)
.file("src/lib.rs", "")
.build();
p.cargo("tree --target=all -Zfeatures=all")
.masquerade_as_nightly_cargo()
.with_stdout(
"\
foo v0.1.0 ([..]/foo)
log v0.4.8
",
)
.run();
}