Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/bin/commands/read_manifest.rs b/src/bin/commands/read_manifest.rs
- index d89fe5b..e08d864 100644
- --- a/src/bin/commands/read_manifest.rs
- +++ b/src/bin/commands/read_manifest.rs
- @@ -1,6 +1,5 @@
- use command_prelude::*;
- -use cargo::core::Package;
- use cargo::print_json;
- pub fn cli() -> App {
- @@ -11,8 +10,7 @@ Print a JSON representation of a Cargo.toml manifest.")
- }
- pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult {
- - let root = args.root_manifest(config)?;
- - let pkg = Package::for_path(&root, config)?;
- - print_json(&pkg);
- + let ws = args.workspace(config)?;
- + print_json(&ws.current()?);
- Ok(())
- }
- diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs
- index a85c83a..6894287 100644
- --- a/src/cargo/core/dependency.rs
- +++ b/src/cargo/core/dependency.rs
- @@ -329,9 +329,8 @@ impl Dependency {
- }
- /// Returns true if the package (`sum`) can fulfill this dependency request.
- - pub fn matches_ignoring_source(&self, sum: &Summary) -> bool {
- - self.name() == sum.package_id().name() &&
- - self.version_req().matches(sum.package_id().version())
- + pub fn matches_ignoring_source(&self, id: &PackageId) -> bool {
- + self.name() == id.name() && self.version_req().matches(id.version())
- }
- /// Returns true if the package (`id`) can fulfill this dependency request.
- diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs
- index 6fdc1f1..7d8ebff 100644
- --- a/src/cargo/core/package.rs
- +++ b/src/cargo/core/package.rs
- @@ -12,7 +12,6 @@ use lazycell::LazyCell;
- use core::{Dependency, Manifest, PackageId, SourceId, Target};
- use core::{Summary, SourceMap};
- use core::interning::InternedString;
- -use ops;
- use util::{Config, internal, lev_distance};
- use util::errors::{CargoResult, CargoResultExt};
- @@ -81,14 +80,6 @@ impl Package {
- }
- }
- - /// Calculate the Package from the manifest path (and cargo configuration).
- - pub fn for_path(manifest_path: &Path, config: &Config) -> CargoResult<Package> {
- - let path = manifest_path.parent().unwrap();
- - let source_id = SourceId::for_path(path)?;
- - let (pkg, _) = ops::read_package(manifest_path, &source_id, config)?;
- - Ok(pkg)
- - }
- -
- /// Get the manifest dependencies
- pub fn dependencies(&self) -> &[Dependency] { self.manifest.dependencies() }
- /// Get the manifest
- diff --git a/src/cargo/core/registry.rs b/src/cargo/core/registry.rs
- index 56f6eed..703c111 100644
- --- a/src/cargo/core/registry.rs
- +++ b/src/cargo/core/registry.rs
- @@ -412,7 +412,7 @@ impl<'cfg> Registry for PackageRegistry<'cfg> {
- let mut patches = Vec::<Summary>::new();
- if let Some(extra) = self.patches.get(dep.source_id().url()) {
- patches.extend(extra.iter().filter(|s| {
- - dep.matches_ignoring_source(s)
- + dep.matches_ignoring_source(s.package_id())
- }).cloned());
- }
- diff --git a/src/cargo/core/resolver/encode.rs b/src/cargo/core/resolver/encode.rs
- index b0f7264..7b4d43d 100644
- --- a/src/cargo/core/resolver/encode.rs
- +++ b/src/cargo/core/resolver/encode.rs
- @@ -6,7 +6,7 @@ use serde::ser;
- use serde::de;
- use core::{Package, PackageId, SourceId, Workspace, Dependency};
- -use util::{Graph, Config, internal};
- +use util::{Graph, internal};
- use util::errors::{CargoResult, CargoResultExt, CargoError};
- use super::Resolve;
- @@ -187,7 +187,7 @@ impl EncodableResolve {
- }
- }
- -fn build_path_deps(ws: &Workspace) -> HashMap<String, SourceId> {
- +fn build_path_deps(ws: &Workspace) -> (HashMap<String, SourceId>) {
- // If a crate is *not* a path source, then we're probably in a situation
- // such as `cargo install` with a lock file from a remote dependency. In
- // that case we don't need to fixup any path dependencies (as they're not
- @@ -204,30 +204,30 @@ fn build_path_deps(ws: &Workspace) -> HashMap<String, SourceId> {
- visited.insert(member.package_id().source_id().clone());
- }
- for member in members.iter() {
- - build_pkg(member, ws.config(), &mut ret, &mut visited);
- + build_pkg(member, ws, &mut ret, &mut visited);
- }
- for deps in ws.root_patch().values() {
- for dep in deps {
- - build_dep(dep, ws.config(), &mut ret, &mut visited);
- + build_dep(dep, ws, &mut ret, &mut visited);
- }
- }
- for &(_, ref dep) in ws.root_replace() {
- - build_dep(dep, ws.config(), &mut ret, &mut visited);
- + build_dep(dep, ws, &mut ret, &mut visited);
- }
- return ret;
- fn build_pkg(pkg: &Package,
- - config: &Config,
- + ws: &Workspace,
- ret: &mut HashMap<String, SourceId>,
- visited: &mut HashSet<SourceId>) {
- for dep in pkg.dependencies() {
- - build_dep(dep, config, ret, visited);
- + build_dep(dep, ws, ret, visited);
- }
- }
- fn build_dep(dep: &Dependency,
- - config: &Config,
- + ws: &Workspace,
- ret: &mut HashMap<String, SourceId>,
- visited: &mut HashSet<SourceId>) {
- let id = dep.source_id();
- @@ -238,14 +238,13 @@ fn build_path_deps(ws: &Workspace) -> HashMap<String, SourceId> {
- Ok(p) => p.join("Cargo.toml"),
- Err(_) => return,
- };
- - let pkg = match Package::for_path(&path, config) {
- + let pkg = match ws.load(&path) {
- Ok(p) => p,
- Err(_) => return,
- };
- - ret.insert(pkg.name().to_string(),
- - pkg.package_id().source_id().clone());
- + ret.insert(pkg.name().to_string(), pkg.package_id().source_id().clone());
- visited.insert(pkg.package_id().source_id().clone());
- - build_pkg(&pkg, config, ret, visited);
- + build_pkg(&pkg, ws, ret, visited);
- }
- }
- diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs
- index af3db55..abc8689 100644
- --- a/src/cargo/core/resolver/mod.rs
- +++ b/src/cargo/core/resolver/mod.rs
- @@ -363,6 +363,7 @@ type Activations = HashMap<(InternedString, SourceId), Rc<Vec<Summary>>>;
- pub fn resolve(summaries: &[(Summary, Method)],
- replacements: &[(PackageIdSpec, Dependency)],
- registry: &mut Registry,
- + try_to_use: &[&PackageId],
- config: Option<&Config>,
- print_warnings: bool) -> CargoResult<Resolve> {
- let cx = Context {
- @@ -374,7 +375,8 @@ pub fn resolve(summaries: &[(Summary, Method)],
- warnings: RcList::new(),
- };
- let _p = profile::start("resolving");
- - let cx = activate_deps_loop(cx, &mut RegistryQueryer::new(registry, replacements), summaries, config)?;
- + let mut registry = RegistryQueryer::new(registry, replacements, try_to_use);
- + let cx = activate_deps_loop(cx, &mut registry, summaries, config)?;
- let mut resolve = Resolve {
- graph: cx.graph(),
- @@ -585,16 +587,20 @@ impl ConflictReason {
- struct RegistryQueryer<'a> {
- registry: &'a mut (Registry + 'a),
- replacements: &'a [(PackageIdSpec, Dependency)],
- + try_to_use: HashSet<&'a PackageId>,
- // TODO: with nll the Rc can be removed
- cache: HashMap<Dependency, Rc<Vec<Candidate>>>,
- }
- impl<'a> RegistryQueryer<'a> {
- - fn new(registry: &'a mut Registry, replacements: &'a [(PackageIdSpec, Dependency)],) -> Self {
- + fn new(registry: &'a mut Registry,
- + replacements: &'a [(PackageIdSpec, Dependency)],
- + try_to_use: &'a [&'a PackageId]) -> Self {
- RegistryQueryer {
- registry,
- replacements,
- cache: HashMap::new(),
- + try_to_use: try_to_use.iter().cloned().collect(),
- }
- }
- @@ -673,7 +679,11 @@ impl<'a> RegistryQueryer<'a> {
- // When we attempt versions for a package, we'll want to start at
- // the maximum version and work our way down.
- ret.sort_unstable_by(|a, b| {
- - b.summary.version().cmp(a.summary.version())
- + let a_in_previous = self.try_to_use.contains(a.summary.package_id());
- + let b_in_previous = self.try_to_use.contains(b.summary.package_id());
- + let a = (a_in_previous, a.summary.version());
- + let b = (b_in_previous, b.summary.version());
- + a.cmp(&b).reverse()
- });
- let out = Rc::new(ret);
- diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs
- index b91abd1..35599ea 100644
- --- a/src/cargo/core/workspace.rs
- +++ b/src/cargo/core/workspace.rs
- @@ -1,3 +1,4 @@
- +use std::cell::RefCell;
- use std::collections::hash_map::{HashMap, Entry};
- use std::collections::BTreeMap;
- use std::path::{Path, PathBuf};
- @@ -8,6 +9,9 @@ use url::Url;
- use core::{Package, VirtualManifest, EitherManifest, SourceId};
- use core::{PackageIdSpec, Dependency, Profile, Profiles};
- +use core::registry::PackageRegistry;
- +use ops;
- +use sources::PathSource;
- use util::{Config, Filesystem};
- use util::errors::{CargoResult, CargoResultExt};
- use util::paths;
- @@ -67,6 +71,8 @@ pub struct Workspace<'cfg> {
- // needed by the current configuration (such as in cargo install). In some
- // cases `false` also results in the non-enforcement of dev-dependencies.
- require_optional_deps: bool,
- +
- + loaded_packages: RefCell<HashMap<PathBuf, Package>>,
- }
- // Separate structure for tracking loaded packages (to avoid loading anything
- @@ -138,6 +144,7 @@ impl<'cfg> Workspace<'cfg> {
- default_members: Vec::new(),
- is_ephemeral: false,
- require_optional_deps: true,
- + loaded_packages: RefCell::new(HashMap::new()),
- };
- ws.root_manifest = ws.find_root(manifest_path)?;
- ws.find_members()?;
- @@ -171,6 +178,7 @@ impl<'cfg> Workspace<'cfg> {
- default_members: Vec::new(),
- is_ephemeral: true,
- require_optional_deps,
- + loaded_packages: RefCell::new(HashMap::new()),
- };
- {
- let key = ws.current_manifest.parent().unwrap();
- @@ -627,12 +635,48 @@ impl<'cfg> Workspace<'cfg> {
- Ok(())
- }
- +
- + pub fn load(&self, manifest_path: &Path) -> CargoResult<Package> {
- + match self.packages.maybe_get(manifest_path) {
- + Some(&MaybePackage::Package(ref p)) => return Ok(p.clone()),
- + Some(&MaybePackage::Virtual(_)) => bail!("cannot load workspace root"),
- + None => {}
- + }
- +
- + let mut loaded = self.loaded_packages.borrow_mut();
- + if let Some(p) = loaded.get(manifest_path).cloned() {
- + return Ok(p)
- + }
- + let source_id = SourceId::for_path(manifest_path.parent().unwrap())?;
- + let (package, _nested_paths) =
- + ops::read_package(manifest_path, &source_id, self.config)?;
- + loaded.insert(manifest_path.to_path_buf(), package.clone());
- + Ok(package)
- + }
- +
- + pub fn preload(&self, registry: &mut PackageRegistry<'cfg>) {
- + for pkg in self.packages.packages.values() {
- + let pkg = match *pkg {
- + MaybePackage::Package(ref p) => p.clone(),
- + MaybePackage::Virtual(_) => continue,
- + };
- + let mut src = PathSource::new(pkg.manifest_path(),
- + pkg.package_id().source_id(),
- + self.config);
- + src.preload_with(pkg);
- + registry.add_preloaded(Box::new(src));
- + }
- + }
- }
- impl<'cfg> Packages<'cfg> {
- fn get(&self, manifest_path: &Path) -> &MaybePackage {
- - &self.packages[manifest_path.parent().unwrap()]
- + self.maybe_get(manifest_path).unwrap()
- + }
- +
- + fn maybe_get(&self, manifest_path: &Path) -> Option<&MaybePackage> {
- + self.packages.get(manifest_path.parent().unwrap())
- }
- fn load(&mut self, manifest_path: &Path) -> CargoResult<&MaybePackage> {
- diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs
- index 4cbdf2d..aba3ef1 100644
- --- a/src/cargo/ops/cargo_rustc/mod.rs
- +++ b/src/cargo/ops/cargo_rustc/mod.rs
- @@ -974,7 +974,7 @@ Cargo.toml. This warning might turn into a hard error in the future.",
- // to tighten up this in the future.
- let name = current.pkg.dependencies()
- .iter()
- - .filter(|d| d.matches_ignoring_source(dep.pkg.summary()))
- + .filter(|d| d.matches_ignoring_source(dep.pkg.package_id()))
- .filter_map(|d| d.rename())
- .next();
- diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs
- index 9edd720..31716e7 100644
- --- a/src/cargo/ops/registry.rs
- +++ b/src/cargo/ops/registry.rs
- @@ -400,8 +400,8 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> {
- Some(ref name) => name.clone(),
- None => {
- let manifest_path = find_root_manifest_for_wd(None, config.cwd())?;
- - let pkg = Package::for_path(&manifest_path, config)?;
- - pkg.name().to_string()
- + let ws = Workspace::new(&manifest_path, config)?;
- + ws.current()?.package_id().name().to_string()
- }
- };
- @@ -457,8 +457,8 @@ pub fn yank(config: &Config,
- Some(name) => name,
- None => {
- let manifest_path = find_root_manifest_for_wd(None, config.cwd())?;
- - let pkg = Package::for_path(&manifest_path, config)?;
- - pkg.name().to_string()
- + let ws = Workspace::new(&manifest_path, config)?;
- + ws.current()?.package_id().name().to_string()
- }
- };
- let version = match version {
- diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs
- index 6ade551..611e8f3 100644
- --- a/src/cargo/ops/resolve.rs
- +++ b/src/cargo/ops/resolve.rs
- @@ -95,8 +95,13 @@ pub fn resolve_ws_with_method<'a>(ws: &Workspace<'a>,
- Ok((packages, resolved_with_overrides))
- }
- -fn resolve_with_registry(ws: &Workspace, registry: &mut PackageRegistry, warn: bool)
- - -> CargoResult<Resolve> {
- +fn resolve_with_registry<'cfg>(
- + ws: &Workspace<'cfg>,
- + registry: &mut PackageRegistry<'cfg>,
- + warn: bool,
- +)
- + -> CargoResult<Resolve>
- +{
- let prev = ops::load_pkg_lockfile(ws)?;
- let resolve = resolve_with_previous(registry,
- ws,
- @@ -123,15 +128,18 @@ fn resolve_with_registry(ws: &Workspace, registry: &mut PackageRegistry, warn: b
- ///
- /// The previous resolve normally comes from a lockfile. This function does not
- /// read or write lockfiles from the filesystem.
- -pub fn resolve_with_previous<'a>(registry: &mut PackageRegistry,
- - ws: &Workspace,
- - method: Method,
- - previous: Option<&'a Resolve>,
- - to_avoid: Option<&HashSet<&'a PackageId>>,
- - specs: &[PackageIdSpec],
- - register_patches: bool,
- - warn: bool)
- - -> CargoResult<Resolve> {
- +pub fn resolve_with_previous<'a, 'cfg>(
- + registry: &mut PackageRegistry<'cfg>,
- + ws: &Workspace<'cfg>,
- + method: Method,
- + previous: Option<&'a Resolve>,
- + to_avoid: Option<&HashSet<&'a PackageId>>,
- + specs: &[PackageIdSpec],
- + register_patches: bool,
- + warn: bool,
- +)
- + -> CargoResult<Resolve>
- +{
- // Here we place an artificial limitation that all non-registry sources
- // cannot be locked at more than one revision. This means that if a git
- // repository provides more than one package, they must all be updated in
- @@ -174,14 +182,11 @@ pub fn resolve_with_previous<'a>(registry: &mut PackageRegistry,
- // ranges. To deal with this, we only actually lock a dependency
- // to the previously resolved version if the dependency listed
- // still matches the locked version.
- + let mut try_to_use = Vec::new();
- if let Some(r) = previous {
- trace!("previous: {:?}", r);
- - for node in r.iter().filter(keep) {
- - let deps = r.deps_not_replaced(node)
- - .filter(keep)
- - .cloned().collect();
- - registry.register_lock(node.clone(), deps);
- - }
- + register_previous_locks(ws, registry, r, keep);
- + try_to_use.extend(r.iter().filter(keep));
- }
- if register_patches {
- @@ -277,9 +282,11 @@ pub fn resolve_with_previous<'a>(registry: &mut PackageRegistry,
- None => root_replace.to_vec(),
- };
- + ws.preload(registry);
- let mut resolved = resolver::resolve(&summaries,
- &replace,
- registry,
- + &try_to_use,
- Some(ws.config()),
- warn)?;
- resolved.register_used_patches(registry.patches());
- @@ -325,3 +332,52 @@ fn get_resolved_packages<'a>(resolve: &Resolve,
- registry.get(&ids)
- }
- +fn register_previous_locks<'a>(ws: &Workspace,
- + registry: &mut PackageRegistry,
- + resolve: &'a Resolve,
- + keep: &Fn(&&'a PackageId) -> bool) {
- + let mut avoid_locking = HashSet::new();
- + for node in resolve.iter() {
- + if !keep(&node) {
- + add_deps(resolve, node, &mut avoid_locking);
- + continue
- + }
- + let path = match node.source_id().url().to_file_path() {
- + Ok(path) => path,
- + Err(_) => continue,
- + };
- + let pkg = match ws.load(&path.join("Cargo.toml")) {
- + Ok(p) => p,
- + Err(_) => continue,
- + };
- + for dep in resolve.deps_not_replaced(node) {
- + // Note that the source is ignored here to account for `[patch]`.
- + // The correctness of this is... somewhat unknown, but it seems to
- + // work well enough for now.
- + if !pkg.dependencies().iter().any(|d| d.matches_ignoring_source(dep)) {
- + add_deps(resolve, dep, &mut avoid_locking);
- + }
- + }
- + }
- +
- + let ref keep = |id: &&'a PackageId| keep(id) && !avoid_locking.contains(id);
- +
- + for node in resolve.iter().filter(keep) {
- + let deps = resolve.deps_not_replaced(node)
- + .filter(keep)
- + .cloned()
- + .collect();
- + registry.register_lock(node.clone(), deps);
- + }
- +
- + fn add_deps<'a>(resolve: &'a Resolve,
- + node: &'a PackageId,
- + set: &mut HashSet<&'a PackageId>) {
- + if !set.insert(node) {
- + return
- + }
- + for dep in resolve.deps_not_replaced(node) {
- + add_deps(resolve, dep, set);
- + }
- + }
- +}
- diff --git a/src/cargo/sources/path.rs b/src/cargo/sources/path.rs
- index fa7fc13..a3deae1 100644
- --- a/src/cargo/sources/path.rs
- +++ b/src/cargo/sources/path.rs
- @@ -55,6 +55,14 @@ impl<'cfg> PathSource<'cfg> {
- }
- }
- + pub fn preload_with(&mut self, pkg: Package) {
- + assert!(!self.updated);
- + assert!(!self.recursive);
- + assert!(self.packages.is_empty());
- + self.updated = true;
- + self.packages.push(pkg);
- + }
- +
- pub fn root_package(&mut self) -> CargoResult<Package> {
- trace!("root_package; source={:?}", self);
- diff --git a/src/cargo/util/config.rs b/src/cargo/util/config.rs
- index 927d0e1..fc67b8a 100644
- --- a/src/cargo/util/config.rs
- +++ b/src/cargo/util/config.rs
- @@ -68,9 +68,7 @@ pub struct Config {
- }
- impl Config {
- - pub fn new(shell: Shell,
- - cwd: PathBuf,
- - homedir: PathBuf) -> Config {
- + pub fn new(shell: Shell, cwd: PathBuf, homedir: PathBuf) -> Config {
- static mut GLOBAL_JOBSERVER: *mut jobserver::Client = 0 as *mut _;
- static INIT: Once = ONCE_INIT;
- diff --git a/tests/testsuite/lib.rs b/tests/testsuite/lib.rs
- index 9f66a61..eb1f519 100644
- --- a/tests/testsuite/lib.rs
- +++ b/tests/testsuite/lib.rs
- @@ -81,6 +81,7 @@ mod search;
- mod small_fd_limits;
- mod test;
- mod tool_paths;
- +mod update;
- mod verify_project;
- mod version;
- mod warn_on_failure;
- diff --git a/tests/testsuite/resolve.rs b/tests/testsuite/resolve.rs
- index 735e216..1694ee0 100644
- --- a/tests/testsuite/resolve.rs
- +++ b/tests/testsuite/resolve.rs
- @@ -31,7 +31,12 @@ fn resolve(pkg: &PackageId, deps: Vec<Dependency>, registry: &[Summary])
- let mut registry = MyRegistry(registry);
- let summary = Summary::new(pkg.clone(), deps, BTreeMap::new(), None).unwrap();
- let method = Method::Everything;
- - let resolve = resolver::resolve(&[(summary, method)], &[], &mut registry, None, false)?;
- + let resolve = resolver::resolve(&[(summary, method)],
- + &[],
- + &mut registry,
- + &[],
- + None,
- + false)?;
- let res = resolve.iter().cloned().collect();
- Ok(res)
- }
- diff --git a/tests/testsuite/update.rs b/tests/testsuite/update.rs
- new file mode 100644
- index 0000000..186ca89
- --- /dev/null
- +++ b/tests/testsuite/update.rs
- @@ -0,0 +1,143 @@
- +use std::fs::File;
- +use std::io::prelude::*;
- +
- +use cargotest::support::{project, execs};
- +use cargotest::support::registry::Package;
- +use hamcrest::assert_that;
- +
- +#[test]
- +fn minor_update_two_places() {
- + Package::new("log", "0.1.0").publish();
- + let p = project("foo")
- + .file("Cargo.toml", r#"
- + [package]
- + name = "bar"
- + version = "0.0.1"
- + authors = []
- +
- + [dependencies]
- + log = "0.1"
- + foo = { path = "foo" }
- + "#)
- + .file("src/lib.rs", "")
- + .file("foo/Cargo.toml", r#"
- + [package]
- + name = "foo"
- + version = "0.0.1"
- + authors = []
- +
- + [dependencies]
- + log = "0.1"
- + "#)
- + .file("foo/src/lib.rs", "")
- + .build();
- +
- + assert_that(p.cargo("build"), execs().with_status(0));
- + Package::new("log", "0.1.1").publish();
- +
- + File::create(p.root().join("foo/Cargo.toml")).unwrap().write_all(br#"
- + [package]
- + name = "foo"
- + version = "0.0.1"
- + authors = []
- +
- + [dependencies]
- + log = "0.1.1"
- + "#).unwrap();
- +
- + assert_that(p.cargo("build").env("RUST_LOG", "cargo=trace"),
- + execs().with_status(0));
- +}
- +
- +#[test]
- +fn transitive_minor_update() {
- + Package::new("log", "0.1.0").publish();
- + Package::new("serde", "0.1.0")
- + .dep("log", "0.1")
- + .publish();
- +
- + let p = project("foo")
- + .file("Cargo.toml", r#"
- + [package]
- + name = "bar"
- + version = "0.0.1"
- + authors = []
- +
- + [dependencies]
- + serde = "0.1"
- + log = "0.1"
- + foo = { path = "foo" }
- + "#)
- + .file("src/lib.rs", "")
- + .file("foo/Cargo.toml", r#"
- + [package]
- + name = "foo"
- + version = "0.0.1"
- + authors = []
- +
- + [dependencies]
- + serde = "0.1"
- + "#)
- + .file("foo/src/lib.rs", "")
- + .build();
- +
- + assert_that(p.cargo("build"), execs().with_status(0));
- +
- + Package::new("log", "0.1.1").publish();
- + Package::new("serde", "0.1.1")
- + .dep("log", "0.1.1")
- + .publish();
- +
- + assert_that(p.cargo("update").arg("-p").arg("serde"),
- + execs().with_status(0).with_stderr("\
- +[UPDATING] registry `[..]`
- +[UPDATING] log v0.1.0 -> v0.1.1
- +[UPDATING] serde v0.1.0 -> v0.1.1
- +"));
- +}
- +
- +#[test]
- +fn conservative() {
- + Package::new("log", "0.1.0").publish();
- + Package::new("serde", "0.1.0")
- + .dep("log", "0.1")
- + .publish();
- +
- + let p = project("foo")
- + .file("Cargo.toml", r#"
- + [package]
- + name = "bar"
- + version = "0.0.1"
- + authors = []
- +
- + [dependencies]
- + serde = "0.1"
- + log = "0.1"
- + foo = { path = "foo" }
- + "#)
- + .file("src/lib.rs", "")
- + .file("foo/Cargo.toml", r#"
- + [package]
- + name = "foo"
- + version = "0.0.1"
- + authors = []
- +
- + [dependencies]
- + serde = "0.1"
- + "#)
- + .file("foo/src/lib.rs", "")
- + .build();
- +
- + assert_that(p.cargo("build"), execs().with_status(0));
- +
- + Package::new("log", "0.1.1").publish();
- + Package::new("serde", "0.1.1")
- + .dep("log", "0.1")
- + .publish();
- +
- + assert_that(p.cargo("update").arg("-p").arg("serde"),
- + execs().with_status(0).with_stderr("\
- +[UPDATING] registry `[..]`
- +[UPDATING] serde v0.1.0 -> v0.1.1
- +"));
- +}
Add Comment
Please, Sign In to add comment