Skip to content

Commit

Permalink
Path deps outside workspace are not members
Browse files Browse the repository at this point in the history
  • Loading branch information
matklad committed Jan 14, 2017
1 parent 6c79cf9 commit 07c667f
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/cargo/core/workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand All @@ -326,7 +333,7 @@ impl<'cfg> Workspace<'cfg> {
.collect::<Vec<_>>()
};
for candidate in candidates {
self.find_path_deps(&candidate)?;
self.find_path_deps(&candidate, true)?;
}
Ok(())
}
Expand Down
28 changes: 28 additions & 0 deletions tests/workspaces.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

0 comments on commit 07c667f

Please sign in to comment.