diff --git a/CHANGELOG.md b/CHANGELOG.md index 346208b2..b3c470ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ Bug fixes: [BUG #2836](https://github.com/BurntSushi/ripgrep/issues/2836), [BUG #2933](https://github.com/BurntSushi/ripgrep/pull/2933): Fix bug related to gitignores from parent directories. +* [BUG #2177](https://github.com/BurntSushi/ripgrep/issues/2177): + Ignore a UTF-8 BOM marker at the start of `.gitignore` (and similar files). Feature enhancements: diff --git a/crates/ignore/src/gitignore.rs b/crates/ignore/src/gitignore.rs index 19a347cd..eeb51b82 100644 --- a/crates/ignore/src/gitignore.rs +++ b/crates/ignore/src/gitignore.rs @@ -402,6 +402,12 @@ impl GitignoreBuilder { break; } }; + + // Match Git's handling of .gitignore files that begin with the Unicode BOM + const UTF8_BOM: &str = "\u{feff}"; + let line = + if i == 0 { line.trim_start_matches(UTF8_BOM) } else { &line }; + if let Err(err) = self.add_line(Some(path.to_path_buf()), &line) { errs.push(err.tagged(path, lineno)); } diff --git a/crates/ignore/tests/gitignore_skip_bom.gitignore b/crates/ignore/tests/gitignore_skip_bom.gitignore new file mode 100644 index 00000000..a78c13a9 --- /dev/null +++ b/crates/ignore/tests/gitignore_skip_bom.gitignore @@ -0,0 +1,2 @@ +ignore/this/path +# This file begins with a BOM (U+FEFF) diff --git a/crates/ignore/tests/gitignore_skip_bom.rs b/crates/ignore/tests/gitignore_skip_bom.rs new file mode 100644 index 00000000..14d533d6 --- /dev/null +++ b/crates/ignore/tests/gitignore_skip_bom.rs @@ -0,0 +1,17 @@ +use ignore::gitignore::GitignoreBuilder; + +const IGNORE_FILE: &'static str = "tests/gitignore_skip_bom.gitignore"; + +/// Skip a Byte-Order Mark (BOM) at the beginning of the file, matching Git's +/// behavior. +/// +/// Ref: +#[test] +fn gitignore_skip_bom() { + let mut builder = GitignoreBuilder::new("ROOT"); + let error = builder.add(IGNORE_FILE); + assert!(error.is_none(), "failed to open gitignore file"); + let g = builder.build().unwrap(); + + assert!(g.matched("ignore/this/path", false).is_ignore()); +}