From c749ad73eb965781db88cb1327c5fc6372f20d3e Mon Sep 17 00:00:00 2001 From: Simon Rasmussen Date: Mon, 14 Nov 2022 13:14:20 +0100 Subject: [PATCH 1/3] Add globbing to `workspace.exclude` list --- src/cargo/core/workspace.rs | 5 ++++- tests/testsuite/workspaces.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index 0d07dafa347..291b918f466 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -1590,7 +1590,10 @@ impl WorkspaceRootConfig { let excluded = self .exclude .iter() - .any(|ex| manifest_path.starts_with(self.root_dir.join(ex))); + .filter_map(|ex| self.root_dir.join(ex).to_str().and_then(|p| glob(p).ok())) + .flatten() + .filter_map(|ex| ex.ok()) + .any(|ex| manifest_path.starts_with(ex)); let explicit_member = match self.members { Some(ref members) => members diff --git a/tests/testsuite/workspaces.rs b/tests/testsuite/workspaces.rs index 58da0c0afce..71575e973b4 100644 --- a/tests/testsuite/workspaces.rs +++ b/tests/testsuite/workspaces.rs @@ -1593,6 +1593,32 @@ fn excluded_simple() { assert!(p.root().join("foo/target").is_dir()); } +#[cargo_test] +fn excluded_glob() { + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "ws" + version = "0.1.0" + authors = [] + + [workspace] + exclude = ["repos/*"] + "#, + ) + .file("src/lib.rs", "") + .file("repos/foo/Cargo.toml", &basic_manifest("foo", "0.1.0")) + .file("repos/foo/src/lib.rs", ""); + let p = p.build(); + + p.cargo("build").run(); + assert!(p.root().join("target").is_dir()); + p.cargo("build").cwd("repos/foo").run(); + assert!(p.root().join("repos/foo/target").is_dir()); +} + #[cargo_test] fn exclude_members_preferred() { let p = project() From 42287bc4dbd2f00697bd0f1de27f1e5a0bdf3780 Mon Sep 17 00:00:00 2001 From: Simon Rasmussen Date: Mon, 14 Nov 2022 13:29:12 +0100 Subject: [PATCH 2/3] Extend glob test --- tests/testsuite/workspaces.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/testsuite/workspaces.rs b/tests/testsuite/workspaces.rs index 71575e973b4..2562e65a362 100644 --- a/tests/testsuite/workspaces.rs +++ b/tests/testsuite/workspaces.rs @@ -1610,13 +1610,17 @@ fn excluded_glob() { ) .file("src/lib.rs", "") .file("repos/foo/Cargo.toml", &basic_manifest("foo", "0.1.0")) - .file("repos/foo/src/lib.rs", ""); + .file("repos/foo/src/lib.rs", "") + .file("repos/bar/Cargo.toml", &basic_manifest("bar", "0.1.0")) + .file("repos/bar/src/lib.rs", ""); let p = p.build(); p.cargo("build").run(); assert!(p.root().join("target").is_dir()); p.cargo("build").cwd("repos/foo").run(); assert!(p.root().join("repos/foo/target").is_dir()); + p.cargo("build").cwd("repos/bar").run(); + assert!(p.root().join("repos/bar/target").is_dir()); } #[cargo_test] From c3cf14c4bcc70d21f66ae7999667b06d4ad2cf0f Mon Sep 17 00:00:00 2001 From: Simon Rasmussen Date: Mon, 14 Nov 2022 13:40:01 +0100 Subject: [PATCH 3/3] Test nested workspace for exclude glob --- tests/testsuite/workspaces.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/testsuite/workspaces.rs b/tests/testsuite/workspaces.rs index 2562e65a362..5a2a6000212 100644 --- a/tests/testsuite/workspaces.rs +++ b/tests/testsuite/workspaces.rs @@ -1609,6 +1609,18 @@ fn excluded_glob() { "#, ) .file("src/lib.rs", "") + .file( + "repos/workspace/Cargo.toml", + r#" + [workspace] + members = ["crates/*"] + "#, + ) + .file( + "repos/workspace/crates/xyz/Cargo.toml", + &basic_manifest("xyz", "0.1.0"), + ) + .file("repos/workspace/crates/xyz/src/lib.rs", "") .file("repos/foo/Cargo.toml", &basic_manifest("foo", "0.1.0")) .file("repos/foo/src/lib.rs", "") .file("repos/bar/Cargo.toml", &basic_manifest("bar", "0.1.0")) @@ -1617,6 +1629,8 @@ fn excluded_glob() { p.cargo("build").run(); assert!(p.root().join("target").is_dir()); + p.cargo("build").cwd("repos/workspace").run(); + assert!(p.root().join("repos/workspace/target").is_dir()); p.cargo("build").cwd("repos/foo").run(); assert!(p.root().join("repos/foo/target").is_dir()); p.cargo("build").cwd("repos/bar").run();