diff options
author | Peter S Panov <peter@sipan.org> | 2017-06-29 00:57:33 +0000 |
---|---|---|
committer | Andrew Gallant <jamslam@gmail.com> | 2017-07-03 06:52:52 -0400 |
commit | 4047d9db710026b7f003243032f52d7c99c41ded (patch) | |
tree | 31a683ad965249ea5eabfe9052a6aa25d9a2badb /ignore | |
parent | 4683a325fae596db75176d188034c6623e91db79 (diff) |
add --iglob flag
Working with Chris Stadler, implemented
https://github.com/BurntSushi/ripgrep/issues/163#issuecomment-300012592
Diffstat (limited to 'ignore')
-rw-r--r-- | ignore/src/gitignore.rs | 30 | ||||
-rw-r--r-- | ignore/src/overrides.rs | 33 |
2 files changed, 63 insertions, 0 deletions
diff --git a/ignore/src/gitignore.rs b/ignore/src/gitignore.rs index 68655261..7ae91bf8 100644 --- a/ignore/src/gitignore.rs +++ b/ignore/src/gitignore.rs @@ -254,6 +254,7 @@ pub struct GitignoreBuilder { builder: GlobSetBuilder, root: PathBuf, globs: Vec<Glob>, + case_insensitive: bool, } impl GitignoreBuilder { @@ -269,6 +270,7 @@ impl GitignoreBuilder { builder: GlobSetBuilder::new(), root: strip_prefix("./", root).unwrap_or(root).to_path_buf(), globs: vec![], + case_insensitive: false, } } @@ -424,6 +426,7 @@ impl GitignoreBuilder { let parsed = try!( GlobBuilder::new(&glob.actual) .literal_separator(literal_separator) + .case_insensitive(self.case_insensitive) .build() .map_err(|err| { Error::Glob { @@ -435,6 +438,16 @@ impl GitignoreBuilder { self.globs.push(glob); Ok(self) } + + /// Toggle whether the globs should be matched case insensitively or not. + /// + /// This is disabled by default. + pub fn case_insensitive( + &mut self, yes: bool + ) -> Result<&mut GitignoreBuilder, Error> { + self.case_insensitive = yes; + Ok(self) + } } /// Return the file path of the current environment's global gitignore file. @@ -617,4 +630,21 @@ mod tests { fn regression_106() { gi_from_str("/", " "); } + + #[test] + fn case_insensitive() { + let gi = GitignoreBuilder::new(ROOT) + .case_insensitive(true).unwrap() + .add_str(None, "*.html").unwrap() + .build().unwrap(); + assert!(gi.matched("foo.html", false).is_ignore()); + assert!(gi.matched("foo.HTML", false).is_ignore()); + assert!(!gi.matched("foo.htm", false).is_ignore()); + assert!(!gi.matched("foo.HTM", false).is_ignore()); + } + + ignored!(cs1, ROOT, "*.html", "foo.html"); + not_ignored!(cs2, ROOT, "*.html", "foo.HTML"); + not_ignored!(cs3, ROOT, "*.html", "foo.htm"); + not_ignored!(cs4, ROOT, "*.html", "foo.HTM"); } diff --git a/ignore/src/overrides.rs b/ignore/src/overrides.rs index faf05f31..453066f9 100644 --- a/ignore/src/overrides.rs +++ b/ignore/src/overrides.rs @@ -137,6 +137,16 @@ impl OverrideBuilder { try!(self.builder.add_line(None, glob)); Ok(self) } + + /// Toggle whether the globs should be matched case insensitively or not. + /// + /// This is disabled by default. + pub fn case_insensitive( + &mut self, yes: bool + ) -> Result<&mut OverrideBuilder, Error> { + try!(self.builder.case_insensitive(yes)); + Ok(self) + } } #[cfg(test)] @@ -220,4 +230,27 @@ mod tests { let ov = ov(&["!/bar"]); assert!(ov.matched("./foo/bar", false).is_none()); } + + #[test] + fn case_insensitive() { + let ov = OverrideBuilder::new(ROOT) + .case_insensitive(true).unwrap() + .add("*.html").unwrap() + .build().unwrap(); + assert!(ov.matched("foo.html", false).is_whitelist()); + assert!(ov.matched("foo.HTML", false).is_whitelist()); + assert!(ov.matched("foo.htm", false).is_ignore()); + assert!(ov.matched("foo.HTM", false).is_ignore()); + } + + #[test] + fn default_case_sensitive() { + let ov = OverrideBuilder::new(ROOT) + .add("*.html").unwrap() + .build().unwrap(); + assert!(ov.matched("foo.html", false).is_whitelist()); + assert!(ov.matched("foo.HTML", false).is_ignore()); + assert!(ov.matched("foo.htm", false).is_ignore()); + assert!(ov.matched("foo.HTM", false).is_ignore()); + } } |