Skip to content

Commit ed4d2cf

Browse files
committed
[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.
1 parent b63fbaa commit ed4d2cf

2 files changed

Lines changed: 58 additions & 0 deletions

File tree

src/main.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,12 @@ fn file_walker_builder(include_paths: Vec<&String>, include_gitignored: bool) ->
232232

233233
builder.git_ignore(!include_gitignored);
234234
builder.add_custom_ignore_filename(".rubyfmtignore");
235+
236+
// WalkBuilder ignores hidden files by default, dropping .rb files under
237+
// dot-directories like .buildkite/. Un-hide dotfiles, but keep .git out.
238+
builder.hidden(false);
239+
builder.filter_entry(|entry| entry.file_name() != OsStr::new(".git"));
240+
235241
builder
236242
}
237243

tests/cli_interface_test.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,58 @@ fn test_format_directory_with_changes() {
461461
assert_eq!("a(4, 5, 6)\n", read_to_string(file_two.path()).unwrap());
462462
}
463463

464+
#[test]
465+
fn test_format_directory_with_changes_in_hidden_directory() {
466+
// Hidden directories should not be skipped when walking a directory argument.
467+
let dir = tempdir().unwrap();
468+
let dir_name = dir.path().to_str().unwrap().to_owned();
469+
create_dir(dir_name.clone() + "/.hidden").unwrap();
470+
471+
let mut file = tempfile::Builder::new()
472+
.prefix("rubyfmt")
473+
.suffix(".rb")
474+
.tempfile_in(dir_name.clone() + "/.hidden")
475+
.unwrap();
476+
writeln!(file, "a 1, 2, 3").unwrap();
477+
478+
Command::cargo_bin("rubyfmt-main")
479+
.unwrap()
480+
.arg(dir_name)
481+
.arg("-i")
482+
.assert()
483+
.stdout("")
484+
.code(0)
485+
.success();
486+
487+
assert_eq!("a(1, 2, 3)\n", read_to_string(file.path()).unwrap());
488+
}
489+
490+
#[test]
491+
fn test_format_directory_ignores_git_directory() {
492+
// .git should still be skipped even though hidden directories are walked now.
493+
let dir = tempdir().unwrap();
494+
let dir_name = dir.path().to_str().unwrap().to_owned();
495+
create_dir(dir_name.clone() + "/.git").unwrap();
496+
497+
let mut file = tempfile::Builder::new()
498+
.prefix("rubyfmt")
499+
.suffix(".rb")
500+
.tempfile_in(dir_name.clone() + "/.git")
501+
.unwrap();
502+
writeln!(file, "a 1, 2, 3").unwrap();
503+
504+
Command::cargo_bin("rubyfmt-main")
505+
.unwrap()
506+
.arg(dir_name)
507+
.arg("-i")
508+
.assert()
509+
.stdout("")
510+
.code(0)
511+
.success();
512+
513+
assert_eq!("a 1, 2, 3\n", read_to_string(file.path()).unwrap());
514+
}
515+
464516
#[test]
465517
fn format_input_file_with_changes() {
466518
let mut file_one = NamedTempFile::new().unwrap();

0 commit comments

Comments
 (0)