From 2f4ab7719548fbf8b54c84e1d8b615bb6e880a95 Mon Sep 17 00:00:00 2001 From: Xuyang Zhang Date: Fri, 10 Jul 2026 20:57:04 +0800 Subject: [PATCH] bootstrap: honor suite skips for coverage modes --- src/bootstrap/src/core/build_steps/test.rs | 18 +++++++++------ .../src/core/build_steps/test/tests.rs | 23 +++++++++++++++++++ 2 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 src/bootstrap/src/core/build_steps/test/tests.rs diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 61529da631a06..231c336d54330 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -46,6 +46,8 @@ use crate::{CLang, CodegenBackendKind, GitRepo, Mode, PathSet, TestTarget, envif mod compiletest; pub mod failed_tests; +#[cfg(test)] +mod tests; /// Runs `cargo test` on various internal tools used by bootstrap. #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -1958,6 +1960,11 @@ impl Coverage { const SUITE: &'static str = "coverage"; const ALL_MODES: &[CompiletestMode] = &[CompiletestMode::CoverageMap, CompiletestMode::CoverageRun]; + + fn skips_all_modes(skip: &[PathBuf]) -> bool { + let path = Path::new(Self::PATH); + skip.iter().any(|skip| path.starts_with(skip) || path.ends_with(skip)) + } } impl Step for Coverage { @@ -1983,6 +1990,10 @@ impl Step for Coverage { } fn make_run(run: RunConfig<'_>) { + if Self::skips_all_modes(&run.builder.config.skip) { + return; + } + let compiler = run.builder.compiler(run.builder.top_stage, run.build_triple()); let target = run.target; @@ -2016,13 +2027,6 @@ impl Step for Coverage { !run.builder.config.skip.iter().any(|skip| skip == Path::new(mode.as_str())) }); - // FIXME(Zalathar): Make these commands skip all coverage tests, as expected: - // - `./x test --skip=tests` - // - `./x test --skip=tests/coverage` - // - `./x test --skip=coverage` - // Skip handling currently doesn't have a way to know that skipping the coverage - // suite should also skip the `coverage-map` and `coverage-run` aliases. - for mode in modes { run.builder.ensure(Coverage { compiler, target, mode }); } diff --git a/src/bootstrap/src/core/build_steps/test/tests.rs b/src/bootstrap/src/core/build_steps/test/tests.rs new file mode 100644 index 0000000000000..6d8b42aa88b22 --- /dev/null +++ b/src/bootstrap/src/core/build_steps/test/tests.rs @@ -0,0 +1,23 @@ +use std::path::PathBuf; + +use super::Coverage; + +#[test] +fn coverage_skip_matches_suite_paths() { + for path in ["tests", "tests/coverage", "coverage"] { + assert!( + Coverage::skips_all_modes(&[PathBuf::from(path)]), + "{path} should skip all coverage tests" + ); + } +} + +#[test] +fn coverage_skip_preserves_other_modes() { + for path in ["coverage-map", "coverage-run"] { + assert!( + !Coverage::skips_all_modes(&[PathBuf::from(path)]), + "{path} should only skip its corresponding coverage mode" + ); + } +}