# HG changeset patch # User Raphaël Gomès # Date 2019-06-06 16:37:21 # Node ID 48f1f864d928e0178e1ed6d0e13530432fd02241 # Parent 9609430d3625d35ff9462b121e173426e770b857 rust-regex: fix shortcut for exact matches The current shortcut for rootglobs that can be simplified to exact matches does not work, it instead treats the pattern as a regex, which is not the same thing. This changes fixes the behavior and introduces a test for this behavior. Differential Revision: https://phab.mercurial-scm.org/D6489 diff --git a/rust/hg-core/src/filepatterns.rs b/rust/hg-core/src/filepatterns.rs --- a/rust/hg-core/src/filepatterns.rs +++ b/rust/hg-core/src/filepatterns.rs @@ -200,9 +200,11 @@ pub fn build_single_regex( ) -> Result, PatternError> { let enum_kind = parse_pattern_syntax(kind)?; if enum_kind == PatternSyntax::RootGlob - && pat.iter().all(|b| GLOB_SPECIAL_CHARACTERS.contains(b)) + && !pat.iter().any(|b| GLOB_SPECIAL_CHARACTERS.contains(b)) { - Ok(pat.to_vec()) + let mut escaped = escape_pattern(pat); + escaped.extend(b"(?:/|$)"); + Ok(escaped) } else { Ok(_build_single_regex(enum_kind, pat, globsuffix)) } @@ -351,4 +353,20 @@ mod tests { vec![(b"relglob:**.o".to_vec(), 1, b"**.o".to_vec())] ); } + + #[test] + fn test_build_single_regex_shortcut() { + assert_eq!( + br"(?:/|$)".to_vec(), + build_single_regex(b"rootglob", b"", b"").unwrap() + ); + assert_eq!( + br"whatever(?:/|$)".to_vec(), + build_single_regex(b"rootglob", b"whatever", b"").unwrap() + ); + assert_eq!( + br"[^/]*\.o".to_vec(), + build_single_regex(b"rootglob", b"*.o", b"").unwrap() + ); + } }