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
@@ -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())