annotate rust/hg-core/src/matchers.rs @ 50542:dc201a09e82c

clonebundle: add a `filter_bundle_url` function This function does nothing by default, but give extension the opportunity to alter the URL, typically, this could be used to inject authentication token when serving clone bundle for private repositories.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 26 May 2023 17:41:25 +0200
parents e98fd81bb151
children 1c31b343e514
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
1 // matchers.rs
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
2 //
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
3 // Copyright 2019 Raphaël Gomès <rgomes@octobus.net>
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
4 //
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
5 // This software may be used and distributed according to the terms of the
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
6 // GNU General Public License version 2 or any later version.
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
7
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
8 //! Structs and types for matching files and directories.
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
9
44519
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
10 use crate::{
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
11 dirstate::dirs_multiset::DirsChildrenMultiset,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
12 filepatterns::{
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
13 build_single_regex, filter_subincludes, get_patterns_from_file,
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
14 PatternFileWarning, PatternResult,
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
15 },
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
16 utils::{
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
17 files::find_dirs,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
18 hg_path::{HgPath, HgPathBuf},
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
19 Escaped,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
20 },
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
21 DirsMultiset, DirstateMapError, FastHashMap, IgnorePattern, PatternError,
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
22 PatternSyntax,
44519
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
23 };
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
24
48354
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
25 use crate::dirstate::status::IgnoreFnType;
44802
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
26 use crate::filepatterns::normalize_path_bytes;
44597
e62052d0f377 rust-status: only involve ignore mechanism when needed
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44593
diff changeset
27 use std::borrow::ToOwned;
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
28 use std::collections::HashSet;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
29 use std::fmt::{Display, Error, Formatter};
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
30 use std::ops::Deref;
44597
e62052d0f377 rust-status: only involve ignore mechanism when needed
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44593
diff changeset
31 use std::path::{Path, PathBuf};
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
32
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
33 #[derive(Debug, PartialEq)]
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
34 pub enum VisitChildrenSet {
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
35 /// Don't visit anything
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
36 Empty,
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
37 /// Only visit this directory
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
38 This,
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
39 /// Visit this directory and these subdirectories
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
40 /// TODO Should we implement a `NonEmptyHashSet`?
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
41 Set(HashSet<HgPathBuf>),
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
42 /// Visit this directory and all subdirectories
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
43 Recursive,
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
44 }
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
45
49487
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
46 pub trait Matcher: core::fmt::Debug {
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
47 /// Explicitly listed files
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
48 fn file_set(&self) -> Option<&HashSet<HgPathBuf>>;
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
49 /// Returns whether `filename` is in `file_set`
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
50 fn exact_match(&self, filename: &HgPath) -> bool;
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
51 /// Returns whether `filename` is matched by this matcher
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
52 fn matches(&self, filename: &HgPath) -> bool;
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
53 /// Decides whether a directory should be visited based on whether it
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
54 /// has potential matches in it or one of its subdirectories, and
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
55 /// potentially lists which subdirectories of that directory should be
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
56 /// visited. This is based on the match's primary, included, and excluded
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
57 /// patterns.
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
58 ///
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
59 /// # Example
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
60 ///
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
61 /// Assume matchers `['path:foo/bar', 'rootfilesin:qux']`, we would
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
62 /// return the following values (assuming the implementation of
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
63 /// visit_children_set is capable of recognizing this; some implementations
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
64 /// are not).
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
65 ///
44006
72bced4f2936 rust-matchers: fixing cargo doc
Georges Racinet <georges.racinet@octobus.net>
parents: 43914
diff changeset
66 /// ```text
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
67 /// ```ignore
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
68 /// '' -> {'foo', 'qux'}
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
69 /// 'baz' -> set()
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
70 /// 'foo' -> {'bar'}
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
71 /// // Ideally this would be `Recursive`, but since the prefix nature of
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
72 /// // matchers is applied to the entire matcher, we have to downgrade this
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
73 /// // to `This` due to the (yet to be implemented in Rust) non-prefix
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
74 /// // `RootFilesIn'-kind matcher being mixed in.
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
75 /// 'foo/bar' -> 'this'
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
76 /// 'qux' -> 'this'
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
77 /// ```
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
78 /// # Important
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
79 ///
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
80 /// Most matchers do not know if they're representing files or
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
81 /// directories. They see `['path:dir/f']` and don't know whether `f` is a
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
82 /// file or a directory, so `visit_children_set('dir')` for most matchers
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
83 /// will return `HashSet{ HgPath { "f" } }`, but if the matcher knows it's
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
84 /// a file (like the yet to be implemented in Rust `ExactMatcher` does),
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
85 /// it may return `VisitChildrenSet::This`.
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
86 /// Do not rely on the return being a `HashSet` indicating that there are
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
87 /// no files in this dir to investigate (or equivalently that if there are
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
88 /// files to investigate in 'dir' that it will always return
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
89 /// `VisitChildrenSet::This`).
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
90 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet;
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
91 /// Matcher will match everything and `files_set()` will be empty:
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
92 /// optimization might be possible.
43611
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
93 fn matches_everything(&self) -> bool;
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
94 /// Matcher will match exactly the files in `files_set()`: optimization
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
95 /// might be possible.
43611
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
96 fn is_exact(&self) -> bool;
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
97 }
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
98
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
99 /// Matches everything.
43834
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
100 ///```
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
101 /// use hg::{ matchers::{Matcher, AlwaysMatcher}, utils::hg_path::HgPath };
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
102 ///
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
103 /// let matcher = AlwaysMatcher;
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
104 ///
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
105 /// assert_eq!(matcher.matches(HgPath::new(b"whatever")), true);
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
106 /// assert_eq!(matcher.matches(HgPath::new(b"b.txt")), true);
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
107 /// assert_eq!(matcher.matches(HgPath::new(b"main.c")), true);
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
108 /// assert_eq!(matcher.matches(HgPath::new(br"re:.*\.c$")), true);
43834
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
109 /// ```
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
110 #[derive(Debug)]
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
111 pub struct AlwaysMatcher;
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
112
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
113 impl Matcher for AlwaysMatcher {
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
114 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
43832
1bb4e9b02984 rust-matchers: improve `Matcher` trait ergonomics
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43611
diff changeset
115 None
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
116 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
117 fn exact_match(&self, _filename: &HgPath) -> bool {
43611
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
118 false
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
119 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
120 fn matches(&self, _filename: &HgPath) -> bool {
43611
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
121 true
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
122 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
123 fn visit_children_set(&self, _directory: &HgPath) -> VisitChildrenSet {
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
124 VisitChildrenSet::Recursive
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
125 }
43611
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
126 fn matches_everything(&self) -> bool {
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
127 true
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
128 }
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
129 fn is_exact(&self) -> bool {
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
130 false
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
131 }
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
132 }
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
133
49351
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
134 /// Matches nothing.
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
135 #[derive(Debug)]
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
136 pub struct NeverMatcher;
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
137
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
138 impl Matcher for NeverMatcher {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
139 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
140 None
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
141 }
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
142 fn exact_match(&self, _filename: &HgPath) -> bool {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
143 false
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
144 }
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
145 fn matches(&self, _filename: &HgPath) -> bool {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
146 false
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
147 }
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
148 fn visit_children_set(&self, _directory: &HgPath) -> VisitChildrenSet {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
149 VisitChildrenSet::Empty
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
150 }
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
151 fn matches_everything(&self) -> bool {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
152 false
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
153 }
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
154 fn is_exact(&self) -> bool {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
155 true
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
156 }
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
157 }
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
158
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
159 /// Matches the input files exactly. They are interpreted as paths, not
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
160 /// patterns.
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
161 ///
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
162 ///```
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
163 /// use hg::{ matchers::{Matcher, FileMatcher}, utils::hg_path::{HgPath, HgPathBuf} };
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
164 ///
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
165 /// let files = vec![HgPathBuf::from_bytes(b"a.txt"), HgPathBuf::from_bytes(br"re:.*\.c$")];
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
166 /// let matcher = FileMatcher::new(files).unwrap();
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
167 ///
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
168 /// assert_eq!(matcher.matches(HgPath::new(b"a.txt")), true);
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
169 /// assert_eq!(matcher.matches(HgPath::new(b"b.txt")), false);
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
170 /// assert_eq!(matcher.matches(HgPath::new(b"main.c")), false);
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
171 /// assert_eq!(matcher.matches(HgPath::new(br"re:.*\.c$")), true);
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
172 /// ```
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
173 #[derive(Debug)]
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
174 pub struct FileMatcher {
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
175 files: HashSet<HgPathBuf>,
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
176 dirs: DirsMultiset,
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
177 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
178
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
179 impl FileMatcher {
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
180 pub fn new(files: Vec<HgPathBuf>) -> Result<Self, DirstateMapError> {
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
181 let dirs = DirsMultiset::from_manifest(&files)?;
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
182 Ok(Self {
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
183 files: HashSet::from_iter(files.into_iter()),
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
184 dirs,
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
185 })
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
186 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
187 fn inner_matches(&self, filename: &HgPath) -> bool {
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
188 self.files.contains(filename.as_ref())
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
189 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
190 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
191
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
192 impl Matcher for FileMatcher {
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
193 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
194 Some(&self.files)
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
195 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
196 fn exact_match(&self, filename: &HgPath) -> bool {
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
197 self.inner_matches(filename)
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
198 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
199 fn matches(&self, filename: &HgPath) -> bool {
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
200 self.inner_matches(filename)
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
201 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
202 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
203 if self.files.is_empty() || !self.dirs.contains(&directory) {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
204 return VisitChildrenSet::Empty;
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
205 }
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
206 let mut candidates: HashSet<HgPathBuf> =
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
207 self.dirs.iter().cloned().collect();
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
208
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
209 candidates.extend(self.files.iter().cloned());
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
210 candidates.remove(HgPath::new(b""));
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
211
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
212 if !directory.as_ref().is_empty() {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
213 let directory = [directory.as_ref().as_bytes(), b"/"].concat();
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
214 candidates = candidates
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
215 .iter()
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
216 .filter_map(|c| {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
217 if c.as_bytes().starts_with(&directory) {
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
218 Some(HgPathBuf::from_bytes(
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
219 &c.as_bytes()[directory.len()..],
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
220 ))
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
221 } else {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
222 None
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
223 }
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
224 })
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
225 .collect();
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
226 }
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
227
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
228 // `self.dirs` includes all of the directories, recursively, so if
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
229 // we're attempting to match 'foo/bar/baz.txt', it'll have '', 'foo',
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
230 // 'foo/bar' in it. Thus we can safely ignore a candidate that has a
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
231 // '/' in it, indicating it's for a subdir-of-a-subdir; the immediate
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
232 // subdir will be in there without a slash.
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
233 VisitChildrenSet::Set(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
234 candidates
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
235 .into_iter()
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
236 .filter_map(|c| {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
237 if c.bytes().all(|b| *b != b'/') {
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
238 Some(c)
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
239 } else {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
240 None
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
241 }
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
242 })
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
243 .collect(),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
244 )
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
245 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
246 fn matches_everything(&self) -> bool {
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
247 false
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
248 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
249 fn is_exact(&self) -> bool {
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
250 true
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
251 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
252 }
44519
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
253
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
254 /// Matches files that are included in the ignore rules.
44870
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
255 /// ```
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
256 /// use hg::{
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
257 /// matchers::{IncludeMatcher, Matcher},
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
258 /// IgnorePattern,
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
259 /// PatternSyntax,
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
260 /// utils::hg_path::HgPath
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
261 /// };
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
262 /// use std::path::Path;
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
263 /// ///
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
264 /// let ignore_patterns =
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
265 /// vec![IgnorePattern::new(PatternSyntax::RootGlob, b"this*", Path::new(""))];
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
266 /// let matcher = IncludeMatcher::new(ignore_patterns).unwrap();
44870
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
267 /// ///
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
268 /// assert_eq!(matcher.matches(HgPath::new(b"testing")), false);
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
269 /// assert_eq!(matcher.matches(HgPath::new(b"this should work")), true);
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
270 /// assert_eq!(matcher.matches(HgPath::new(b"this also")), true);
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
271 /// assert_eq!(matcher.matches(HgPath::new(b"but not this")), false);
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
272 /// ```
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
273 pub struct IncludeMatcher<'a> {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
274 patterns: Vec<u8>,
48354
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
275 match_fn: IgnoreFnType<'a>,
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
276 /// Whether all the patterns match a prefix (i.e. recursively)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
277 prefix: bool,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
278 roots: HashSet<HgPathBuf>,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
279 dirs: HashSet<HgPathBuf>,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
280 parents: HashSet<HgPathBuf>,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
281 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
282
49487
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
283 impl core::fmt::Debug for IncludeMatcher<'_> {
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
284 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
285 f.debug_struct("IncludeMatcher")
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
286 .field("patterns", &String::from_utf8_lossy(&self.patterns))
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
287 .field("prefix", &self.prefix)
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
288 .field("roots", &self.roots)
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
289 .field("dirs", &self.dirs)
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
290 .field("parents", &self.parents)
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
291 .finish()
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
292 }
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
293 }
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
294
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
295 impl<'a> Matcher for IncludeMatcher<'a> {
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
296 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
297 None
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
298 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
299
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
300 fn exact_match(&self, _filename: &HgPath) -> bool {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
301 false
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
302 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
303
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
304 fn matches(&self, filename: &HgPath) -> bool {
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
305 (self.match_fn)(filename)
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
306 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
307
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
308 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
309 let dir = directory;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
310 if self.prefix && self.roots.contains(dir) {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
311 return VisitChildrenSet::Recursive;
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
312 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
313 if self.roots.contains(HgPath::new(b""))
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
314 || self.roots.contains(dir)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
315 || self.dirs.contains(dir)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
316 || find_dirs(dir).any(|parent_dir| self.roots.contains(parent_dir))
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
317 {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
318 return VisitChildrenSet::This;
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
319 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
320
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
321 if self.parents.contains(dir.as_ref()) {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
322 let multiset = self.get_all_parents_children();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
323 if let Some(children) = multiset.get(dir) {
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
324 return VisitChildrenSet::Set(
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
325 children.iter().map(HgPathBuf::from).collect(),
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
326 );
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
327 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
328 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
329 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
330 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
331
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
332 fn matches_everything(&self) -> bool {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
333 false
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
334 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
335
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
336 fn is_exact(&self) -> bool {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
337 false
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
338 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
339 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
340
49347
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
341 /// The union of multiple matchers. Will match if any of the matchers match.
49487
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
342 #[derive(Debug)]
49347
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
343 pub struct UnionMatcher {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
344 matchers: Vec<Box<dyn Matcher + Sync>>,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
345 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
346
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
347 impl Matcher for UnionMatcher {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
348 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
349 None
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
350 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
351
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
352 fn exact_match(&self, _filename: &HgPath) -> bool {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
353 false
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
354 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
355
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
356 fn matches(&self, filename: &HgPath) -> bool {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
357 self.matchers.iter().any(|m| m.matches(filename))
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
358 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
359
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
360 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
361 let mut result = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
362 let mut this = false;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
363 for matcher in self.matchers.iter() {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
364 let visit = matcher.visit_children_set(directory);
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
365 match visit {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
366 VisitChildrenSet::Empty => continue,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
367 VisitChildrenSet::This => {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
368 this = true;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
369 // Don't break, we might have an 'all' in here.
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
370 continue;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
371 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
372 VisitChildrenSet::Set(set) => {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
373 result.extend(set);
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
374 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
375 VisitChildrenSet::Recursive => {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
376 return visit;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
377 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
378 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
379 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
380 if this {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
381 return VisitChildrenSet::This;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
382 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
383 if result.is_empty() {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
384 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
385 } else {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
386 VisitChildrenSet::Set(result)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
387 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
388 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
389
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
390 fn matches_everything(&self) -> bool {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
391 // TODO Maybe if all are AlwaysMatcher?
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
392 false
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
393 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
394
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
395 fn is_exact(&self) -> bool {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
396 false
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
397 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
398 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
399
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
400 impl UnionMatcher {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
401 pub fn new(matchers: Vec<Box<dyn Matcher + Sync>>) -> Self {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
402 Self { matchers }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
403 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
404 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
405
49487
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
406 #[derive(Debug)]
49349
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
407 pub struct IntersectionMatcher {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
408 m1: Box<dyn Matcher + Sync>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
409 m2: Box<dyn Matcher + Sync>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
410 files: Option<HashSet<HgPathBuf>>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
411 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
412
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
413 impl Matcher for IntersectionMatcher {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
414 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
415 self.files.as_ref()
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
416 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
417
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
418 fn exact_match(&self, filename: &HgPath) -> bool {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
419 self.files.as_ref().map_or(false, |f| f.contains(filename))
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
420 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
421
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
422 fn matches(&self, filename: &HgPath) -> bool {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
423 self.m1.matches(filename) && self.m2.matches(filename)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
424 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
425
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
426 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
427 let m1_set = self.m1.visit_children_set(directory);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
428 if m1_set == VisitChildrenSet::Empty {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
429 return VisitChildrenSet::Empty;
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
430 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
431 let m2_set = self.m2.visit_children_set(directory);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
432 if m2_set == VisitChildrenSet::Empty {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
433 return VisitChildrenSet::Empty;
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
434 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
435
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
436 if m1_set == VisitChildrenSet::Recursive {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
437 return m2_set;
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
438 } else if m2_set == VisitChildrenSet::Recursive {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
439 return m1_set;
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
440 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
441
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
442 match (&m1_set, &m2_set) {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
443 (VisitChildrenSet::Recursive, _) => m2_set,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
444 (_, VisitChildrenSet::Recursive) => m1_set,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
445 (VisitChildrenSet::This, _) | (_, VisitChildrenSet::This) => {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
446 VisitChildrenSet::This
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
447 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
448 (VisitChildrenSet::Set(m1), VisitChildrenSet::Set(m2)) => {
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
449 let set: HashSet<_> = m1.intersection(m2).cloned().collect();
49349
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
450 if set.is_empty() {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
451 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
452 } else {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
453 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
454 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
455 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
456 _ => unreachable!(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
457 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
458 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
459
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
460 fn matches_everything(&self) -> bool {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
461 self.m1.matches_everything() && self.m2.matches_everything()
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
462 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
463
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
464 fn is_exact(&self) -> bool {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
465 self.m1.is_exact() || self.m2.is_exact()
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
466 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
467 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
468
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
469 impl IntersectionMatcher {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
470 pub fn new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
471 mut m1: Box<dyn Matcher + Sync>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
472 mut m2: Box<dyn Matcher + Sync>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
473 ) -> Self {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
474 let files = if m1.is_exact() || m2.is_exact() {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
475 if !m1.is_exact() {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
476 std::mem::swap(&mut m1, &mut m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
477 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
478 m1.file_set().map(|m1_files| {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
479 m1_files.iter().cloned().filter(|f| m2.matches(f)).collect()
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
480 })
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
481 } else {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
482 None
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
483 };
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
484 Self { m1, m2, files }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
485 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
486 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
487
49487
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
488 #[derive(Debug)]
49478
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
489 pub struct DifferenceMatcher {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
490 base: Box<dyn Matcher + Sync>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
491 excluded: Box<dyn Matcher + Sync>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
492 files: Option<HashSet<HgPathBuf>>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
493 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
494
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
495 impl Matcher for DifferenceMatcher {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
496 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
497 self.files.as_ref()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
498 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
499
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
500 fn exact_match(&self, filename: &HgPath) -> bool {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
501 self.files.as_ref().map_or(false, |f| f.contains(filename))
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
502 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
503
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
504 fn matches(&self, filename: &HgPath) -> bool {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
505 self.base.matches(filename) && !self.excluded.matches(filename)
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
506 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
507
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
508 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
509 let excluded_set = self.excluded.visit_children_set(directory);
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
510 if excluded_set == VisitChildrenSet::Recursive {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
511 return VisitChildrenSet::Empty;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
512 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
513 let base_set = self.base.visit_children_set(directory);
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
514 // Possible values for base: 'recursive', 'this', set(...), set()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
515 // Possible values for excluded: 'this', set(...), set()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
516 // If excluded has nothing under here that we care about, return base,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
517 // even if it's 'recursive'.
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
518 if excluded_set == VisitChildrenSet::Empty {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
519 return base_set;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
520 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
521 match base_set {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
522 VisitChildrenSet::This | VisitChildrenSet::Recursive => {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
523 // Never return 'recursive' here if excluded_set is any kind of
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
524 // non-empty (either 'this' or set(foo)), since excluded might
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
525 // return set() for a subdirectory.
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
526 VisitChildrenSet::This
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
527 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
528 set => {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
529 // Possible values for base: set(...), set()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
530 // Possible values for excluded: 'this', set(...)
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
531 // We ignore excluded set results. They're possibly incorrect:
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
532 // base = path:dir/subdir
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
533 // excluded=rootfilesin:dir,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
534 // visit_children_set(''):
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
535 // base returns {'dir'}, excluded returns {'dir'}, if we
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
536 // subtracted we'd return set(), which is *not* correct, we
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
537 // still need to visit 'dir'!
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
538 set
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
539 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
540 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
541 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
542
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
543 fn matches_everything(&self) -> bool {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
544 false
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
545 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
546
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
547 fn is_exact(&self) -> bool {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
548 self.base.is_exact()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
549 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
550 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
551
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
552 impl DifferenceMatcher {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
553 pub fn new(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
554 base: Box<dyn Matcher + Sync>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
555 excluded: Box<dyn Matcher + Sync>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
556 ) -> Self {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
557 let base_is_exact = base.is_exact();
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
558 let base_files = base.file_set().map(ToOwned::to_owned);
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
559 let mut new = Self {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
560 base,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
561 excluded,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
562 files: None,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
563 };
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
564 if base_is_exact {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
565 new.files = base_files.map(|files| {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
566 files.iter().cloned().filter(|f| new.matches(f)).collect()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
567 });
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
568 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
569 new
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
570 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
571 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
572
49581
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
573 /// Wraps [`regex::bytes::Regex`] to improve performance in multithreaded
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
574 /// contexts.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
575 ///
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
576 /// The `status` algorithm makes heavy use of threads, and calling `is_match`
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
577 /// from many threads at once is prone to contention, probably within the
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
578 /// scratch space needed as the regex DFA is built lazily.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
579 ///
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
580 /// We are in the process of raising the issue upstream, but for now
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
581 /// the workaround used here is to store the `Regex` in a lazily populated
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
582 /// thread-local variable, sharing the initial read-only compilation, but
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
583 /// not the lazy dfa scratch space mentioned above.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
584 ///
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
585 /// This reduces the contention observed with 16+ threads, but does not
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
586 /// completely remove it. Hopefully this can be addressed upstream.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
587 struct RegexMatcher {
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
588 /// Compiled at the start of the status algorithm, used as a base for
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
589 /// cloning in each thread-local `self.local`, thus sharing the expensive
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
590 /// first compilation.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
591 base: regex::bytes::Regex,
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
592 /// Thread-local variable that holds the `Regex` that is actually queried
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
593 /// from each thread.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
594 local: thread_local::ThreadLocal<regex::bytes::Regex>,
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
595 }
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
596
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
597 impl RegexMatcher {
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
598 /// Returns whether the path matches the stored `Regex`.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
599 pub fn is_match(&self, path: &HgPath) -> bool {
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
600 self.local
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
601 .get_or(|| self.base.clone())
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
602 .is_match(path.as_bytes())
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
603 }
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
604 }
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
605
44593
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
606 /// Returns a function that matches an `HgPath` against the given regex
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
607 /// pattern.
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
608 ///
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
609 /// This can fail when the pattern is invalid or not supported by the
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
610 /// underlying engine (the `regex` crate), for instance anything with
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
611 /// back-references.
49913
c15b415d1bff rust: use `logging_timer` instead of `micro_timer`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49631
diff changeset
612 #[logging_timer::time("trace")]
49581
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
613 fn re_matcher(pattern: &[u8]) -> PatternResult<RegexMatcher> {
44593
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
614 use std::io::Write;
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
615
44832
ad1ec40975aa rust-regex: fix issues with regex anchoring and performance
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44803
diff changeset
616 // The `regex` crate adds `.*` to the start and end of expressions if there
ad1ec40975aa rust-regex: fix issues with regex anchoring and performance
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44803
diff changeset
617 // are no anchors, so add the start anchor.
ad1ec40975aa rust-regex: fix issues with regex anchoring and performance
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44803
diff changeset
618 let mut escaped_bytes = vec![b'^', b'(', b'?', b':'];
44593
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
619 for byte in pattern {
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
620 if *byte > 127 {
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
621 write!(escaped_bytes, "\\x{:x}", *byte).unwrap();
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
622 } else {
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
623 escaped_bytes.push(*byte);
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
624 }
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
625 }
44832
ad1ec40975aa rust-regex: fix issues with regex anchoring and performance
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44803
diff changeset
626 escaped_bytes.push(b')');
44593
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
627
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
628 // Avoid the cost of UTF8 checking
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
629 //
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
630 // # Safety
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
631 // This is safe because we escaped all non-ASCII bytes.
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
632 let pattern_string = unsafe { String::from_utf8_unchecked(escaped_bytes) };
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
633 let re = regex::bytes::RegexBuilder::new(&pattern_string)
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
634 .unicode(false)
44779
b15a37d85dbe rust-regex: increase the DFA size limit for the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44597
diff changeset
635 // Big repos with big `.hgignore` will hit the default limit and
b15a37d85dbe rust-regex: increase the DFA size limit for the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44597
diff changeset
636 // incur a significant performance hit. One repo's `hg status` hit
b15a37d85dbe rust-regex: increase the DFA size limit for the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44597
diff changeset
637 // multiple *minutes*.
b15a37d85dbe rust-regex: increase the DFA size limit for the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44597
diff changeset
638 .dfa_size_limit(50 * (1 << 20))
44593
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
639 .build()
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
640 .map_err(|e| PatternError::UnsupportedSyntax(e.to_string()))?;
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
641
49581
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
642 Ok(RegexMatcher {
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
643 base: re,
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
644 local: Default::default(),
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
645 })
44519
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
646 }
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
647
44521
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
648 /// Returns the regex pattern and a function that matches an `HgPath` against
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
649 /// said regex formed by the given ignore patterns.
48354
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
650 fn build_regex_match<'a, 'b>(
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
651 ignore_patterns: &'a [IgnorePattern],
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
652 ) -> PatternResult<(Vec<u8>, IgnoreFnType<'b>)> {
44802
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
653 let mut regexps = vec![];
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
654 let mut exact_set = HashSet::new();
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
655
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
656 for pattern in ignore_patterns {
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
657 if let Some(re) = build_single_regex(pattern)? {
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
658 regexps.push(re);
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
659 } else {
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
660 let exact = normalize_path_bytes(&pattern.pattern);
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
661 exact_set.insert(HgPathBuf::from_bytes(&exact));
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
662 }
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
663 }
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
664
44521
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
665 let full_regex = regexps.join(&b'|');
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
666
44802
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
667 // An empty pattern would cause the regex engine to incorrectly match the
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
668 // (empty) root directory
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
669 let func = if !(regexps.is_empty()) {
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
670 let matcher = re_matcher(&full_regex)?;
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
671 let func = move |filename: &HgPath| {
49581
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
672 exact_set.contains(filename) || matcher.is_match(filename)
44802
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
673 };
48354
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
674 Box::new(func) as IgnoreFnType
44802
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
675 } else {
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
676 let func = move |filename: &HgPath| exact_set.contains(filename);
48354
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
677 Box::new(func) as IgnoreFnType
44802
e0414fcd35e0 rust-filepatterns: match exact `rootglob`s with a `HashSet`, not in the regex
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44784
diff changeset
678 };
44521
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
679
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
680 Ok((full_regex, func))
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
681 }
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
682
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
683 /// Returns roots and directories corresponding to each pattern.
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
684 ///
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
685 /// This calculates the roots and directories exactly matching the patterns and
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
686 /// returns a tuple of (roots, dirs). It does not return other directories
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
687 /// which may also need to be considered, like the parent directories.
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
688 fn roots_and_dirs(
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
689 ignore_patterns: &[IgnorePattern],
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
690 ) -> (Vec<HgPathBuf>, Vec<HgPathBuf>) {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
691 let mut roots = Vec::new();
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
692 let mut dirs = Vec::new();
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
693
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
694 for ignore_pattern in ignore_patterns {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
695 let IgnorePattern {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
696 syntax, pattern, ..
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
697 } = ignore_pattern;
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
698 match syntax {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
699 PatternSyntax::RootGlob | PatternSyntax::Glob => {
48311
6d69e83e6b6e rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 47409
diff changeset
700 let mut root = HgPathBuf::new();
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
701 for p in pattern.split(|c| *c == b'/') {
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
702 if p.iter()
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
703 .any(|c| matches!(*c, b'[' | b'{' | b'*' | b'?'))
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
704 {
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
705 break;
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
706 }
48311
6d69e83e6b6e rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 47409
diff changeset
707 root.push(HgPathBuf::from_bytes(p).as_ref());
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
708 }
48311
6d69e83e6b6e rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 47409
diff changeset
709 roots.push(root);
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
710 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
711 PatternSyntax::Path | PatternSyntax::RelPath => {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
712 let pat = HgPath::new(if pattern == b"." {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
713 &[] as &[u8]
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
714 } else {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
715 pattern
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
716 });
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
717 roots.push(pat.to_owned());
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
718 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
719 PatternSyntax::RootFiles => {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
720 let pat = if pattern == b"." {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
721 &[] as &[u8]
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
722 } else {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
723 pattern
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
724 };
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
725 dirs.push(HgPathBuf::from_bytes(pat));
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
726 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
727 _ => {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
728 roots.push(HgPathBuf::new());
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
729 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
730 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
731 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
732 (roots, dirs)
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
733 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
734
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
735 /// Paths extracted from patterns
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
736 #[derive(Debug, PartialEq)]
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
737 struct RootsDirsAndParents {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
738 /// Directories to match recursively
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
739 pub roots: HashSet<HgPathBuf>,
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
740 /// Directories to match non-recursively
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
741 pub dirs: HashSet<HgPathBuf>,
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
742 /// Implicitly required directories to go to items in either roots or dirs
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
743 pub parents: HashSet<HgPathBuf>,
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
744 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
745
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
746 /// Extract roots, dirs and parents from patterns.
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
747 fn roots_dirs_and_parents(
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
748 ignore_patterns: &[IgnorePattern],
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
749 ) -> PatternResult<RootsDirsAndParents> {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
750 let (roots, dirs) = roots_and_dirs(ignore_patterns);
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
751
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
752 let mut parents = HashSet::new();
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
753
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
754 parents.extend(
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
755 DirsMultiset::from_manifest(&dirs)
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
756 .map_err(|e| match e {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
757 DirstateMapError::InvalidPath(e) => e,
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
758 _ => unreachable!(),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
759 })?
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
760 .iter()
44973
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44870
diff changeset
761 .map(ToOwned::to_owned),
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
762 );
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
763 parents.extend(
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
764 DirsMultiset::from_manifest(&roots)
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
765 .map_err(|e| match e {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
766 DirstateMapError::InvalidPath(e) => e,
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
767 _ => unreachable!(),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
768 })?
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
769 .iter()
44973
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44870
diff changeset
770 .map(ToOwned::to_owned),
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
771 );
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
772
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
773 Ok(RootsDirsAndParents {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
774 roots: HashSet::from_iter(roots),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
775 dirs: HashSet::from_iter(dirs),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
776 parents,
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
777 })
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
778 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
779
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
780 /// Returns a function that checks whether a given file (in the general sense)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
781 /// should be matched.
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
782 fn build_match<'a>(
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
783 ignore_patterns: Vec<IgnorePattern>,
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
784 ) -> PatternResult<(Vec<u8>, IgnoreFnType<'a>)> {
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
785 let mut match_funcs: Vec<IgnoreFnType<'a>> = vec![];
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
786 // For debugging and printing
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
787 let mut patterns = vec![];
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
788
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
789 let (subincludes, ignore_patterns) = filter_subincludes(ignore_patterns)?;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
790
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
791 if !subincludes.is_empty() {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
792 // Build prefix-based matcher functions for subincludes
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
793 let mut submatchers = FastHashMap::default();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
794 let mut prefixes = vec![];
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
795
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
796 for sub_include in subincludes {
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
797 let matcher = IncludeMatcher::new(sub_include.included_patterns)?;
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
798 let match_fn =
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
799 Box::new(move |path: &HgPath| matcher.matches(path));
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
800 prefixes.push(sub_include.prefix.clone());
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
801 submatchers.insert(sub_include.prefix.clone(), match_fn);
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
802 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
803
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
804 let match_subinclude = move |filename: &HgPath| {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
805 for prefix in prefixes.iter() {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
806 if let Some(rel) = filename.relative_to(prefix) {
44973
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44870
diff changeset
807 if (submatchers[prefix])(rel) {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
808 return true;
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
809 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
810 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
811 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
812 false
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
813 };
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
814
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
815 match_funcs.push(Box::new(match_subinclude));
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
816 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
817
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
818 if !ignore_patterns.is_empty() {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
819 // Either do dumb matching if all patterns are rootfiles, or match
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
820 // with a regex.
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
821 if ignore_patterns
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
822 .iter()
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
823 .all(|k| k.syntax == PatternSyntax::RootFiles)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
824 {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
825 let dirs: HashSet<_> = ignore_patterns
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
826 .iter()
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
827 .map(|k| k.pattern.to_owned())
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
828 .collect();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
829 let mut dirs_vec: Vec<_> = dirs.iter().cloned().collect();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
830
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
831 let match_func = move |path: &HgPath| -> bool {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
832 let path = path.as_bytes();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
833 let i = path.iter().rfind(|a| **a == b'/');
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
834 let dir = if let Some(i) = i {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
835 &path[..*i as usize]
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
836 } else {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
837 b"."
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
838 };
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
839 dirs.contains(dir.deref())
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
840 };
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
841 match_funcs.push(Box::new(match_func));
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
842
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
843 patterns.extend(b"rootfilesin: ");
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
844 dirs_vec.sort();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
845 patterns.extend(dirs_vec.escaped_bytes());
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
846 } else {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
847 let (new_re, match_func) = build_regex_match(&ignore_patterns)?;
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
848 patterns = new_re;
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
849 match_funcs.push(match_func)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
850 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
851 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
852
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
853 Ok(if match_funcs.len() == 1 {
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
854 (patterns, match_funcs.remove(0))
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
855 } else {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
856 (
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
857 patterns,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
858 Box::new(move |f: &HgPath| -> bool {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
859 match_funcs.iter().any(|match_func| match_func(f))
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
860 }),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
861 )
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
862 })
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
863 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
864
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
865 /// Parses all "ignore" files with their recursive includes and returns a
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
866 /// function that checks whether a given file (in the general sense) should be
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
867 /// ignored.
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
868 pub fn get_ignore_matcher<'a>(
47409
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
869 mut all_pattern_files: Vec<PathBuf>,
47378
777c3d231913 rust: Make some file path parameters less generic
Simon Sapin <simon.sapin@octobus.net>
parents: 45607
diff changeset
870 root_dir: &Path,
49558
363923bd51cd dirstate-v2: hash the source of the ignore patterns as well
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49487
diff changeset
871 inspect_pattern_bytes: &mut impl FnMut(&Path, &[u8]),
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
872 ) -> PatternResult<(IncludeMatcher<'a>, Vec<PatternFileWarning>)> {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
873 let mut all_patterns = vec![];
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
874 let mut all_warnings = vec![];
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
875
47409
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
876 // Sort to make the ordering of calls to `inspect_pattern_bytes`
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
877 // deterministic even if the ordering of `all_pattern_files` is not (such
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
878 // as when a iteration order of a Python dict or Rust HashMap is involved).
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
879 // Sort by "string" representation instead of the default by component
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
880 // (with a Rust-specific definition of a component)
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
881 all_pattern_files
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
882 .sort_unstable_by(|a, b| a.as_os_str().cmp(b.as_os_str()));
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
883
47378
777c3d231913 rust: Make some file path parameters less generic
Simon Sapin <simon.sapin@octobus.net>
parents: 45607
diff changeset
884 for pattern_file in &all_pattern_files {
47409
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
885 let (patterns, warnings) = get_patterns_from_file(
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
886 pattern_file,
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
887 root_dir,
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
888 inspect_pattern_bytes,
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
889 )?;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
890
44597
e62052d0f377 rust-status: only involve ignore mechanism when needed
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44593
diff changeset
891 all_patterns.extend(patterns.to_owned());
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
892 all_warnings.extend(warnings);
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
893 }
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
894 let matcher = IncludeMatcher::new(all_patterns)?;
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
895 Ok((matcher, all_warnings))
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
896 }
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
897
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
898 /// Parses all "ignore" files with their recursive includes and returns a
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
899 /// function that checks whether a given file (in the general sense) should be
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
900 /// ignored.
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
901 pub fn get_ignore_function<'a>(
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
902 all_pattern_files: Vec<PathBuf>,
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
903 root_dir: &Path,
49558
363923bd51cd dirstate-v2: hash the source of the ignore patterns as well
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49487
diff changeset
904 inspect_pattern_bytes: &mut impl FnMut(&Path, &[u8]),
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
905 ) -> PatternResult<(IgnoreFnType<'a>, Vec<PatternFileWarning>)> {
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
906 let res =
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
907 get_ignore_matcher(all_pattern_files, root_dir, inspect_pattern_bytes);
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
908 res.map(|(matcher, all_warnings)| {
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
909 let res: IgnoreFnType<'a> =
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
910 Box::new(move |path: &HgPath| matcher.matches(path));
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
911
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
912 (res, all_warnings)
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
913 })
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
914 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
915
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
916 impl<'a> IncludeMatcher<'a> {
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
917 pub fn new(ignore_patterns: Vec<IgnorePattern>) -> PatternResult<Self> {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
918 let RootsDirsAndParents {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
919 roots,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
920 dirs,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
921 parents,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
922 } = roots_dirs_and_parents(&ignore_patterns)?;
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
923 let prefix = ignore_patterns.iter().all(|k| {
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
924 matches!(k.syntax, PatternSyntax::Path | PatternSyntax::RelPath)
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
925 });
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
926 let (patterns, match_fn) = build_match(ignore_patterns)?;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
927
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
928 Ok(Self {
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
929 patterns,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
930 match_fn,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
931 prefix,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
932 roots,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
933 dirs,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
934 parents,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
935 })
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
936 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
937
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
938 fn get_all_parents_children(&self) -> DirsChildrenMultiset {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
939 // TODO cache
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
940 let thing = self
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
941 .dirs
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
942 .iter()
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
943 .chain(self.roots.iter())
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
944 .chain(self.parents.iter());
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
945 DirsChildrenMultiset::new(thing, Some(&self.parents))
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
946 }
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
947
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
948 pub fn debug_get_patterns(&self) -> &[u8] {
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
949 self.patterns.as_ref()
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
950 }
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
951 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
952
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
953 impl<'a> Display for IncludeMatcher<'a> {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
954 fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
44803
de0fb4463a3d rust-matchers: add TODO about incomplete `Display` for `IncludeMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44802
diff changeset
955 // XXX What about exact matches?
de0fb4463a3d rust-matchers: add TODO about incomplete `Display` for `IncludeMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44802
diff changeset
956 // I'm not sure it's worth it to clone the HashSet and keep it
de0fb4463a3d rust-matchers: add TODO about incomplete `Display` for `IncludeMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44802
diff changeset
957 // around just in case someone wants to display the matcher, plus
de0fb4463a3d rust-matchers: add TODO about incomplete `Display` for `IncludeMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44802
diff changeset
958 // it's going to be unreadable after a few entries, but we need to
de0fb4463a3d rust-matchers: add TODO about incomplete `Display` for `IncludeMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44802
diff changeset
959 // inform in this display that exact matches are being used and are
de0fb4463a3d rust-matchers: add TODO about incomplete `Display` for `IncludeMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44802
diff changeset
960 // (on purpose) missing from the `includes`.
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
961 write!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
962 f,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
963 "IncludeMatcher(includes='{}')",
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
964 String::from_utf8_lossy(&self.patterns.escaped_bytes())
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
965 )
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
966 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
967 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
968
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
969 #[cfg(test)]
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
970 mod tests {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
971 use super::*;
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
972 use pretty_assertions::assert_eq;
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
973 use std::path::Path;
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
974
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
975 #[test]
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
976 fn test_roots_and_dirs() {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
977 let pats = vec![
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
978 IgnorePattern::new(PatternSyntax::Glob, b"g/h/*", Path::new("")),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
979 IgnorePattern::new(PatternSyntax::Glob, b"g/h", Path::new("")),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
980 IgnorePattern::new(PatternSyntax::Glob, b"g*", Path::new("")),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
981 ];
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
982 let (roots, dirs) = roots_and_dirs(&pats);
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
983
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
984 assert_eq!(
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
985 roots,
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
986 vec!(
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
987 HgPathBuf::from_bytes(b"g/h"),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
988 HgPathBuf::from_bytes(b"g/h"),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
989 HgPathBuf::new()
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
990 ),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
991 );
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
992 assert_eq!(dirs, vec!());
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
993 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
994
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
995 #[test]
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
996 fn test_roots_dirs_and_parents() {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
997 let pats = vec![
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
998 IgnorePattern::new(PatternSyntax::Glob, b"g/h/*", Path::new("")),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
999 IgnorePattern::new(PatternSyntax::Glob, b"g/h", Path::new("")),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1000 IgnorePattern::new(PatternSyntax::Glob, b"g*", Path::new("")),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1001 ];
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1002
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1003 let mut roots = HashSet::new();
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1004 roots.insert(HgPathBuf::from_bytes(b"g/h"));
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1005 roots.insert(HgPathBuf::new());
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1006
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1007 let dirs = HashSet::new();
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1008
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1009 let mut parents = HashSet::new();
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1010 parents.insert(HgPathBuf::new());
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1011 parents.insert(HgPathBuf::from_bytes(b"g"));
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1012
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1013 assert_eq!(
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1014 roots_dirs_and_parents(&pats).unwrap(),
44524
483fce658e43 rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44522
diff changeset
1015 RootsDirsAndParents {
483fce658e43 rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44522
diff changeset
1016 roots,
483fce658e43 rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44522
diff changeset
1017 dirs,
483fce658e43 rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44522
diff changeset
1018 parents
483fce658e43 rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44522
diff changeset
1019 }
44520
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1020 );
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1021 }
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1022
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1023 #[test]
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1024 fn test_filematcher_visit_children_set() {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1025 // Visitchildrenset
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
1026 let files = vec![HgPathBuf::from_bytes(b"dir/subdir/foo.txt")];
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1027 let matcher = FileMatcher::new(files).unwrap();
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1028
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1029 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1030 set.insert(HgPathBuf::from_bytes(b"dir"));
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1031 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1032 matcher.visit_children_set(HgPath::new(b"")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1033 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1034 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1035
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1036 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1037 set.insert(HgPathBuf::from_bytes(b"subdir"));
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1038 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1039 matcher.visit_children_set(HgPath::new(b"dir")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1040 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1041 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1042
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1043 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1044 set.insert(HgPathBuf::from_bytes(b"foo.txt"));
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1045 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1046 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1047 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1048 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1049
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1050 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1051 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1052 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1053 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1054 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1055 matcher.visit_children_set(HgPath::new(b"dir/subdir/foo.txt")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1056 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1057 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1058 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1059 matcher.visit_children_set(HgPath::new(b"folder")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1060 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1061 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1062 }
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1063
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1064 #[test]
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1065 fn test_filematcher_visit_children_set_files_and_dirs() {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1066 let files = vec![
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
1067 HgPathBuf::from_bytes(b"rootfile.txt"),
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
1068 HgPathBuf::from_bytes(b"a/file1.txt"),
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
1069 HgPathBuf::from_bytes(b"a/b/file2.txt"),
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1070 // No file in a/b/c
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
1071 HgPathBuf::from_bytes(b"a/b/c/d/file4.txt"),
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1072 ];
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1073 let matcher = FileMatcher::new(files).unwrap();
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1074
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1075 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1076 set.insert(HgPathBuf::from_bytes(b"a"));
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1077 set.insert(HgPathBuf::from_bytes(b"rootfile.txt"));
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1078 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1079 matcher.visit_children_set(HgPath::new(b"")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1080 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1081 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1082
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1083 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1084 set.insert(HgPathBuf::from_bytes(b"b"));
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1085 set.insert(HgPathBuf::from_bytes(b"file1.txt"));
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1086 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1087 matcher.visit_children_set(HgPath::new(b"a")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1088 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1089 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1090
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1091 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1092 set.insert(HgPathBuf::from_bytes(b"c"));
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1093 set.insert(HgPathBuf::from_bytes(b"file2.txt"));
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1094 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1095 matcher.visit_children_set(HgPath::new(b"a/b")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1096 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1097 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1098
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1099 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1100 set.insert(HgPathBuf::from_bytes(b"d"));
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1101 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1102 matcher.visit_children_set(HgPath::new(b"a/b/c")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1103 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1104 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1105 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1106 set.insert(HgPathBuf::from_bytes(b"file4.txt"));
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1107 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1108 matcher.visit_children_set(HgPath::new(b"a/b/c/d")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1109 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1110 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1111
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1112 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1113 matcher.visit_children_set(HgPath::new(b"a/b/c/d/e")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1114 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1115 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1116 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1117 matcher.visit_children_set(HgPath::new(b"folder")),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1118 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1119 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1120 }
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1121
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1122 #[test]
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1123 fn test_includematcher() {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1124 // VisitchildrensetPrefix
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1125 let matcher = IncludeMatcher::new(vec![IgnorePattern::new(
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1126 PatternSyntax::RelPath,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1127 b"dir/subdir",
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1128 Path::new(""),
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1129 )])
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1130 .unwrap();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1131
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1132 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1133 set.insert(HgPathBuf::from_bytes(b"dir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1134 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1135 matcher.visit_children_set(HgPath::new(b"")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1136 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1137 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1138
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1139 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1140 set.insert(HgPathBuf::from_bytes(b"subdir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1141 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1142 matcher.visit_children_set(HgPath::new(b"dir")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1143 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1144 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1145 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1146 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1147 VisitChildrenSet::Recursive
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1148 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1149 // OPT: This should probably be 'all' if its parent is?
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1150 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1151 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1152 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1153 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1154 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1155 matcher.visit_children_set(HgPath::new(b"folder")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1156 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1157 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1158
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1159 // VisitchildrensetRootfilesin
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1160 let matcher = IncludeMatcher::new(vec![IgnorePattern::new(
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1161 PatternSyntax::RootFiles,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1162 b"dir/subdir",
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1163 Path::new(""),
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1164 )])
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1165 .unwrap();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1166
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1167 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1168 set.insert(HgPathBuf::from_bytes(b"dir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1169 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1170 matcher.visit_children_set(HgPath::new(b"")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1171 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1172 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1173
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1174 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1175 set.insert(HgPathBuf::from_bytes(b"subdir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1176 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1177 matcher.visit_children_set(HgPath::new(b"dir")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1178 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1179 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1180
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1181 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1182 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1183 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1184 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1185 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1186 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1187 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1188 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1189 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1190 matcher.visit_children_set(HgPath::new(b"folder")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1191 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1192 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1193
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1194 // VisitchildrensetGlob
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1195 let matcher = IncludeMatcher::new(vec![IgnorePattern::new(
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1196 PatternSyntax::Glob,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1197 b"dir/z*",
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1198 Path::new(""),
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1199 )])
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1200 .unwrap();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1201
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1202 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1203 set.insert(HgPathBuf::from_bytes(b"dir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1204 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1205 matcher.visit_children_set(HgPath::new(b"")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1206 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1207 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1208 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1209 matcher.visit_children_set(HgPath::new(b"folder")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1210 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1211 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1212 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1213 matcher.visit_children_set(HgPath::new(b"dir")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1214 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1215 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1216 // OPT: these should probably be set().
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1217 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1218 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1219 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1220 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1221 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1222 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1223 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1224 );
49464
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1225
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1226 // Test multiple patterns
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1227 let matcher = IncludeMatcher::new(vec![
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1228 IgnorePattern::new(PatternSyntax::RelPath, b"foo", Path::new("")),
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1229 IgnorePattern::new(PatternSyntax::Glob, b"g*", Path::new("")),
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1230 ])
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1231 .unwrap();
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1232
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1233 assert_eq!(
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1234 matcher.visit_children_set(HgPath::new(b"")),
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1235 VisitChildrenSet::This
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1236 );
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1237
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1238 // Test multiple patterns
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1239 let matcher = IncludeMatcher::new(vec![IgnorePattern::new(
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1240 PatternSyntax::Glob,
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1241 b"**/*.exe",
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1242 Path::new(""),
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1243 )])
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1244 .unwrap();
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1245
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1246 assert_eq!(
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1247 matcher.visit_children_set(HgPath::new(b"")),
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1248 VisitChildrenSet::This
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1249 );
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1250 }
49347
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1251
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1252 #[test]
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1253 fn test_unionmatcher() {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1254 // Path + Rootfiles
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1255 let m1 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1256 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1257 b"dir/subdir",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1258 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1259 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1260 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1261 let m2 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1262 PatternSyntax::RootFiles,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1263 b"dir",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1264 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1265 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1266 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1267 let matcher = UnionMatcher::new(vec![Box::new(m1), Box::new(m2)]);
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1268
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1269 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1270 set.insert(HgPathBuf::from_bytes(b"dir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1271 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1272 matcher.visit_children_set(HgPath::new(b"")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1273 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1274 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1275 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1276 matcher.visit_children_set(HgPath::new(b"dir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1277 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1278 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1279 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1280 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1281 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1282 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1283 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1284 matcher.visit_children_set(HgPath::new(b"dir/foo")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1285 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1286 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1287 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1288 matcher.visit_children_set(HgPath::new(b"folder")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1289 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1290 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1291 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1292 matcher.visit_children_set(HgPath::new(b"folder")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1293 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1294 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1295
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1296 // OPT: These next two could be 'all' instead of 'this'.
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1297 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1298 matcher.visit_children_set(HgPath::new(b"dir/subdir/z")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1299 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1300 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1301 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1302 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1303 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1304 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1305
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1306 // Path + unrelated Path
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1307 let m1 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1308 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1309 b"dir/subdir",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1310 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1311 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1312 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1313 let m2 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1314 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1315 b"folder",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1316 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1317 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1318 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1319 let matcher = UnionMatcher::new(vec![Box::new(m1), Box::new(m2)]);
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1320
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1321 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1322 set.insert(HgPathBuf::from_bytes(b"folder"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1323 set.insert(HgPathBuf::from_bytes(b"dir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1324 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1325 matcher.visit_children_set(HgPath::new(b"")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1326 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1327 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1328 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1329 set.insert(HgPathBuf::from_bytes(b"subdir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1330 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1331 matcher.visit_children_set(HgPath::new(b"dir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1332 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1333 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1334
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1335 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1336 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1337 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1338 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1339 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1340 matcher.visit_children_set(HgPath::new(b"dir/foo")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1341 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1342 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1343
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1344 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1345 matcher.visit_children_set(HgPath::new(b"folder")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1346 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1347 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1348 // OPT: These next two could be 'all' instead of 'this'.
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1349 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1350 matcher.visit_children_set(HgPath::new(b"dir/subdir/z")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1351 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1352 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1353 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1354 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1355 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1356 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1357
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1358 // Path + subpath
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1359 let m1 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1360 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1361 b"dir/subdir/x",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1362 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1363 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1364 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1365 let m2 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1366 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1367 b"dir/subdir",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1368 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1369 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1370 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1371 let matcher = UnionMatcher::new(vec![Box::new(m1), Box::new(m2)]);
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1372
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1373 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1374 set.insert(HgPathBuf::from_bytes(b"dir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1375 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1376 matcher.visit_children_set(HgPath::new(b"")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1377 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1378 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1379 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1380 set.insert(HgPathBuf::from_bytes(b"subdir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1381 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1382 matcher.visit_children_set(HgPath::new(b"dir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1383 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1384 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1385
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1386 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1387 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1388 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1389 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1390 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1391 matcher.visit_children_set(HgPath::new(b"dir/foo")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1392 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1393 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1394
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1395 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1396 matcher.visit_children_set(HgPath::new(b"folder")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1397 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1398 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1399 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1400 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1401 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1402 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1403 // OPT: this should probably be 'all' not 'this'.
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1404 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1405 matcher.visit_children_set(HgPath::new(b"dir/subdir/z")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1406 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1407 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1408 }
49349
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1409
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1410 #[test]
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1411 fn test_intersectionmatcher() {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1412 // Include path + Include rootfiles
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1413 let m1 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1414 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1415 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1416 b"dir/subdir",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1417 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1418 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1419 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1420 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1421 let m2 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1422 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1423 PatternSyntax::RootFiles,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1424 b"dir",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1425 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1426 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1427 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1428 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1429 let matcher = IntersectionMatcher::new(m1, m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1430
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1431 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1432 set.insert(HgPathBuf::from_bytes(b"dir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1433 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1434 matcher.visit_children_set(HgPath::new(b"")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1435 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1436 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1437 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1438 matcher.visit_children_set(HgPath::new(b"dir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1439 VisitChildrenSet::This
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1440 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1441 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1442 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1443 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1444 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1445 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1446 matcher.visit_children_set(HgPath::new(b"dir/foo")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1447 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1448 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1449 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1450 matcher.visit_children_set(HgPath::new(b"folder")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1451 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1452 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1453 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1454 matcher.visit_children_set(HgPath::new(b"dir/subdir/z")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1455 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1456 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1457 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1458 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1459 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1460 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1461
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1462 // Non intersecting paths
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1463 let m1 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1464 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1465 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1466 b"dir/subdir",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1467 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1468 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1469 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1470 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1471 let m2 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1472 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1473 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1474 b"folder",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1475 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1476 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1477 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1478 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1479 let matcher = IntersectionMatcher::new(m1, m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1480
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1481 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1482 matcher.visit_children_set(HgPath::new(b"")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1483 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1484 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1485 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1486 matcher.visit_children_set(HgPath::new(b"dir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1487 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1488 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1489 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1490 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1491 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1492 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1493 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1494 matcher.visit_children_set(HgPath::new(b"dir/foo")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1495 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1496 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1497 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1498 matcher.visit_children_set(HgPath::new(b"folder")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1499 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1500 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1501 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1502 matcher.visit_children_set(HgPath::new(b"dir/subdir/z")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1503 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1504 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1505 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1506 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1507 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1508 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1509
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1510 // Nested paths
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1511 let m1 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1512 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1513 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1514 b"dir/subdir/x",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1515 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1516 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1517 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1518 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1519 let m2 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1520 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1521 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1522 b"dir/subdir",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1523 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1524 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1525 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1526 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1527 let matcher = IntersectionMatcher::new(m1, m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1528
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1529 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1530 set.insert(HgPathBuf::from_bytes(b"dir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1531 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1532 matcher.visit_children_set(HgPath::new(b"")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1533 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1534 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1535
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1536 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1537 set.insert(HgPathBuf::from_bytes(b"subdir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1538 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1539 matcher.visit_children_set(HgPath::new(b"dir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1540 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1541 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1542 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1543 set.insert(HgPathBuf::from_bytes(b"x"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1544 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1545 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1546 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1547 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1548 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1549 matcher.visit_children_set(HgPath::new(b"dir/foo")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1550 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1551 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1552 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1553 matcher.visit_children_set(HgPath::new(b"folder")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1554 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1555 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1556 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1557 matcher.visit_children_set(HgPath::new(b"dir/subdir/z")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1558 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1559 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1560 // OPT: this should probably be 'all' not 'this'.
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1561 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1562 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1563 VisitChildrenSet::This
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1564 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1565
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1566 // Diverging paths
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1567 let m1 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1568 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1569 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1570 b"dir/subdir/x",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1571 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1572 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1573 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1574 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1575 let m2 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1576 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1577 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1578 b"dir/subdir/z",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1579 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1580 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1581 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1582 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1583 let matcher = IntersectionMatcher::new(m1, m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1584
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1585 // OPT: these next two could probably be Empty as well.
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1586 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1587 set.insert(HgPathBuf::from_bytes(b"dir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1588 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1589 matcher.visit_children_set(HgPath::new(b"")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1590 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1591 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1592 // OPT: these next two could probably be Empty as well.
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1593 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1594 set.insert(HgPathBuf::from_bytes(b"subdir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1595 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1596 matcher.visit_children_set(HgPath::new(b"dir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1597 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1598 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1599 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1600 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1601 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1602 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1603 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1604 matcher.visit_children_set(HgPath::new(b"dir/foo")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1605 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1606 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1607 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1608 matcher.visit_children_set(HgPath::new(b"folder")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1609 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1610 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1611 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1612 matcher.visit_children_set(HgPath::new(b"dir/subdir/z")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1613 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1614 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1615 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1616 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1617 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1618 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1619 }
49478
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1620
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1621 #[test]
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1622 fn test_differencematcher() {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1623 // Two alwaysmatchers should function like a nevermatcher
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1624 let m1 = AlwaysMatcher;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1625 let m2 = AlwaysMatcher;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1626 let matcher = DifferenceMatcher::new(Box::new(m1), Box::new(m2));
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1627
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1628 for case in &[
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1629 &b""[..],
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1630 b"dir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1631 b"dir/subdir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1632 b"dir/subdir/z",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1633 b"dir/foo",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1634 b"dir/subdir/x",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1635 b"folder",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1636 ] {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1637 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1638 matcher.visit_children_set(HgPath::new(case)),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1639 VisitChildrenSet::Empty
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1640 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1641 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1642
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1643 // One always and one never should behave the same as an always
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1644 let m1 = AlwaysMatcher;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1645 let m2 = NeverMatcher;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1646 let matcher = DifferenceMatcher::new(Box::new(m1), Box::new(m2));
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1647
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1648 for case in &[
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1649 &b""[..],
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1650 b"dir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1651 b"dir/subdir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1652 b"dir/subdir/z",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1653 b"dir/foo",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1654 b"dir/subdir/x",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1655 b"folder",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1656 ] {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1657 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1658 matcher.visit_children_set(HgPath::new(case)),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1659 VisitChildrenSet::Recursive
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1660 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1661 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1662
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1663 // Two include matchers
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1664 let m1 = Box::new(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1665 IncludeMatcher::new(vec![IgnorePattern::new(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1666 PatternSyntax::RelPath,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1667 b"dir/subdir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1668 Path::new("/repo"),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1669 )])
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1670 .unwrap(),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1671 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1672 let m2 = Box::new(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1673 IncludeMatcher::new(vec![IgnorePattern::new(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1674 PatternSyntax::RootFiles,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1675 b"dir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1676 Path::new("/repo"),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1677 )])
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1678 .unwrap(),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1679 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1680
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1681 let matcher = DifferenceMatcher::new(m1, m2);
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1682
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1683 let mut set = HashSet::new();
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1684 set.insert(HgPathBuf::from_bytes(b"dir"));
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1685 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1686 matcher.visit_children_set(HgPath::new(b"")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1687 VisitChildrenSet::Set(set)
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1688 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1689
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1690 let mut set = HashSet::new();
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1691 set.insert(HgPathBuf::from_bytes(b"subdir"));
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1692 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1693 matcher.visit_children_set(HgPath::new(b"dir")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1694 VisitChildrenSet::Set(set)
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1695 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1696 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1697 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1698 VisitChildrenSet::Recursive
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1699 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1700 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1701 matcher.visit_children_set(HgPath::new(b"dir/foo")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1702 VisitChildrenSet::Empty
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1703 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1704 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1705 matcher.visit_children_set(HgPath::new(b"folder")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1706 VisitChildrenSet::Empty
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1707 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1708 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1709 matcher.visit_children_set(HgPath::new(b"dir/subdir/z")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1710 VisitChildrenSet::This
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1711 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1712 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1713 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1714 VisitChildrenSet::This
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1715 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
1716 }
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1717 }