@ 261104.1

261028.3.4 · 90f6adad22b745f059e5260a6fd924225e86c334

fix: pattern-specific case checking

Check for uppercase characters differently based on what kind of pattern we have. This fixes a bug where if the pattern wasn't a valid regex, then we didn't correctly detect if it had an uppercase character.

reading declarations

Changes to src/patterns.rs. All files

src/patterns.rs

@@ -5,6 +5,8 @@ use globset::{Glob, GlobBuilder, GlobMatcher, GlobSet, GlobSetBuilder}; use memchr::memmem; use regex::bytes::{RegexSet, RegexSetBuilder}; +use crate::regex_helper::{self, pattern_matches_strings_with_leading_dot};+ pub trait Matcher {     fn matches_path(&self, path: &OsStr) -> bool; }@@ -99,6 +101,28 @@ pub fn build_patterns(     } } +pub fn patterns_match_strings_with_leading_dots(+    patterns: &[String],+    pattern_type: PatternType,+) -> bool {+    let mut iter = patterns.iter();+    match pattern_type {+        PatternType::Regex => iter.any(|pat| pattern_matches_strings_with_leading_dot(pat)),+        // fixed strings aren't anchored so always false+        PatternType::Fixed => false,+        // globs and exact just check if it starts with a .+        PatternType::Glob | PatternType::Exact => patterns.iter().any(|pat| pat.starts_with(".")),+    }+}++pub fn pattern_has_uppercase_char(pattern_type: PatternType, pattern: &str) -> bool {+    match pattern_type {+        PatternType::Regex => regex_helper::pattern_has_uppercase_char(pattern),+        // For everything else it's sufficient to just check if there are any uppercase letters+        _ => pattern.chars().any(char::is_uppercase),+    }+}+ fn build_glob_matcher(patterns: Vec<String>, ignore_case: bool) -> Result<Patterns> {     Ok(if patterns.len() == 1 {         Box::new(build_glob(&patterns[0], ignore_case)?.compile_matcher())