From 07c667fb2659e3f56bca5ecc28dc07cf70e93e16 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 22 Dec 2016 20:56:40 +0300 Subject: [PATCH] Path deps outside workspace are not members closes #3192 --- src/cargo/core/workspace.rs | 17 ++++++++++++----- tests/workspaces.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index 13898323010..fdd14ee23e3 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -293,21 +293,28 @@ impl<'cfg> Workspace<'cfg> { }; if let Some(list) = members { - let root = root_manifest.parent().unwrap(); for path in list { + let root = root_manifest.parent().unwrap(); let manifest_path = root.join(path).join("Cargo.toml"); - self.find_path_deps(&manifest_path)?; + self.find_path_deps(&manifest_path, false)?; } } - self.find_path_deps(&root_manifest) + self.find_path_deps(&root_manifest, false) } - fn find_path_deps(&mut self, manifest_path: &Path) -> CargoResult<()> { + fn find_path_deps(&mut self, manifest_path: &Path, is_path_dep: bool) -> CargoResult<()> { let manifest_path = paths::normalize_path(manifest_path); if self.members.iter().any(|p| p == &manifest_path) { return Ok(()) } + if is_path_dep + && !manifest_path.parent().unwrap().starts_with(self.root()) + && self.find_root(&manifest_path)? != self.root_manifest { + // If `manifest_path` is a path dependency outside of the workspace, + // don't add it, or any of its dependencies, as a members. + return Ok(()) + } debug!("find_members - {}", manifest_path.display()); self.members.push(manifest_path.clone()); @@ -326,7 +333,7 @@ impl<'cfg> Workspace<'cfg> { .collect::>() }; for candidate in candidates { - self.find_path_deps(&candidate)?; + self.find_path_deps(&candidate, true)?; } Ok(()) } diff --git a/tests/workspaces.rs b/tests/workspaces.rs index 86775d81587..51cb366c3ed 100644 --- a/tests/workspaces.rs +++ b/tests/workspaces.rs @@ -1100,4 +1100,32 @@ fn relative_path_for_member_works() { assert_that(p.cargo("build").cwd(p.root().join("foo")), execs().with_status(0)); assert_that(p.cargo("build").cwd(p.root().join("bar")), execs().with_status(0)); +} + +#[test] +fn path_dep_outside_workspace_is_not_member() { + let p = project("foo") + .file("ws/Cargo.toml", r#" + [project] + name = "ws" + version = "0.1.0" + authors = [] + + [dependencies] + foo = { path = "../foo" } + + [workspace] + "#) + .file("ws/src/lib.rs", r"extern crate foo;") + .file("foo/Cargo.toml", r#" + [project] + name = "foo" + version = "0.1.0" + authors = [] + "#) + .file("foo/src/lib.rs", ""); + p.build(); + + assert_that(p.cargo("build").cwd(p.root().join("ws")), + execs().with_status(0)); } \ No newline at end of file