diff --git a/src/cargo/core/resolver/encode.rs b/src/cargo/core/resolver/encode.rs index 6f4d094ccff..b64c4b9d8ec 100644 --- a/src/cargo/core/resolver/encode.rs +++ b/src/cargo/core/resolver/encode.rs @@ -29,8 +29,23 @@ struct Patch { pub type Metadata = BTreeMap; +pub enum ErrorHandle{ + Ignore, + Raise, +} + +impl ErrorHandle { + fn is_ignore(&self) -> bool { + use self::ErrorHandle::*; + match self { + Ignore => true, + Raise => false, + } + } +} + impl EncodableResolve { - pub fn into_resolve(self, ws: &Workspace, ignore_errors: bool) -> CargoResult { + pub fn into_resolve(self, ws: &Workspace, ignore_errors: ErrorHandle) -> CargoResult { let path_deps = build_path_deps(ws); let packages = { @@ -83,7 +98,7 @@ impl EncodableResolve { // Package is found in the lockfile, but it is // no longer a member of the workspace. Ok(None) - } else if ignore_errors { + } else if ignore_errors.is_ignore() { // We are asked to ignore errors Ok(None) } else { diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index a8179d33471..cb1fdef58ba 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -66,7 +66,7 @@ use self::context::{Activations, Context}; use self::types::{ActivateError, ActivateResult, Candidate, ConflictReason, DepsFrame, GraphNode}; use self::types::{RcVecIter, RegistryQueryer}; -pub use self::encode::{EncodableDependency, EncodablePackageId, EncodableResolve}; +pub use self::encode::{EncodableDependency, EncodablePackageId, EncodableResolve, ErrorHandle}; pub use self::encode::{Metadata, WorkspaceResolve}; pub use self::resolve::{Deps, DepsNotReplaced, Resolve}; pub use self::types::Method; diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 50282f0cc4d..a8b3a5b7d4b 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -5,7 +5,7 @@ use termcolor::Color::{self, Cyan, Green, Red}; use core::PackageId; use core::registry::PackageRegistry; use core::{Resolve, SourceId, Workspace}; -use core::resolver::Method; +use core::resolver::{Method, ErrorHandle}; use ops; use util::config::Config; use util::CargoResult; @@ -46,8 +46,8 @@ pub fn update_lockfile(ws: &Workspace, opts: &UpdateOptions) -> CargoResult<()> bail!("you can't update in the offline mode"); } - // `ignore_errors` is set to true, because we are about to clean the errors up. - let previous_resolve = match ops::load_pkg_lockfile(ws, true)? { + // ignore errors, because we are about to clean them up. + let previous_resolve = match ops::load_pkg_lockfile(ws, ErrorHandle::Ignore)? { Some(resolve) => resolve, None => return generate_lockfile(ws), }; diff --git a/src/cargo/ops/cargo_pkgid.rs b/src/cargo/ops/cargo_pkgid.rs index 157c3e8e4d4..d4c81466815 100644 --- a/src/cargo/ops/cargo_pkgid.rs +++ b/src/cargo/ops/cargo_pkgid.rs @@ -1,9 +1,10 @@ use ops; use core::{PackageIdSpec, Workspace}; +use core::resolver::ErrorHandle; use util::CargoResult; pub fn pkgid(ws: &Workspace, spec: Option<&str>) -> CargoResult { - let resolve = match ops::load_pkg_lockfile(ws, false)? { + let resolve = match ops::load_pkg_lockfile(ws, ErrorHandle::Raise)? { Some(resolve) => resolve, None => bail!("a Cargo.lock must exist for this command"), }; diff --git a/src/cargo/ops/lockfile.rs b/src/cargo/ops/lockfile.rs index c25f925aa15..f0218465292 100644 --- a/src/cargo/ops/lockfile.rs +++ b/src/cargo/ops/lockfile.rs @@ -3,12 +3,12 @@ use std::io::prelude::*; use toml; use core::{resolver, Resolve, Workspace}; -use core::resolver::WorkspaceResolve; +use core::resolver::{WorkspaceResolve, ErrorHandle}; use util::Filesystem; use util::errors::{CargoResult, CargoResultExt}; use util::toml as cargo_toml; -pub fn load_pkg_lockfile(ws: &Workspace, ignore_errors: bool) -> CargoResult> { +pub fn load_pkg_lockfile(ws: &Workspace, ignore_errors: ErrorHandle) -> CargoResult> { if !ws.root().join("Cargo.lock").exists() { return Ok(None); } @@ -115,8 +115,8 @@ fn are_equal_lockfiles(mut orig: String, current: &str, ws: &Workspace) -> bool let res: CargoResult = (|| { let old: resolver::EncodableResolve = toml::from_str(&orig)?; let new: resolver::EncodableResolve = toml::from_str(current)?; - // `ignore_errors` is set to true, because we may be about to clean the errors up. - Ok(old.into_resolve(ws, true)? == new.into_resolve(ws, true)?) + // ignore errors, because we may be about to clean them up. + Ok(old.into_resolve(ws, ErrorHandle::Ignore)? == new.into_resolve(ws, ErrorHandle::Ignore)?) })(); if let Ok(true) = res { return true; diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index c75fb532332..659fe16e385 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use core::{PackageId, PackageIdSpec, PackageSet, Source, SourceId, Workspace}; use core::registry::PackageRegistry; -use core::resolver::{self, Method, Resolve}; +use core::resolver::{self, Method, Resolve, ErrorHandle}; use sources::PathSource; use ops; use util::profile; @@ -82,7 +82,7 @@ pub fn resolve_ws_with_method<'a>( Some(resolve) } else { - ops::load_pkg_lockfile(ws, false)? + ops::load_pkg_lockfile(ws, ErrorHandle::Raise)? }; let resolved_with_overrides = ops::resolve_with_previous( @@ -106,7 +106,7 @@ fn resolve_with_registry<'cfg>( registry: &mut PackageRegistry<'cfg>, warn: bool, ) -> CargoResult { - let prev = ops::load_pkg_lockfile(ws, false)?; + let prev = ops::load_pkg_lockfile(ws, ErrorHandle::Raise)?; let resolve = resolve_with_previous( registry, ws,