From ed4d2cff218fca479fa7c6c42b78436a57dc230e Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Wed, 15 Jul 2026 13:19:53 -0700 Subject: [PATCH] [fix] Don't skip hidden dot-directories when walking a directory argument WalkBuilder ignores hidden files by default, so `rubyfmt --check .` (or `-i .`) silently never visits .rb files under dot-directories like .buildkite/ or .github/ even when they're tracked in git and not excluded by any .gitignore/.rubyfmtignore pattern. Passing an explicit file path bypasses the walk entirely and is unaffected, which made the gap easy to miss: `rubyfmt --check .buildkite/pipeline.rb` catches problems that `rubyfmt --check .` does not. Un-hide dotfiles in the walk and explicitly filter out .git, since that's the one dot-directory we never want to walk into regardless. --- src/main.rs | 6 +++++ tests/cli_interface_test.rs | 52 +++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/main.rs b/src/main.rs index 1c6aeb06..7409157e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -232,6 +232,12 @@ fn file_walker_builder(include_paths: Vec<&String>, include_gitignored: bool) -> builder.git_ignore(!include_gitignored); builder.add_custom_ignore_filename(".rubyfmtignore"); + + // WalkBuilder ignores hidden files by default, dropping .rb files under + // dot-directories like .buildkite/. Un-hide dotfiles, but keep .git out. + builder.hidden(false); + builder.filter_entry(|entry| entry.file_name() != OsStr::new(".git")); + builder } diff --git a/tests/cli_interface_test.rs b/tests/cli_interface_test.rs index 29d4f2bb..9034c412 100644 --- a/tests/cli_interface_test.rs +++ b/tests/cli_interface_test.rs @@ -461,6 +461,58 @@ fn test_format_directory_with_changes() { assert_eq!("a(4, 5, 6)\n", read_to_string(file_two.path()).unwrap()); } +#[test] +fn test_format_directory_with_changes_in_hidden_directory() { + // Hidden directories should not be skipped when walking a directory argument. + let dir = tempdir().unwrap(); + let dir_name = dir.path().to_str().unwrap().to_owned(); + create_dir(dir_name.clone() + "/.hidden").unwrap(); + + let mut file = tempfile::Builder::new() + .prefix("rubyfmt") + .suffix(".rb") + .tempfile_in(dir_name.clone() + "/.hidden") + .unwrap(); + writeln!(file, "a 1, 2, 3").unwrap(); + + Command::cargo_bin("rubyfmt-main") + .unwrap() + .arg(dir_name) + .arg("-i") + .assert() + .stdout("") + .code(0) + .success(); + + assert_eq!("a(1, 2, 3)\n", read_to_string(file.path()).unwrap()); +} + +#[test] +fn test_format_directory_ignores_git_directory() { + // .git should still be skipped even though hidden directories are walked now. + let dir = tempdir().unwrap(); + let dir_name = dir.path().to_str().unwrap().to_owned(); + create_dir(dir_name.clone() + "/.git").unwrap(); + + let mut file = tempfile::Builder::new() + .prefix("rubyfmt") + .suffix(".rb") + .tempfile_in(dir_name.clone() + "/.git") + .unwrap(); + writeln!(file, "a 1, 2, 3").unwrap(); + + Command::cargo_bin("rubyfmt-main") + .unwrap() + .arg(dir_name) + .arg("-i") + .assert() + .stdout("") + .code(0) + .success(); + + assert_eq!("a 1, 2, 3\n", read_to_string(file.path()).unwrap()); +} + #[test] fn format_input_file_with_changes() { let mut file_one = NamedTempFile::new().unwrap();