From 922bad2b92a564ac442368e9e2522f11d61f593f Mon Sep 17 00:00:00 2001 From: Kento Okamoto Date: Fri, 13 Oct 2023 22:49:21 -0700 Subject: [PATCH] ignore: improve 'excludesFile' parsing This permits the value to be surrounded in double quotes. It's still not perfect, but probably better than it was. Getting this to be more correct will likely require writing (or using) a real parser, which I'm not particularly incliend to do at present. Fixes #2392, Closes #2629 --- CHANGELOG.md | 2 ++ crates/ignore/src/gitignore.rs | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3cf8073b..5de53e23e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,8 @@ Bug fixes: Fix gitignore parsing bug where a trailing `\/` resulted in an error. * [BUG #2243](https://github.com/BurntSushi/ripgrep/issues/2243): Fix `--sort` flag for values other than `path`. +* [BUG #2392](https://github.com/BurntSushi/ripgrep/issues/2392): + Improve global git config parsing of the `excludesFile` field. * [BUG #2480](https://github.com/BurntSushi/ripgrep/issues/2480): Fix bug when using inline regex flags with `-e/--regexp`. * [BUG #2523](https://github.com/BurntSushi/ripgrep/issues/2523): diff --git a/crates/ignore/src/gitignore.rs b/crates/ignore/src/gitignore.rs index da0072989..0b667f264 100644 --- a/crates/ignore/src/gitignore.rs +++ b/crates/ignore/src/gitignore.rs @@ -605,7 +605,7 @@ fn parse_excludes_file(data: &[u8]) -> Option { Regex::builder() .configure(Regex::config().utf8_empty(false)) .syntax(syntax::Config::new().utf8(false)) - .build(r"(?im-u)^\s*excludesfile\s*=\s*(\S+)\s*$") + .build(r#"(?im-u)^\s*excludesfile\s*=\s*"?\s*(\S+?)\s*"?\s*$"#) .unwrap() }); // We don't care about amortizing allocs here I think. This should only @@ -772,6 +772,22 @@ mod tests { assert!(super::parse_excludes_file(&data).is_none()); } + #[test] + fn parse_excludes_file4() { + let data = bytes("[core]\nexcludesFile = \"~/foo/bar\""); + let got = super::parse_excludes_file(&data); + assert_eq!( + path_string(got.unwrap()), + super::expand_tilde("~/foo/bar") + ); + } + + #[test] + fn parse_excludes_file5() { + let data = bytes("[core]\nexcludesFile = \" \"~/foo/bar \" \""); + assert!(super::parse_excludes_file(&data).is_none()); + } + // See: https://github.com/BurntSushi/ripgrep/issues/106 #[test] fn regression_106() {