Mercurial > hg
changeset 51274:bec6e9c108fd
matchers: use correct method for finding index in vector
The path matcher has an optimization for when all paths are `rootfilesin:`. This
optimization exists in both Python and Rust. However, the Rust implementation
currently has a bug that makes it fail in most cases. The bug is that it
`rfind()` where it was clearly intended to use `rposition()`. This patch fixes
that and adds a test.
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Mon, 18 Dec 2023 14:51:20 -0800 |
parents | 79cd29d598af |
children | 39f7b2b53c68 |
files | rust/hg-core/src/matchers.rs |
diffstat | 1 files changed, 11 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/hg-core/src/matchers.rs Tue Dec 12 17:08:45 2023 +0100 +++ b/rust/hg-core/src/matchers.rs Mon Dec 18 14:51:20 2023 -0800 @@ -388,6 +388,15 @@ /// assert_eq!(matcher.matches(HgPath::new(b"this should work")), true); /// assert_eq!(matcher.matches(HgPath::new(b"this also")), true); /// assert_eq!(matcher.matches(HgPath::new(b"but not this")), false); +/// /// +/// let ignore_patterns = +/// vec![IgnorePattern::new(PatternSyntax::RootFiles, b"dir/subdir", Path::new(""))]; +/// let matcher = IncludeMatcher::new(ignore_patterns).unwrap(); +/// /// +/// assert!(!matcher.matches(HgPath::new(b"file"))); +/// assert!(!matcher.matches(HgPath::new(b"dir/file"))); +/// assert!(matcher.matches(HgPath::new(b"dir/subdir/file"))); +/// assert!(!matcher.matches(HgPath::new(b"dir/subdir/subsubdir/file"))); /// ``` pub struct IncludeMatcher<'a> { patterns: Vec<u8>, @@ -951,12 +960,8 @@ let match_func = move |path: &HgPath| -> bool { let path = path.as_bytes(); - let i = path.iter().rfind(|a| **a == b'/'); - let dir = if let Some(i) = i { - &path[..*i as usize] - } else { - b"." - }; + let i = path.iter().rposition(|a| *a == b'/'); + let dir = if let Some(i) = i { &path[..i] } else { b"." }; dirs.contains(dir) }; match_funcs.push(Box::new(match_func));