mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-07-26 09:42:00 -07:00
ignore: always use literal_separator for gitignore patterns (#1093)
PR #1093
This commit is contained in:
@@ -458,7 +458,6 @@ impl GitignoreBuilder {
|
|||||||
is_whitelist: false,
|
is_whitelist: false,
|
||||||
is_only_dir: false,
|
is_only_dir: false,
|
||||||
};
|
};
|
||||||
let mut literal_separator = false;
|
|
||||||
let mut is_absolute = false;
|
let mut is_absolute = false;
|
||||||
if line.starts_with("\\!") || line.starts_with("\\#") {
|
if line.starts_with("\\!") || line.starts_with("\\#") {
|
||||||
line = &line[1..];
|
line = &line[1..];
|
||||||
@@ -473,7 +472,6 @@ impl GitignoreBuilder {
|
|||||||
// then the glob can only match the beginning of a path
|
// then the glob can only match the beginning of a path
|
||||||
// (relative to the location of gitignore). We achieve this by
|
// (relative to the location of gitignore). We achieve this by
|
||||||
// simply banning wildcards from matching /.
|
// simply banning wildcards from matching /.
|
||||||
literal_separator = true;
|
|
||||||
line = &line[1..];
|
line = &line[1..];
|
||||||
is_absolute = true;
|
is_absolute = true;
|
||||||
}
|
}
|
||||||
@@ -486,16 +484,11 @@ impl GitignoreBuilder {
|
|||||||
line = &line[..i];
|
line = &line[..i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If there is a literal slash, then we note that so that globbing
|
|
||||||
// doesn't let wildcards match slashes.
|
|
||||||
glob.actual = line.to_string();
|
glob.actual = line.to_string();
|
||||||
if is_absolute || line.chars().any(|c| c == '/') {
|
// If there is a literal slash, then this is a glob that must match the
|
||||||
literal_separator = true;
|
// entire path name. Otherwise, we should let it match anywhere, so use
|
||||||
}
|
// a **/ prefix.
|
||||||
// If there was a slash, then this is a glob that must match the entire
|
if !is_absolute && !line.chars().any(|c| c == '/') {
|
||||||
// path name. Otherwise, we should let it match anywhere, so use a **/
|
|
||||||
// prefix.
|
|
||||||
if !literal_separator {
|
|
||||||
// ... but only if we don't already have a **/ prefix.
|
// ... but only if we don't already have a **/ prefix.
|
||||||
if !glob.has_doublestar_prefix() {
|
if !glob.has_doublestar_prefix() {
|
||||||
glob.actual = format!("**/{}", glob.actual);
|
glob.actual = format!("**/{}", glob.actual);
|
||||||
@@ -509,7 +502,7 @@ impl GitignoreBuilder {
|
|||||||
}
|
}
|
||||||
let parsed =
|
let parsed =
|
||||||
GlobBuilder::new(&glob.actual)
|
GlobBuilder::new(&glob.actual)
|
||||||
.literal_separator(literal_separator)
|
.literal_separator(true)
|
||||||
.case_insensitive(self.case_insensitive)
|
.case_insensitive(self.case_insensitive)
|
||||||
.backslash_escape(true)
|
.backslash_escape(true)
|
||||||
.build()
|
.build()
|
||||||
@@ -716,6 +709,7 @@ mod tests {
|
|||||||
ignored!(ig39, ROOT, "\\?", "?");
|
ignored!(ig39, ROOT, "\\?", "?");
|
||||||
ignored!(ig40, ROOT, "\\*", "*");
|
ignored!(ig40, ROOT, "\\*", "*");
|
||||||
ignored!(ig41, ROOT, "\\a", "a");
|
ignored!(ig41, ROOT, "\\a", "a");
|
||||||
|
ignored!(ig42, ROOT, "s*.rs", "sfoo.rs");
|
||||||
|
|
||||||
not_ignored!(ignot1, ROOT, "amonths", "months");
|
not_ignored!(ignot1, ROOT, "amonths", "months");
|
||||||
not_ignored!(ignot2, ROOT, "monthsa", "months");
|
not_ignored!(ignot2, ROOT, "monthsa", "months");
|
||||||
@@ -737,6 +731,7 @@ mod tests {
|
|||||||
not_ignored!(ignot16, ROOT, "*\n!**/", "foo", true);
|
not_ignored!(ignot16, ROOT, "*\n!**/", "foo", true);
|
||||||
not_ignored!(ignot17, ROOT, "src/*.rs", "src/grep/src/main.rs");
|
not_ignored!(ignot17, ROOT, "src/*.rs", "src/grep/src/main.rs");
|
||||||
not_ignored!(ignot18, ROOT, "path1/*", "path2/path1/foo");
|
not_ignored!(ignot18, ROOT, "path1/*", "path2/path1/foo");
|
||||||
|
not_ignored!(ignot19, ROOT, "s*.rs", "src/foo.rs");
|
||||||
|
|
||||||
fn bytes(s: &str) -> Vec<u8> {
|
fn bytes(s: &str) -> Vec<u8> {
|
||||||
s.to_string().into_bytes()
|
s.to_string().into_bytes()
|
||||||
|
Reference in New Issue
Block a user