From b4936133bb781676070d5189362823ef058e0041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= Date: Mon, 4 Mar 2024 19:30:53 +0000 Subject: [PATCH 1/4] Split dots in filename, not the entire path --- .../tests_revision_unpaired_stdout_stderr.rs | 22 +++++++++++++------ tests/ui/meta/dir.with.dots/test.rs | 7 ++++++ 2 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 tests/ui/meta/dir.with.dots/test.rs diff --git a/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs b/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs index 394f95e9144d2..87dbb0026d493 100644 --- a/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs +++ b/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs @@ -84,7 +84,9 @@ pub fn check(tests_path: impl AsRef, bad: &mut bool) { } }); - let Some((test_name, _)) = test.to_str().map(|s| s.split_once('.')).flatten() else { + let Some((test_name, _)) = + test.file_name().map(OsStr::to_str).flatten().map(|n| n.split_once('.')).flatten() + else { continue; }; @@ -98,14 +100,20 @@ pub fn check(tests_path: impl AsRef, bad: &mut bool) { for sibling in files_under_inspection.iter().filter(|f| { f.extension().map(OsStr::to_str).flatten().is_some_and(|ext| EXTENSIONS.contains(&ext)) }) { - let filename_components = sibling.to_str().unwrap().split('.').collect::>(); - let file_prefix = filename_components[0]; + let Some(filename) = sibling.file_name().map(OsStr::to_str).flatten() else { + continue; + }; + + let filename_components = filename.split('.').collect::>(); + let [file_prefix, ..] = &filename_components[..] else { + continue; + }; - let Some((test_path, expected_revisions)) = test_info.get(file_prefix) else { + let Some((test_path, expected_revisions)) = test_info.get(*file_prefix) else { continue; }; - match filename_components[..] { + match &filename_components[..] { // Cannot have a revision component, skip. [] | [_] => return, [_, _] if !expected_revisions.is_empty() => { @@ -120,9 +128,9 @@ pub fn check(tests_path: impl AsRef, bad: &mut bool) { [_, _] => return, [_, found_revision, .., extension] => { if !IGNORES.contains(&found_revision) - && !expected_revisions.contains(found_revision) + && !expected_revisions.contains(*found_revision) // This is from `//@ stderr-per-bitwidth` - && !(extension == "stderr" && ["32bit", "64bit"].contains(&found_revision)) + && !(*extension == "stderr" && ["32bit", "64bit"].contains(&found_revision)) { // Found some unexpected revision-esque component that is not a known // compare-mode or expected revision. diff --git a/tests/ui/meta/dir.with.dots/test.rs b/tests/ui/meta/dir.with.dots/test.rs new file mode 100644 index 0000000000000..4d663e994f52b --- /dev/null +++ b/tests/ui/meta/dir.with.dots/test.rs @@ -0,0 +1,7 @@ +// Regression test for . +// Check that `tests_revision_unpaired_stdout_stderr` don't accidentally get confused by +// paths containing periods. + +//@ check-pass + +fn main() {} From 9bebbf14c57c027138fd4bb335acaf9b83aa68b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= Date: Mon, 4 Mar 2024 20:07:39 +0000 Subject: [PATCH 2/4] Use Path::file_stem instead --- src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs b/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs index 87dbb0026d493..98b47b6ef661d 100644 --- a/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs +++ b/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs @@ -84,9 +84,7 @@ pub fn check(tests_path: impl AsRef, bad: &mut bool) { } }); - let Some((test_name, _)) = - test.file_name().map(OsStr::to_str).flatten().map(|n| n.split_once('.')).flatten() - else { + let Some(test_name) = test.file_stem().map(OsStr::to_str).flatten() else { continue; }; From 53f48ddbc7f6a42c2e67f8b16f5868f483821744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= Date: Tue, 5 Mar 2024 08:11:27 +0000 Subject: [PATCH 3/4] Assert that test names cannot contain dots This is so that we can catch stray test output files, since test names without dots can form predictable patterns we can match on. --- src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs b/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs index 98b47b6ef661d..a0773c85bef5e 100644 --- a/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs +++ b/src/tools/tidy/src/tests_revision_unpaired_stdout_stderr.rs @@ -88,6 +88,12 @@ pub fn check(tests_path: impl AsRef, bad: &mut bool) { continue; }; + assert!( + !test_name.contains('.'), + "test name cannot contain dots '.': `{}`", + test.display() + ); + test_info.insert(test_name.to_string(), (test, expected_revisions)); } From 247a080b9852e3ab176cca63f5695c8a6b2202cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= Date: Tue, 5 Mar 2024 09:02:33 +0000 Subject: [PATCH 4/4] Update test names to not have dots --- tests/rustdoc/{invalid.crate.name.rs => invalid$crate$name.rs} | 0 ...ate-arg-ignore-tidy.x.rs => need-crate-arg-ignore-tidy$x.rs} | 0 ...ignore-tidy.x.stderr => need-crate-arg-ignore-tidy$x.stderr} | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename tests/rustdoc/{invalid.crate.name.rs => invalid$crate$name.rs} (100%) rename tests/ui/command/{need-crate-arg-ignore-tidy.x.rs => need-crate-arg-ignore-tidy$x.rs} (100%) rename tests/ui/command/{need-crate-arg-ignore-tidy.x.stderr => need-crate-arg-ignore-tidy$x.stderr} (68%) diff --git a/tests/rustdoc/invalid.crate.name.rs b/tests/rustdoc/invalid$crate$name.rs similarity index 100% rename from tests/rustdoc/invalid.crate.name.rs rename to tests/rustdoc/invalid$crate$name.rs diff --git a/tests/ui/command/need-crate-arg-ignore-tidy.x.rs b/tests/ui/command/need-crate-arg-ignore-tidy$x.rs similarity index 100% rename from tests/ui/command/need-crate-arg-ignore-tidy.x.rs rename to tests/ui/command/need-crate-arg-ignore-tidy$x.rs diff --git a/tests/ui/command/need-crate-arg-ignore-tidy.x.stderr b/tests/ui/command/need-crate-arg-ignore-tidy$x.stderr similarity index 68% rename from tests/ui/command/need-crate-arg-ignore-tidy.x.stderr rename to tests/ui/command/need-crate-arg-ignore-tidy$x.stderr index 89f7210c048e1..28f6d31b1ce59 100644 --- a/tests/ui/command/need-crate-arg-ignore-tidy.x.stderr +++ b/tests/ui/command/need-crate-arg-ignore-tidy$x.stderr @@ -1,4 +1,4 @@ -error: invalid character `'.'` in crate name: `need_crate_arg_ignore_tidy.x` +error: invalid character `'$'` in crate name: `need_crate_arg_ignore_tidy$x` | = help: you can either pass `--crate-name` on the command line or add `#![crate_name="…"]` to set the crate name