##// END OF EJS Templates
matchers: support patternmatcher in rust
Arseniy Alekseyev -
r52496:a2afa356 default
parent child Browse files
Show More
@@ -644,6 +644,11 b' class patternmatcher(basematcher):'
644 super(patternmatcher, self).__init__(badfn)
644 super(patternmatcher, self).__init__(badfn)
645 kindpats.sort()
645 kindpats.sort()
646
646
647 if rustmod is not None:
648 # We need to pass the patterns to Rust because they can contain
649 # patterns from the user interface
650 self._kindpats = kindpats
651
647 roots, dirs, parents = _rootsdirsandparents(kindpats)
652 roots, dirs, parents = _rootsdirsandparents(kindpats)
648 self._files = _explicitfiles(kindpats)
653 self._files = _explicitfiles(kindpats)
649 self._dirs_explicit = set(dirs)
654 self._dirs_explicit = set(dirs)
@@ -17,7 +17,7 b' use cpython::{'
17 use hg::dirstate::status::StatusPath;
17 use hg::dirstate::status::StatusPath;
18 use hg::matchers::{
18 use hg::matchers::{
19 DifferenceMatcher, IntersectionMatcher, Matcher, NeverMatcher,
19 DifferenceMatcher, IntersectionMatcher, Matcher, NeverMatcher,
20 UnionMatcher,
20 PatternMatcher, UnionMatcher,
21 };
21 };
22 use hg::{
22 use hg::{
23 matchers::{AlwaysMatcher, FileMatcher, IncludeMatcher},
23 matchers::{AlwaysMatcher, FileMatcher, IncludeMatcher},
@@ -253,6 +253,38 b' fn extract_matcher('
253
253
254 Ok(Box::new(DifferenceMatcher::new(m1, m2)))
254 Ok(Box::new(DifferenceMatcher::new(m1, m2)))
255 }
255 }
256 "patternmatcher" => {
257 let ignore_patterns = matcher
258 .getattr(py, "_kindpats")?
259 .iter(py)?
260 .map(|k| {
261 let k = k?;
262 let syntax = parse_pattern_syntax(
263 &[
264 k.get_item(py, 0)?
265 .extract::<PyBytes>(py)?
266 .data(py),
267 &b":"[..],
268 ]
269 .concat(),
270 )
271 .map_err(|e| {
272 handle_fallback(py, StatusError::Pattern(e))
273 })?;
274 let pattern = k.get_item(py, 1)?.extract::<PyBytes>(py)?;
275 let pattern = pattern.data(py);
276 let source = k.get_item(py, 2)?.extract::<PyBytes>(py)?;
277 let source = get_path_from_bytes(source.data(py));
278 let new = IgnorePattern::new(syntax, pattern, source);
279 Ok(new)
280 })
281 .collect::<PyResult<Vec<_>>>()?;
282
283 let matcher = PatternMatcher::new(ignore_patterns)
284 .map_err(|e| handle_fallback(py, e.into()))?;
285
286 Ok(Box::new(matcher))
287 }
256 e => Err(PyErr::new::<FallbackError, _>(
288 e => Err(PyErr::new::<FallbackError, _>(
257 py,
289 py,
258 format!("Unsupported matcher {}", e),
290 format!("Unsupported matcher {}", e),
General Comments 0
You need to be logged in to leave comments. Login now