annotate rust/hg-core/src/matchers.rs @ 52160:e01e84e5e426

rust-revlog: add a Rust-only `InnerRevlog` This mirrors the Python `InnerRevlog` and will be used in a future patch to replace said Python implementation. This allows us to start doing more things in pure Rust, in particular reading and writing operations. A lot of changes have to be introduced all at once, it wouldn't be very useful to separate this patch IMO since all of them are either interlocked or only useful with the rest.
author Rapha?l Gom?s <rgomes@octobus.net>
date Thu, 10 Oct 2024 10:34:51 +0200
parents b2e90465daf6
children 04b9a56c2d25
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
51106
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
10 use format_bytes::format_bytes;
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
11 use once_cell::sync::OnceCell;
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
12
44519
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
13 use crate::{
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
14 dirstate::dirs_multiset::DirsChildrenMultiset,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
15 filepatterns::{
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
16 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
17 PatternFileWarning, PatternResult,
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
18 },
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
19 utils::{
51563
529a655874fb matchers: fix the bug in rust PatternMatcher that made it cut off early
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51561
diff changeset
20 files::{dir_ancestors, find_dirs},
50857
f50e71fdfcb4 rust: improve the type on DirsMultiset::from_manifest
Spencer Baugh <sbaugh@janestreet.com>
parents: 50853
diff changeset
21 hg_path::{HgPath, HgPathBuf, HgPathError},
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
22 Escaped,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
23 },
50857
f50e71fdfcb4 rust: improve the type on DirsMultiset::from_manifest
Spencer Baugh <sbaugh@janestreet.com>
parents: 50853
diff changeset
24 DirsMultiset, FastHashMap, IgnorePattern, PatternError, PatternSyntax,
44519
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
25 };
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
26
48354
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
27 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
28 use crate::filepatterns::normalize_path_bytes;
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
29 use std::collections::HashSet;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
30 use std::fmt::{Display, Error, Formatter};
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};
51106
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
32 use std::{borrow::ToOwned, collections::BTreeSet};
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
33
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
34 #[derive(Debug, PartialEq)]
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
35 pub enum VisitChildrenSet {
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
36 /// Don't visit anything
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
37 Empty,
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
38 /// Visit this directory and probably its children
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
39 This,
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
40 /// Only visit the children (both files and directories) if they
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
41 /// are mentioned in this set. (empty set corresponds to [Empty])
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
42 /// 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
43 Set(HashSet<HgPathBuf>),
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
44 /// Visit this directory and all subdirectories
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
45 /// (you can stop asking about the children set)
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
46 Recursive,
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
47 }
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
48
49487
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
49 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
50 /// Explicitly listed files
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
51 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
52 /// 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
53 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
54 /// 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
55 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
56 /// 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
57 /// 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
58 /// 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
59 /// 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
60 /// patterns.
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
61 ///
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
62 /// # Example
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
63 ///
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
64 /// 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
65 /// 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
66 /// 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
67 /// are not).
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
68 ///
44006
72bced4f2936 rust-matchers: fixing cargo doc
Georges Racinet <georges.racinet@octobus.net>
parents: 43914
diff changeset
69 /// ```text
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
70 /// ```ignore
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
71 /// '' -> {'foo', 'qux'}
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
72 /// 'baz' -> set()
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
73 /// 'foo' -> {'bar'}
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
74 /// // 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
75 /// // 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
76 /// // 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
77 /// // `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
78 /// 'foo/bar' -> 'this'
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
79 /// 'qux' -> 'this'
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
80 /// ```
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
81 /// # Important
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
82 ///
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
83 /// 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
84 /// 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
85 /// 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
86 /// 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
87 /// 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
88 /// it may return `VisitChildrenSet::This`.
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
89 /// 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
90 /// 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
91 /// 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
92 /// `VisitChildrenSet::This`).
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
93 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
94 /// 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
95 /// 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
96 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
97 /// 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
98 /// might be possible.
43611
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
99 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
100 }
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
101
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
102 /// Matches everything.
43834
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
103 ///```
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
104 /// 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
105 ///
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
106 /// let matcher = AlwaysMatcher;
542c8b277261 rust-matchers: add doctests for `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43832
diff changeset
107 ///
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
108 /// 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
109 /// 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
110 /// 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
111 /// 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
112 /// ```
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
113 #[derive(Debug)]
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
114 pub struct AlwaysMatcher;
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
115
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
116 impl Matcher for AlwaysMatcher {
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
117 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
118 None
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
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 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
121 false
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 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
124 true
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
125 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
126 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
127 VisitChildrenSet::Recursive
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
128 }
43611
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
129 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
130 true
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
131 }
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
132 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
133 false
27c25c0dc967 rust-matchers: remove default implementations for `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43438
diff changeset
134 }
43438
a77d4fe347a4 rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
135 }
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
136
49351
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
137 /// Matches nothing.
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
138 #[derive(Debug)]
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
139 pub struct NeverMatcher;
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
140
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
141 impl Matcher for NeverMatcher {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
142 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
143 None
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 exact_match(&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 matches(&self, _filename: &HgPath) -> bool {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
149 false
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 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
152 VisitChildrenSet::Empty
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 matches_everything(&self) -> bool {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
155 false
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 fn is_exact(&self) -> bool {
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
158 true
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
159 }
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
160 }
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49349
diff changeset
161
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
162 /// 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
163 /// patterns.
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
164 ///
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
165 ///```
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
166 /// 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
167 ///
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
168 /// 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
169 /// let matcher = FileMatcher::new(files).unwrap();
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
170 ///
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
171 /// 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
172 /// 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
173 /// 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
174 /// 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
175 /// ```
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
176 #[derive(Debug)]
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
177 pub struct FileMatcher {
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
178 files: HashSet<HgPathBuf>,
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
179 dirs: DirsMultiset,
51106
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
180 sorted_visitchildrenset_candidates: OnceCell<BTreeSet<HgPathBuf>>,
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
181 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
182
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
183 impl FileMatcher {
50857
f50e71fdfcb4 rust: improve the type on DirsMultiset::from_manifest
Spencer Baugh <sbaugh@janestreet.com>
parents: 50853
diff changeset
184 pub fn new(files: Vec<HgPathBuf>) -> Result<Self, HgPathError> {
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
185 let dirs = DirsMultiset::from_manifest(&files)?;
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
186 Ok(Self {
51117
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51106
diff changeset
187 files: HashSet::from_iter(files),
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
188 dirs,
51106
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
189 sorted_visitchildrenset_candidates: OnceCell::new(),
43914
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 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
192 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
193 self.files.contains(filename.as_ref())
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
194 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
195 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
196
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
197 impl Matcher for FileMatcher {
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
198 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
199 Some(&self.files)
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
200 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
201 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
202 self.inner_matches(filename)
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
203 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
204 fn matches(&self, filename: &HgPath) -> bool {
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
205 self.inner_matches(filename)
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
206 }
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
207 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
51106
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
208 if self.files.is_empty() || !self.dirs.contains(directory) {
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
209 return VisitChildrenSet::Empty;
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
210 }
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
211
51106
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
212 let compute_candidates = || -> BTreeSet<HgPathBuf> {
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
213 let mut candidates: BTreeSet<HgPathBuf> =
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
214 self.dirs.iter().cloned().collect();
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
215 candidates.extend(self.files.iter().cloned());
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
216 candidates.remove(HgPath::new(b""));
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
217 candidates
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
218 };
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
219 let candidates =
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
220 if directory.as_ref().is_empty() {
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
221 compute_candidates()
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
222 } else {
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
223 let sorted_candidates = self
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
224 .sorted_visitchildrenset_candidates
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
225 .get_or_init(compute_candidates);
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
226 let directory_bytes = directory.as_ref().as_bytes();
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
227 let start: HgPathBuf =
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
228 format_bytes!(b"{}/", directory_bytes).into();
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
229 let start_len = start.len();
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
230 // `0` sorts after `/`
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
231 let end = format_bytes!(b"{}0", directory_bytes).into();
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
232 BTreeSet::from_iter(sorted_candidates.range(start..end).map(
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
233 |c| HgPathBuf::from_bytes(&c.as_bytes()[start_len..]),
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
234 ))
687e192dae16 rust-matchers: fix quadratic complexity in `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50862
diff changeset
235 };
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
236
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
237 // `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
238 // 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
239 // '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
240 // '/' 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
241 // 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
242 VisitChildrenSet::Set(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
243 candidates
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
244 .into_iter()
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
245 .filter_map(|c| {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
246 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
247 Some(c)
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
248 } else {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
249 None
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
250 }
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
251 })
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
252 .collect(),
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
253 )
43914
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
254 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
255 fn matches_everything(&self) -> bool {
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
256 false
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
257 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
258 fn is_exact(&self) -> bool {
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
259 true
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
260 }
69c4f3cf2cdf rust-matchers: add `FileMatcher` implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43863
diff changeset
261 }
44519
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
262
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
263 /// Matches a set of (kind, pat, source) against a 'root' directory.
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
264 /// (Currently the 'root' directory is effectively always empty)
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
265 /// ```
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
266 /// use hg::{
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
267 /// matchers::{PatternMatcher, Matcher},
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
268 /// IgnorePattern,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
269 /// PatternSyntax,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
270 /// utils::hg_path::{HgPath, HgPathBuf}
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
271 /// };
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
272 /// use std::collections::HashSet;
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
273 /// use std::path::Path;
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
274 /// ///
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
275 /// let ignore_patterns : Vec<IgnorePattern> =
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
276 /// vec![IgnorePattern::new(PatternSyntax::Regexp, br".*\.c$", Path::new("")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
277 /// IgnorePattern::new(PatternSyntax::Path, b"foo/a", Path::new("")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
278 /// IgnorePattern::new(PatternSyntax::RelPath, b"b", Path::new("")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
279 /// IgnorePattern::new(PatternSyntax::Glob, b"*.h", Path::new("")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
280 /// ];
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
281 /// let matcher = PatternMatcher::new(ignore_patterns).unwrap();
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
282 /// ///
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
283 /// assert_eq!(matcher.matches(HgPath::new(b"main.c")), true); // matches re:.*\.c$
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
284 /// assert_eq!(matcher.matches(HgPath::new(b"b.txt")), false);
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
285 /// assert_eq!(matcher.matches(HgPath::new(b"foo/a")), true); // matches path:foo/a
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
286 /// assert_eq!(matcher.matches(HgPath::new(b"a")), false); // does not match path:b, since 'root' is 'foo'
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
287 /// assert_eq!(matcher.matches(HgPath::new(b"b")), true); // matches relpath:b, since 'root' is 'foo'
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
288 /// assert_eq!(matcher.matches(HgPath::new(b"lib.h")), true); // matches glob:*.h
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
289 /// assert_eq!(matcher.file_set().unwrap(),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
290 /// &HashSet::from([HgPathBuf::from_bytes(b""), HgPathBuf::from_bytes(b"foo/a"),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
291 /// HgPathBuf::from_bytes(b""), HgPathBuf::from_bytes(b"b")]));
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
292 /// assert_eq!(matcher.exact_match(HgPath::new(b"foo/a")), true);
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
293 /// assert_eq!(matcher.exact_match(HgPath::new(b"b")), true);
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
294 /// assert_eq!(matcher.exact_match(HgPath::new(b"lib.h")), false); // exact matches are for (rel)path kinds
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
295 /// ```
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
296 pub struct PatternMatcher<'a> {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
297 patterns: Vec<u8>,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
298 match_fn: IgnoreFnType<'a>,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
299 /// Whether all the patterns match a prefix (i.e. recursively)
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
300 prefix: bool,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
301 files: HashSet<HgPathBuf>,
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
302 dirs_explicit: HashSet<HgPathBuf>,
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
303 dirs: DirsMultiset,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
304 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
305
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
306 impl core::fmt::Debug for PatternMatcher<'_> {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
307 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
308 f.debug_struct("PatternMatcher")
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
309 .field("patterns", &String::from_utf8_lossy(&self.patterns))
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
310 .field("prefix", &self.prefix)
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
311 .field("files", &self.files)
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
312 .field("dirs", &self.dirs)
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
313 .finish()
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
314 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
315 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
316
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
317 impl<'a> PatternMatcher<'a> {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
318 pub fn new(ignore_patterns: Vec<IgnorePattern>) -> PatternResult<Self> {
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
319 let RootsDirsAndParents {
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
320 roots,
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
321 dirs: dirs_explicit,
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
322 parents,
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
323 } = roots_dirs_and_parents(&ignore_patterns)?;
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
324 let files = roots;
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
325 let dirs = parents;
51117
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51106
diff changeset
326 let files: HashSet<HgPathBuf> = HashSet::from_iter(files);
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
327
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
328 let prefix = ignore_patterns.iter().all(|k| {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
329 matches!(k.syntax, PatternSyntax::Path | PatternSyntax::RelPath)
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
330 });
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
331 let (patterns, match_fn) = build_match(ignore_patterns, b"$")?;
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
332
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
333 Ok(Self {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
334 patterns,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
335 match_fn,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
336 prefix,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
337 files,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
338 dirs,
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
339 dirs_explicit,
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
340 })
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
341 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
342 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
343
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
344 impl<'a> Matcher for PatternMatcher<'a> {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
345 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
346 Some(&self.files)
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
347 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
348
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
349 fn exact_match(&self, filename: &HgPath) -> bool {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
350 self.files.contains(filename)
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
351 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
352
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
353 fn matches(&self, filename: &HgPath) -> bool {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
354 if self.files.contains(filename) {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
355 return true;
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
356 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
357 (self.match_fn)(filename)
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
358 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
359
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
360 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
361 if self.prefix && self.files.contains(directory) {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
362 return VisitChildrenSet::Recursive;
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
363 }
51564
cae0be933434 match: small tweak to PatternMatcher.visit_children_set
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51563
diff changeset
364 if self.dirs.contains(directory) {
cae0be933434 match: small tweak to PatternMatcher.visit_children_set
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51563
diff changeset
365 return VisitChildrenSet::This;
cae0be933434 match: small tweak to PatternMatcher.visit_children_set
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51563
diff changeset
366 }
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
367 if dir_ancestors(directory).any(|parent_dir| {
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
368 self.files.contains(parent_dir)
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
369 || self.dirs_explicit.contains(parent_dir)
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
370 }) {
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
371 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
372 } else {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
373 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
374 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
375 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
376
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
377 fn matches_everything(&self) -> bool {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
378 false
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
379 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
380
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
381 fn is_exact(&self) -> bool {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
382 false
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
383 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
384 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
385
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
386 /// 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
387 /// ```
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
388 /// use hg::{
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
389 /// matchers::{IncludeMatcher, Matcher},
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
390 /// IgnorePattern,
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
391 /// PatternSyntax,
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
392 /// utils::hg_path::HgPath
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
393 /// };
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
394 /// use std::path::Path;
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
395 /// ///
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
396 /// let ignore_patterns =
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
397 /// 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
398 /// 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
399 /// ///
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
400 /// 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
401 /// 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
402 /// 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
403 /// assert_eq!(matcher.matches(HgPath::new(b"but not this")), false);
51271
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
404 /// ///
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
405 /// let ignore_patterns =
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
406 /// vec![IgnorePattern::new(PatternSyntax::RootFilesIn, b"dir/subdir", Path::new(""))];
51271
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
407 /// let matcher = IncludeMatcher::new(ignore_patterns).unwrap();
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
408 /// ///
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
409 /// assert!(!matcher.matches(HgPath::new(b"file")));
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
410 /// assert!(!matcher.matches(HgPath::new(b"dir/file")));
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
411 /// assert!(matcher.matches(HgPath::new(b"dir/subdir/file")));
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
412 /// assert!(!matcher.matches(HgPath::new(b"dir/subdir/subsubdir/file")));
44870
9f96beb9bafe rust: remove support for `re2`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44852
diff changeset
413 /// ```
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
414 pub struct IncludeMatcher<'a> {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
415 patterns: Vec<u8>,
48354
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
416 match_fn: IgnoreFnType<'a>,
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
417 /// 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
418 prefix: bool,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
419 roots: HashSet<HgPathBuf>,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
420 dirs: HashSet<HgPathBuf>,
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
421 parents: DirsMultiset,
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
422 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
423
49487
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
424 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
425 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
426 f.debug_struct("IncludeMatcher")
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
427 .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
428 .field("prefix", &self.prefix)
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
429 .field("roots", &self.roots)
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
430 .field("dirs", &self.dirs)
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
431 .field("parents", &self.parents)
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
432 .finish()
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
433 }
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
434 }
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
435
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
436 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
437 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
438 None
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
439 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
440
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
441 fn exact_match(&self, _filename: &HgPath) -> bool {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
442 false
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
443 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
444
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
445 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
446 (self.match_fn)(filename)
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
447 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
448
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
449 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
450 let dir = directory;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
451 if self.prefix && self.roots.contains(dir) {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
452 return VisitChildrenSet::Recursive;
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
453 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
454 if self.roots.contains(HgPath::new(b""))
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
455 || self.roots.contains(dir)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
456 || self.dirs.contains(dir)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
457 || 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
458 {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
459 return VisitChildrenSet::This;
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
460 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
461
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
462 if self.parents.contains(dir.as_ref()) {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
463 let multiset = self.get_all_parents_children();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
464 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
465 return VisitChildrenSet::Set(
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
466 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
467 );
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
468 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
469 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
470 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
471 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
472
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
473 fn matches_everything(&self) -> bool {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
474 false
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
475 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
476
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
477 fn is_exact(&self) -> bool {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
478 false
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
479 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
480 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
481
49347
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
482 /// 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
483 #[derive(Debug)]
49347
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
484 pub struct UnionMatcher {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
485 matchers: Vec<Box<dyn Matcher + Sync>>,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
486 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
487
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
488 impl Matcher for UnionMatcher {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
489 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
490 None
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
491 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
492
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
493 fn exact_match(&self, _filename: &HgPath) -> bool {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
494 false
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
495 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
496
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
497 fn matches(&self, filename: &HgPath) -> bool {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
498 self.matchers.iter().any(|m| m.matches(filename))
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
499 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
500
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
501 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
502 let mut result = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
503 let mut this = false;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
504 for matcher in self.matchers.iter() {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
505 let visit = matcher.visit_children_set(directory);
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
506 match visit {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
507 VisitChildrenSet::Empty => continue,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
508 VisitChildrenSet::This => {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
509 this = true;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
510 // 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
511 continue;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
512 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
513 VisitChildrenSet::Set(set) => {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
514 result.extend(set);
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
515 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
516 VisitChildrenSet::Recursive => {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
517 return visit;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
518 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
519 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
520 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
521 if this {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
522 return VisitChildrenSet::This;
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
523 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
524 if result.is_empty() {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
525 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
526 } else {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
527 VisitChildrenSet::Set(result)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
528 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
529 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
530
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
531 fn matches_everything(&self) -> bool {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
532 // TODO Maybe if all are AlwaysMatcher?
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
533 false
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
534 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
535
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
536 fn is_exact(&self) -> bool {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
537 false
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
538 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
539 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
540
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
541 impl UnionMatcher {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
542 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
543 Self { matchers }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
544 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
545 }
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
546
49487
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
547 #[derive(Debug)]
49349
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
548 pub struct IntersectionMatcher {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
549 m1: Box<dyn Matcher + Sync>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
550 m2: Box<dyn Matcher + Sync>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
551 files: Option<HashSet<HgPathBuf>>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
552 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
553
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
554 impl Matcher for IntersectionMatcher {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
555 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
556 self.files.as_ref()
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
557 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
558
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
559 fn exact_match(&self, filename: &HgPath) -> bool {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
560 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
561 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
562
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
563 fn matches(&self, filename: &HgPath) -> bool {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
564 self.m1.matches(filename) && self.m2.matches(filename)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
565 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
566
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
567 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
568 let m1_set = self.m1.visit_children_set(directory);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
569 if m1_set == VisitChildrenSet::Empty {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
570 return VisitChildrenSet::Empty;
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
571 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
572 let m2_set = self.m2.visit_children_set(directory);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
573 if m2_set == VisitChildrenSet::Empty {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
574 return VisitChildrenSet::Empty;
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
575 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
576
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
577 if m1_set == VisitChildrenSet::Recursive {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
578 return m2_set;
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
579 } else if m2_set == VisitChildrenSet::Recursive {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
580 return m1_set;
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
581 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
582
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
583 match (&m1_set, &m2_set) {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
584 (VisitChildrenSet::Recursive, _) => m2_set,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
585 (_, VisitChildrenSet::Recursive) => m1_set,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
586 (VisitChildrenSet::This, _) | (_, VisitChildrenSet::This) => {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
587 VisitChildrenSet::This
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
588 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
589 (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
590 let set: HashSet<_> = m1.intersection(m2).cloned().collect();
49349
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
591 if set.is_empty() {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
592 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
593 } else {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
594 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
595 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
596 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
597 _ => unreachable!(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
598 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
599 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
600
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
601 fn matches_everything(&self) -> bool {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
602 self.m1.matches_everything() && self.m2.matches_everything()
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
603 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
604
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
605 fn is_exact(&self) -> bool {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
606 self.m1.is_exact() || self.m2.is_exact()
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
607 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
608 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
609
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
610 impl IntersectionMatcher {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
611 pub fn new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
612 mut m1: Box<dyn Matcher + Sync>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
613 mut m2: Box<dyn Matcher + Sync>,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
614 ) -> Self {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
615 let files = if m1.is_exact() || m2.is_exact() {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
616 if !m1.is_exact() {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
617 std::mem::swap(&mut m1, &mut m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
618 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
619 m1.file_set().map(|m1_files| {
51703
ec7171748350 rust: apply clippy lints
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51696
diff changeset
620 m1_files
ec7171748350 rust: apply clippy lints
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51696
diff changeset
621 .iter()
ec7171748350 rust: apply clippy lints
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51696
diff changeset
622 .filter(|&f| m2.matches(f))
ec7171748350 rust: apply clippy lints
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51696
diff changeset
623 .cloned()
ec7171748350 rust: apply clippy lints
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51696
diff changeset
624 .collect()
49349
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
625 })
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
626 } else {
50853
e037af7de2ce rust-matchers: better support file_set in IntersectionMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50692
diff changeset
627 // without exact input file sets, we can't do an exact
e037af7de2ce rust-matchers: better support file_set in IntersectionMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50692
diff changeset
628 // intersection, so we must over-approximate by
e037af7de2ce rust-matchers: better support file_set in IntersectionMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50692
diff changeset
629 // unioning instead
e037af7de2ce rust-matchers: better support file_set in IntersectionMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50692
diff changeset
630 m1.file_set().map(|m1_files| match m2.file_set() {
e037af7de2ce rust-matchers: better support file_set in IntersectionMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50692
diff changeset
631 Some(m2_files) => m1_files.union(m2_files).cloned().collect(),
e037af7de2ce rust-matchers: better support file_set in IntersectionMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50692
diff changeset
632 None => m1_files.iter().cloned().collect(),
e037af7de2ce rust-matchers: better support file_set in IntersectionMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50692
diff changeset
633 })
49349
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
634 };
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
635 Self { m1, m2, files }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
636 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
637 }
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
638
49487
e8481625c582 rust: add Debug constraint to Matcher trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49478
diff changeset
639 #[derive(Debug)]
49478
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
640 pub struct DifferenceMatcher {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
641 base: Box<dyn Matcher + Sync>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
642 excluded: Box<dyn Matcher + Sync>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
643 files: Option<HashSet<HgPathBuf>>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
644 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
645
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
646 impl Matcher for DifferenceMatcher {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
647 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
648 self.files.as_ref()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
649 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
650
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
651 fn exact_match(&self, filename: &HgPath) -> bool {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
652 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
653 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
654
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
655 fn matches(&self, filename: &HgPath) -> bool {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
656 self.base.matches(filename) && !self.excluded.matches(filename)
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
657 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
658
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
659 fn visit_children_set(&self, directory: &HgPath) -> VisitChildrenSet {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
660 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
661 if excluded_set == VisitChildrenSet::Recursive {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
662 return VisitChildrenSet::Empty;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
663 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
664 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
665 // Possible values for base: 'recursive', 'this', set(...), set()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
666 // Possible values for excluded: 'this', set(...), set()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
667 // 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
668 // even if it's 'recursive'.
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
669 if excluded_set == VisitChildrenSet::Empty {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
670 return base_set;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
671 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
672 match base_set {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
673 VisitChildrenSet::This | VisitChildrenSet::Recursive => {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
674 // 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
675 // 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
676 // return set() for a subdirectory.
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
677 VisitChildrenSet::This
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
678 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
679 set => {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
680 // Possible values for base: set(...), set()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
681 // Possible values for excluded: 'this', set(...)
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
682 // 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
683 // base = path:dir/subdir
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
684 // excluded=rootfilesin:dir,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
685 // visit_children_set(''):
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
686 // base returns {'dir'}, excluded returns {'dir'}, if we
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
687 // 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
688 // still need to visit 'dir'!
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
689 set
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
690 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
691 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
692 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
693
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
694 fn matches_everything(&self) -> bool {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
695 false
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
696 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
697
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
698 fn is_exact(&self) -> bool {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
699 self.base.is_exact()
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
700 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
701 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
702
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
703 impl DifferenceMatcher {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
704 pub fn new(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
705 base: Box<dyn Matcher + Sync>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
706 excluded: Box<dyn Matcher + Sync>,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
707 ) -> Self {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
708 let base_is_exact = base.is_exact();
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
709 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
710 let mut new = Self {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
711 base,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
712 excluded,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
713 files: None,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
714 };
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
715 if base_is_exact {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
716 new.files = base_files.map(|files| {
51703
ec7171748350 rust: apply clippy lints
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51696
diff changeset
717 files.iter().filter(|&f| new.matches(f)).cloned().collect()
49478
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
718 });
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
719 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
720 new
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
721 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
722 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
723
49581
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
724 /// 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
725 /// contexts.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
726 ///
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
727 /// 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
728 /// 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
729 /// 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
730 ///
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
731 /// 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
732 /// 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
733 /// 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
734 /// 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
735 ///
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
736 /// 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
737 /// 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
738 struct RegexMatcher {
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
739 /// 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
740 /// 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
741 /// first compilation.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
742 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
743 /// 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
744 /// from each thread.
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
745 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
746 }
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
747
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
748 impl RegexMatcher {
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
749 /// 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
750 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
751 self.local
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
752 .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
753 .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
754 }
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
755 }
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
756
51468
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
757 /// Return a `RegexBuilder` from a bytes pattern
44593
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
758 ///
51468
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
759 /// This works around the fact that even if it works on byte haysacks,
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
760 /// [`regex::bytes::Regex`] still uses UTF-8 patterns.
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
761 pub fn re_bytes_builder(pattern: &[u8]) -> regex::bytes::RegexBuilder {
44593
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
762 use std::io::Write;
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
763
44832
ad1ec40975aa rust-regex: fix issues with regex anchoring and performance
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44803
diff changeset
764 // 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
765 // 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
766 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
767 for byte in pattern {
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
768 if *byte > 127 {
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
769 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
770 } else {
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
771 escaped_bytes.push(*byte);
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
772 }
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
773 }
44832
ad1ec40975aa rust-regex: fix issues with regex anchoring and performance
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44803
diff changeset
774 escaped_bytes.push(b')');
44593
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
775
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
776 // Avoid the cost of UTF8 checking
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
777 //
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
778 // # Safety
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
779 // 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
780 let pattern_string = unsafe { String::from_utf8_unchecked(escaped_bytes) };
51468
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
781 regex::bytes::RegexBuilder::new(&pattern_string)
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
782 }
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
783
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
784 /// Returns a function that matches an `HgPath` against the given regex
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
785 /// pattern.
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
786 ///
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
787 /// This can fail when the pattern is invalid or not supported by the
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
788 /// underlying engine (the `regex` crate), for instance anything with
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
789 /// back-references.
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
790 #[logging_timer::time("trace")]
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
791 fn re_matcher(pattern: &[u8]) -> PatternResult<RegexMatcher> {
5633de951d34 rust-matchers: raw regular expression builder
Georges Racinet <georges.racinet@octobus.net>
parents: 51271
diff changeset
792 let re = re_bytes_builder(pattern)
44593
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
793 .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
794 // 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
795 // 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
796 // 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
797 .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
798 .build()
496868f1030c rust-matchers: use the `regex` crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44541
diff changeset
799 .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
800
49581
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
801 Ok(RegexMatcher {
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
802 base: re,
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
803 local: Default::default(),
04f1dba53c96 rust: create wrapper struct to reduce `regex` contention issues
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
804 })
44519
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
805 }
52d40f8fb82d rust-matchers: add function to generate a regex matcher function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44353
diff changeset
806
44521
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
807 /// 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
808 /// said regex formed by the given ignore patterns.
51117
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51106
diff changeset
809 fn build_regex_match<'a>(
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51106
diff changeset
810 ignore_patterns: &[IgnorePattern],
50858
090658724abf rust: de-hardcode glob_suffix
Spencer Baugh <sbaugh@janestreet.com>
parents: 50857
diff changeset
811 glob_suffix: &[u8],
51117
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51106
diff changeset
812 ) -> PatternResult<(Vec<u8>, IgnoreFnType<'a>)> {
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
813 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
814 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
815
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
816 for pattern in ignore_patterns {
50858
090658724abf rust: de-hardcode glob_suffix
Spencer Baugh <sbaugh@janestreet.com>
parents: 50857
diff changeset
817 if let Some(re) = build_single_regex(pattern, glob_suffix)? {
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
818 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
819 } 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
820 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
821 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
822 }
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
823 }
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
824
44521
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
825 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
826
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
827 // 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
828 // (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
829 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
830 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
831 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
832 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
833 };
48354
2009e3c64a53 rhg: refactor to use IgnoreFnType alias more widely
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48311
diff changeset
834 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
835 } 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
836 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
837 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
838 };
44521
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
839
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
840 Ok((full_regex, func))
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
841 }
a21881b40942 rust-matchers: add `build_regex_match` function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44520
diff changeset
842
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
843 /// 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
844 ///
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
845 /// 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
846 /// 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
847 /// 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
848 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
849 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
850 ) -> (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
851 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
852 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
853
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
854 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
855 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
856 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
857 } = 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
858 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
859 PatternSyntax::RootGlob | PatternSyntax::Glob => {
48311
6d69e83e6b6e rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 47409
diff changeset
860 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
861 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
862 if p.iter()
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
863 .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
864 {
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
865 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
866 }
48311
6d69e83e6b6e rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 47409
diff changeset
867 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
868 }
48311
6d69e83e6b6e rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 47409
diff changeset
869 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
870 }
50692
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
871 PatternSyntax::Path
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
872 | PatternSyntax::RelPath
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
873 | PatternSyntax::FilePath => {
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
874 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
875 &[] 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
876 } 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
877 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
878 });
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
879 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
880 }
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
881 PatternSyntax::RootFilesIn => {
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
882 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
883 &[] 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
884 } 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
885 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
886 };
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
887 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
888 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
889 _ => {
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
890 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
891 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
892 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
893 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
894 (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
895 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
896
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
897 /// 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
898 #[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
899 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
900 /// 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
901 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
902 /// 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
903 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
904 /// Implicitly required directories to go to items in either roots or dirs
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
905 pub parents: DirsMultiset,
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
906 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
907
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
908 /// 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
909 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
910 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
911 ) -> 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
912 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
913
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
914 let mut parents = DirsMultiset::from_manifest(&dirs)?;
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
915
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
916 for path in &roots {
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
917 parents.add_path(path)?
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
918 }
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
919
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
920 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
921 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
922 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
923 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
924 })
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
925 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
926
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
927 /// 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
928 /// should be matched.
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
929 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
930 ignore_patterns: Vec<IgnorePattern>,
50858
090658724abf rust: de-hardcode glob_suffix
Spencer Baugh <sbaugh@janestreet.com>
parents: 50857
diff changeset
931 glob_suffix: &[u8],
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49913
diff changeset
932 ) -> 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
933 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
934 // For debugging and printing
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
935 let mut patterns = vec![];
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
936
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
937 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
938
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
939 if !subincludes.is_empty() {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
940 // Build prefix-based matcher functions for subincludes
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
941 let mut submatchers = FastHashMap::default();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
942 let mut prefixes = vec![];
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
943
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
944 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
945 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
946 let match_fn =
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
947 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
948 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
949 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
950 }
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 let match_subinclude = move |filename: &HgPath| {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
953 for prefix in prefixes.iter() {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
954 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
955 if (submatchers[prefix])(rel) {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
956 return true;
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
957 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
958 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
959 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
960 false
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
961 };
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
962
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
963 match_funcs.push(Box::new(match_subinclude));
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
964 }
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 if !ignore_patterns.is_empty() {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
967 // 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
968 // with a regex.
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
969 if ignore_patterns
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
970 .iter()
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
971 .all(|k| k.syntax == PatternSyntax::RootFilesIn)
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
972 {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
973 let dirs: HashSet<_> = ignore_patterns
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
974 .iter()
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
975 .map(|k| k.pattern.to_owned())
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
976 .collect();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
977 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
978
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
979 let match_func = move |path: &HgPath| -> bool {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
980 let path = path.as_bytes();
51271
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
981 let i = path.iter().rposition(|a| *a == b'/');
bec6e9c108fd matchers: use correct method for finding index in vector
Martin von Zweigbergk <martinvonz@google.com>
parents: 51117
diff changeset
982 let dir = if let Some(i) = i { &path[..i] } else { b"." };
51117
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51106
diff changeset
983 dirs.contains(dir)
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
984 };
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
985 match_funcs.push(Box::new(match_func));
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
986
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
987 patterns.extend(b"rootfilesin: ");
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
988 dirs_vec.sort();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
989 patterns.extend(dirs_vec.escaped_bytes());
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
990 } else {
50858
090658724abf rust: de-hardcode glob_suffix
Spencer Baugh <sbaugh@janestreet.com>
parents: 50857
diff changeset
991 let (new_re, match_func) =
090658724abf rust: de-hardcode glob_suffix
Spencer Baugh <sbaugh@janestreet.com>
parents: 50857
diff changeset
992 build_regex_match(&ignore_patterns, glob_suffix)?;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
993 patterns = new_re;
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
994 match_funcs.push(match_func)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
995 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
996 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
997
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
998 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
999 (patterns, match_funcs.remove(0))
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1000 } else {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1001 (
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1002 patterns,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1003 Box::new(move |f: &HgPath| -> bool {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1004 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
1005 }),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1006 )
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1007 })
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1008 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1009
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1010 /// 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
1011 /// 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
1012 /// ignored.
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1013 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
1014 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
1015 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
1016 inspect_pattern_bytes: &mut impl FnMut(&Path, &[u8]),
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1017 ) -> PatternResult<(IncludeMatcher<'a>, Vec<PatternFileWarning>)> {
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1018 let mut all_patterns = vec![];
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1019 let mut all_warnings = vec![];
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1020
47409
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
1021 // 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
1022 // 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
1023 // 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
1024 // 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
1025 // (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
1026 all_pattern_files
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
1027 .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
1028
47378
777c3d231913 rust: Make some file path parameters less generic
Simon Sapin <simon.sapin@octobus.net>
parents: 45607
diff changeset
1029 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
1030 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
1031 pattern_file,
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
1032 root_dir,
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
1033 inspect_pattern_bytes,
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47379
diff changeset
1034 )?;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1035
44597
e62052d0f377 rust-status: only involve ignore mechanism when needed
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44593
diff changeset
1036 all_patterns.extend(patterns.to_owned());
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1037 all_warnings.extend(warnings);
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1038 }
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1039 let matcher = IncludeMatcher::new(all_patterns)?;
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1040 Ok((matcher, all_warnings))
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1041 }
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1042
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1043 /// 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
1044 /// 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
1045 /// ignored.
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1046 pub fn get_ignore_function<'a>(
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1047 all_pattern_files: Vec<PathBuf>,
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1048 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
1049 inspect_pattern_bytes: &mut impl FnMut(&Path, &[u8]),
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1050 ) -> PatternResult<(IgnoreFnType<'a>, Vec<PatternFileWarning>)> {
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1051 let res =
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1052 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
1053 res.map(|(matcher, all_warnings)| {
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1054 let res: IgnoreFnType<'a> =
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1055 Box::new(move |path: &HgPath| matcher.matches(path));
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1056
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1057 (res, all_warnings)
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1058 })
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1059 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1060
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1061 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
1062 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
1063 let RootsDirsAndParents {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1064 roots,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1065 dirs,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1066 parents,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1067 } = 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
1068 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
1069 matches!(k.syntax, PatternSyntax::Path | PatternSyntax::RelPath)
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1070 });
50858
090658724abf rust: de-hardcode glob_suffix
Spencer Baugh <sbaugh@janestreet.com>
parents: 50857
diff changeset
1071 let (patterns, match_fn) = build_match(ignore_patterns, b"(?:/|$)")?;
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1072
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1073 Ok(Self {
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1074 patterns,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1075 match_fn,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1076 prefix,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1077 roots,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1078 dirs,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1079 parents,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1080 })
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1081 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1082
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1083 fn get_all_parents_children(&self) -> DirsChildrenMultiset {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1084 // TODO cache
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1085 let thing = self
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1086 .dirs
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1087 .iter()
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1088 .chain(self.roots.iter())
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1089 .chain(self.parents.iter());
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1090 DirsChildrenMultiset::new(thing, Some(self.parents.iter()))
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1091 }
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1092
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1093 pub fn debug_get_patterns(&self) -> &[u8] {
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1094 self.patterns.as_ref()
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48354
diff changeset
1095 }
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1096 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1097
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1098 impl<'a> Display for IncludeMatcher<'a> {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1099 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
1100 // 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
1101 // 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
1102 // 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
1103 // 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
1104 // 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
1105 // (on purpose) missing from the `includes`.
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1106 write!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1107 f,
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1108 "IncludeMatcher(includes='{}')",
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1109 String::from_utf8_lossy(&self.patterns.escaped_bytes())
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1110 )
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1111 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1112 }
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1113
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1114 #[cfg(test)]
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1115 mod tests {
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1116 use super::*;
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1117 use pretty_assertions::assert_eq;
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
1118 use std::collections::BTreeMap;
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
1119 use std::collections::BTreeSet;
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
1120 use std::fmt::Debug;
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
1121 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
1122
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1123 #[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
1124 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
1125 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
1126 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
1127 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
1128 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
1129 ];
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1130 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
1131
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1132 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
1133 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
1134 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
1135 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
1136 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
1137 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
1138 ),
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1139 );
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1140 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
1141 }
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1142
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1143 #[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
1144 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
1145 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
1146 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
1147 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
1148 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
1149 ];
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1150
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1151 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
1152 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
1153 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
1154
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1155 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
1156
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1157 let parents = DirsMultiset::from_manifest(&[
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1158 HgPathBuf::from_bytes(b"x"),
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1159 HgPathBuf::from_bytes(b"g/x"),
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1160 HgPathBuf::from_bytes(b"g/y"),
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1161 ])
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1162 .unwrap();
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
1163
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1164 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
1165 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
1166 RootsDirsAndParents {
483fce658e43 rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44522
diff changeset
1167 roots,
483fce658e43 rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44522
diff changeset
1168 dirs,
483fce658e43 rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44522
diff changeset
1169 parents
483fce658e43 rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44522
diff changeset
1170 }
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
1171 );
d4e8cfcde012 rust-matchers: add functions to get roots, dirs and parents from patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44519
diff changeset
1172 }
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1173
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1174 #[test]
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1175 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
1176 // Visitchildrenset
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
1177 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
1178 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
1179
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1180 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1181 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
1182 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1183 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
1184 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1185 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1186
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1187 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1188 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
1189 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1190 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
1191 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1192 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1193
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1194 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1195 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
1196 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1197 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
1198 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1199 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1200
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1201 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1202 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
1203 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1204 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1205 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1206 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
1207 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1208 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1209 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1210 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
1211 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1212 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1213 }
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1214
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1215 #[test]
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1216 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
1217 let files = vec![
45607
75f785888a7b rust-matchers: make `Matcher` trait object-safe
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
1218 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
1219 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
1220 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
1221 // 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
1222 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
1223 ];
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1224 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
1225
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1226 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1227 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
1228 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
1229 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1230 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
1231 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1232 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1233
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1234 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1235 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
1236 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
1237 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1238 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
1239 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1240 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1241
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1242 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1243 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
1244 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
1245 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1246 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
1247 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1248 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1249
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1250 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1251 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
1252 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1253 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
1254 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1255 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1256 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1257 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
1258 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1259 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
1260 VisitChildrenSet::Set(set)
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1261 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1262
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1263 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1264 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
1265 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1266 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1267 assert_eq!(
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1268 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
1269 VisitChildrenSet::Empty
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1270 );
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
1271 }
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1272
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1273 #[test]
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1274 fn test_patternmatcher() {
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1275 // VisitdirPrefix
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1276 let m = PatternMatcher::new(vec![IgnorePattern::new(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1277 PatternSyntax::Path,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1278 b"dir/subdir",
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1279 Path::new(""),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1280 )])
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1281 .unwrap();
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1282 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1283 m.visit_children_set(HgPath::new(b"")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1284 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1285 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1286 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1287 m.visit_children_set(HgPath::new(b"dir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1288 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1289 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1290 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1291 m.visit_children_set(HgPath::new(b"dir/subdir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1292 VisitChildrenSet::Recursive
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1293 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1294 // OPT: This should probably be Recursive if its parent is?
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1295 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1296 m.visit_children_set(HgPath::new(b"dir/subdir/x")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1297 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1298 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1299 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1300 m.visit_children_set(HgPath::new(b"folder")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1301 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1302 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1303
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1304 // VisitchildrensetPrefix
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1305 let m = PatternMatcher::new(vec![IgnorePattern::new(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1306 PatternSyntax::Path,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1307 b"dir/subdir",
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1308 Path::new(""),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1309 )])
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1310 .unwrap();
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1311 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1312 m.visit_children_set(HgPath::new(b"")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1313 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1314 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1315 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1316 m.visit_children_set(HgPath::new(b"dir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1317 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1318 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1319 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1320 m.visit_children_set(HgPath::new(b"dir/subdir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1321 VisitChildrenSet::Recursive
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1322 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1323 // OPT: This should probably be Recursive if its parent is?
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1324 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1325 m.visit_children_set(HgPath::new(b"dir/subdir/x")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1326 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1327 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1328 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1329 m.visit_children_set(HgPath::new(b"folder")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1330 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1331 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1332
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1333 // VisitdirRootfilesin
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1334 let m = PatternMatcher::new(vec![IgnorePattern::new(
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
1335 PatternSyntax::RootFilesIn,
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1336 b"dir/subdir",
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1337 Path::new(""),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1338 )])
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1339 .unwrap();
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1340 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1341 m.visit_children_set(HgPath::new(b"dir/subdir/x")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1342 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1343 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1344 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1345 m.visit_children_set(HgPath::new(b"folder")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1346 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1347 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1348 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1349 m.visit_children_set(HgPath::new(b"")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1350 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1351 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1352 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1353 m.visit_children_set(HgPath::new(b"dir")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1354 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1355 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1356 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1357 m.visit_children_set(HgPath::new(b"dir/subdir")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1358 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1359 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1360
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1361 // VisitchildrensetRootfilesin
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1362 let m = PatternMatcher::new(vec![IgnorePattern::new(
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
1363 PatternSyntax::RootFilesIn,
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1364 b"dir/subdir",
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1365 Path::new(""),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1366 )])
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1367 .unwrap();
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1368 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1369 m.visit_children_set(HgPath::new(b"dir/subdir/x")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1370 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1371 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1372 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1373 m.visit_children_set(HgPath::new(b"folder")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1374 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1375 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1376 // FIXME: These should probably be {'dir'}, {'subdir'} and This,
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1377 // respectively
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1378 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1379 m.visit_children_set(HgPath::new(b"")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1380 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1381 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1382 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1383 m.visit_children_set(HgPath::new(b"dir")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1384 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1385 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1386 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1387 m.visit_children_set(HgPath::new(b"dir/subdir")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1388 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1389 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1390
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1391 // VisitdirGlob
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1392 let m = PatternMatcher::new(vec![IgnorePattern::new(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1393 PatternSyntax::Glob,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1394 b"dir/z*",
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1395 Path::new(""),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1396 )])
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1397 .unwrap();
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1398 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1399 m.visit_children_set(HgPath::new(b"")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1400 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1401 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1402 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1403 m.visit_children_set(HgPath::new(b"dir")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1404 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1405 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1406 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1407 m.visit_children_set(HgPath::new(b"folder")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1408 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1409 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1410 // OPT: these should probably be False.
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1411 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1412 m.visit_children_set(HgPath::new(b"dir/subdir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1413 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1414 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1415 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1416 m.visit_children_set(HgPath::new(b"dir/subdir/x")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1417 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1418 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1419
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1420 // VisitchildrensetGlob
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1421 let m = PatternMatcher::new(vec![IgnorePattern::new(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1422 PatternSyntax::Glob,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1423 b"dir/z*",
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1424 Path::new(""),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1425 )])
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1426 .unwrap();
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1427 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1428 m.visit_children_set(HgPath::new(b"")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1429 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1430 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1431 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1432 m.visit_children_set(HgPath::new(b"folder")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1433 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1434 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1435 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1436 m.visit_children_set(HgPath::new(b"dir")),
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
1437 VisitChildrenSet::This
50862
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1438 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1439 // OPT: these should probably be Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1440 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1441 m.visit_children_set(HgPath::new(b"dir/subdir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1442 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1443 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1444 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1445 m.visit_children_set(HgPath::new(b"dir/subdir/x")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1446 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1447 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1448
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1449 // VisitdirFilepath
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1450 let m = PatternMatcher::new(vec![IgnorePattern::new(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1451 PatternSyntax::FilePath,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1452 b"dir/z",
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1453 Path::new(""),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1454 )])
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1455 .unwrap();
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1456 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1457 m.visit_children_set(HgPath::new(b"")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1458 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1459 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1460 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1461 m.visit_children_set(HgPath::new(b"dir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1462 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1463 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1464 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1465 m.visit_children_set(HgPath::new(b"folder")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1466 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1467 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1468 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1469 m.visit_children_set(HgPath::new(b"dir/subdir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1470 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1471 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1472 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1473 m.visit_children_set(HgPath::new(b"dir/subdir/x")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1474 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1475 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1476
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1477 // VisitchildrensetFilepath
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1478 let m = PatternMatcher::new(vec![IgnorePattern::new(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1479 PatternSyntax::FilePath,
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1480 b"dir/z",
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1481 Path::new(""),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1482 )])
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1483 .unwrap();
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1484 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1485 m.visit_children_set(HgPath::new(b"")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1486 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1487 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1488 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1489 m.visit_children_set(HgPath::new(b"folder")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1490 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1491 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1492 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1493 m.visit_children_set(HgPath::new(b"dir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1494 VisitChildrenSet::This
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1495 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1496 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1497 m.visit_children_set(HgPath::new(b"dir/subdir")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1498 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1499 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1500 assert_eq!(
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1501 m.visit_children_set(HgPath::new(b"dir/subdir/x")),
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1502 VisitChildrenSet::Empty
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1503 );
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1504 }
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1505
f874342fa568 rust-matchers: add PatternMatcher
Spencer Baugh <sbaugh@janestreet.com>
parents: 50858
diff changeset
1506 #[test]
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1507 fn test_includematcher() {
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1508 // VisitchildrensetPrefix
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1509 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
1510 PatternSyntax::RelPath,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1511 b"dir/subdir",
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1512 Path::new(""),
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1513 )])
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1514 .unwrap();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1515
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1516 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1517 set.insert(HgPathBuf::from_bytes(b"dir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1518 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1519 matcher.visit_children_set(HgPath::new(b"")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1520 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1521 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1523 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1524 set.insert(HgPathBuf::from_bytes(b"subdir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1525 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1526 matcher.visit_children_set(HgPath::new(b"dir")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1527 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1528 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1529 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1530 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
1531 VisitChildrenSet::Recursive
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1532 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1533 // 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
1534 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1535 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
1536 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1537 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1538 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1539 matcher.visit_children_set(HgPath::new(b"folder")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1540 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1541 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1542
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1543 // VisitchildrensetRootfilesin
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1544 let matcher = IncludeMatcher::new(vec![IgnorePattern::new(
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
1545 PatternSyntax::RootFilesIn,
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1546 b"dir/subdir",
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1547 Path::new(""),
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1548 )])
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1549 .unwrap();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1550
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1551 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1552 set.insert(HgPathBuf::from_bytes(b"dir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1553 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1554 matcher.visit_children_set(HgPath::new(b"")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1555 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1556 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1557
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1558 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1559 set.insert(HgPathBuf::from_bytes(b"subdir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1560 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1561 matcher.visit_children_set(HgPath::new(b"dir")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1562 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1563 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1564
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1565 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1566 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
1567 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1568 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1569 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1570 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
1571 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1572 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1573 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1574 matcher.visit_children_set(HgPath::new(b"folder")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1575 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1576 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1577
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1578 // VisitchildrensetGlob
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1579 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
1580 PatternSyntax::Glob,
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1581 b"dir/z*",
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1582 Path::new(""),
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47378
diff changeset
1583 )])
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1584 .unwrap();
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1585
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1586 let mut set = HashSet::new();
49345
137d6bb71937 rust: use owned types in `Matcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
1587 set.insert(HgPathBuf::from_bytes(b"dir"));
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1588 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1589 matcher.visit_children_set(HgPath::new(b"")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1590 VisitChildrenSet::Set(set)
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1591 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1592 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1593 matcher.visit_children_set(HgPath::new(b"folder")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1594 VisitChildrenSet::Empty
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1595 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1596 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1597 matcher.visit_children_set(HgPath::new(b"dir")),
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1598 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1599 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1600 // OPT: these should probably be set().
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1601 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1602 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
1603 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1604 );
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1605 assert_eq!(
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1606 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
1607 VisitChildrenSet::This
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1608 );
49464
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1609
50692
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1610 // VisitchildrensetFilePath
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1611 let matcher = IncludeMatcher::new(vec![IgnorePattern::new(
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1612 PatternSyntax::FilePath,
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1613 b"dir/z",
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1614 Path::new(""),
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1615 )])
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1616 .unwrap();
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1617
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1618 let mut set = HashSet::new();
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1619 set.insert(HgPathBuf::from_bytes(b"dir"));
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1620 assert_eq!(
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1621 matcher.visit_children_set(HgPath::new(b"")),
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1622 VisitChildrenSet::Set(set)
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1623 );
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1624 assert_eq!(
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1625 matcher.visit_children_set(HgPath::new(b"folder")),
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1626 VisitChildrenSet::Empty
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1627 );
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1628 let mut set = HashSet::new();
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1629 set.insert(HgPathBuf::from_bytes(b"z"));
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1630 assert_eq!(
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1631 matcher.visit_children_set(HgPath::new(b"dir")),
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1632 VisitChildrenSet::Set(set)
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1633 );
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1634 // OPT: these should probably be set().
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1635 assert_eq!(
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1636 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1637 VisitChildrenSet::Empty
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1638 );
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1639 assert_eq!(
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1640 matcher.visit_children_set(HgPath::new(b"dir/subdir/x")),
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1641 VisitChildrenSet::Empty
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1642 );
1c31b343e514 match: add `filepath:` pattern to match an exact filepath relative to the root
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49930
diff changeset
1643
49464
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1644 // Test multiple patterns
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1645 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
1646 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
1647 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
1648 ])
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1649 .unwrap();
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1650
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1651 assert_eq!(
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1652 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
1653 VisitChildrenSet::This
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1654 );
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1655
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1656 // Test multiple patterns
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1657 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
1658 PatternSyntax::Glob,
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1659 b"**/*.exe",
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1660 Path::new(""),
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1661 )])
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1662 .unwrap();
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1663
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1664 assert_eq!(
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1665 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
1666 VisitChildrenSet::This
90512ca6a255 rust-matchers: fix behavior of `IncludeMatcher` with multiple includes
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49351
diff changeset
1667 );
44522
c697638e0e91 rust-matchers: add `IgnoreMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44521
diff changeset
1668 }
49347
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1669
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1670 #[test]
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1671 fn test_unionmatcher() {
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1672 // Path + Rootfiles
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1673 let m1 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1674 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1675 b"dir/subdir",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1676 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1677 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1678 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1679 let m2 = IncludeMatcher::new(vec![IgnorePattern::new(
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
1680 PatternSyntax::RootFilesIn,
49347
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1681 b"dir",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1682 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1683 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1684 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1685 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
1686
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1687 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1688 set.insert(HgPathBuf::from_bytes(b"dir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1689 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1690 matcher.visit_children_set(HgPath::new(b"")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1691 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1692 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1693 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1694 matcher.visit_children_set(HgPath::new(b"dir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1695 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1696 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1697 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1698 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1699 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1700 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1701 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1702 matcher.visit_children_set(HgPath::new(b"dir/foo")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1703 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1704 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1705 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1706 matcher.visit_children_set(HgPath::new(b"folder")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1707 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1708 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1709 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1710 matcher.visit_children_set(HgPath::new(b"folder")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1711 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1712 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1713
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1714 // 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
1715 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1716 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
1717 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1718 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1719 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1720 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
1721 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1722 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1723
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1724 // Path + unrelated Path
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1725 let m1 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1726 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1727 b"dir/subdir",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1728 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1729 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1730 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1731 let m2 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1732 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1733 b"folder",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1734 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1735 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1736 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1737 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
1738
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1739 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1740 set.insert(HgPathBuf::from_bytes(b"folder"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1741 set.insert(HgPathBuf::from_bytes(b"dir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1742 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1743 matcher.visit_children_set(HgPath::new(b"")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1744 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1745 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1746 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1747 set.insert(HgPathBuf::from_bytes(b"subdir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1748 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1749 matcher.visit_children_set(HgPath::new(b"dir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1750 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1751 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1752
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1753 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1754 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1755 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1756 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1757 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1758 matcher.visit_children_set(HgPath::new(b"dir/foo")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1759 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1760 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1761
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1762 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1763 matcher.visit_children_set(HgPath::new(b"folder")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1764 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1765 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1766 // 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
1767 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1768 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
1769 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1770 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1771 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1772 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
1773 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1774 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1775
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1776 // Path + subpath
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1777 let m1 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1778 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1779 b"dir/subdir/x",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1780 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1781 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1782 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1783 let m2 = IncludeMatcher::new(vec![IgnorePattern::new(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1784 PatternSyntax::RelPath,
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1785 b"dir/subdir",
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1786 Path::new(""),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1787 )])
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1788 .unwrap();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1789 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
1790
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1791 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1792 set.insert(HgPathBuf::from_bytes(b"dir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1793 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1794 matcher.visit_children_set(HgPath::new(b"")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1795 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1796 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1797 let mut set = HashSet::new();
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1798 set.insert(HgPathBuf::from_bytes(b"subdir"));
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1799 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1800 matcher.visit_children_set(HgPath::new(b"dir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1801 VisitChildrenSet::Set(set)
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1802 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1803
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1804 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1805 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1806 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1807 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1808 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1809 matcher.visit_children_set(HgPath::new(b"dir/foo")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1810 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1811 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1812
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1813 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1814 matcher.visit_children_set(HgPath::new(b"folder")),
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1815 VisitChildrenSet::Empty
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1816 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1817 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1818 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
1819 VisitChildrenSet::Recursive
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1820 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1821 // OPT: this should probably be 'all' not 'this'.
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1822 assert_eq!(
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1823 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
1824 VisitChildrenSet::This
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1825 );
b508cffd3c04 rust: add UnionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49345
diff changeset
1826 }
49349
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1827
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1828 #[test]
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1829 fn test_intersectionmatcher() {
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1830 // Include path + Include rootfiles
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1831 let m1 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1832 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1833 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1834 b"dir/subdir",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1835 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1836 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1837 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1838 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1839 let m2 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1840 IncludeMatcher::new(vec![IgnorePattern::new(
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
1841 PatternSyntax::RootFilesIn,
49349
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1842 b"dir",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1843 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1844 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1845 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1846 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1847 let matcher = IntersectionMatcher::new(m1, m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1848
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1849 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1850 set.insert(HgPathBuf::from_bytes(b"dir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1851 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1852 matcher.visit_children_set(HgPath::new(b"")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1853 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1854 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1855 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1856 matcher.visit_children_set(HgPath::new(b"dir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1857 VisitChildrenSet::This
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1858 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1859 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1860 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1861 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1862 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1863 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1864 matcher.visit_children_set(HgPath::new(b"dir/foo")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1865 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1866 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1867 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1868 matcher.visit_children_set(HgPath::new(b"folder")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1869 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1870 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1871 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1872 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
1873 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1874 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1875 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1876 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
1877 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1878 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1879
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1880 // Non intersecting paths
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1881 let m1 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1882 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1883 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1884 b"dir/subdir",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1885 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1886 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1887 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1888 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1889 let m2 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1890 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1891 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1892 b"folder",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1893 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1894 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1895 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1896 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1897 let matcher = IntersectionMatcher::new(m1, m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1898
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1899 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1900 matcher.visit_children_set(HgPath::new(b"")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1901 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1902 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1903 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1904 matcher.visit_children_set(HgPath::new(b"dir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1905 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1906 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1907 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1908 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1909 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1910 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1911 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1912 matcher.visit_children_set(HgPath::new(b"dir/foo")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1913 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1914 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1915 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1916 matcher.visit_children_set(HgPath::new(b"folder")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1917 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1918 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1919 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1920 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
1921 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1922 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1923 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1924 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
1925 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1926 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1927
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1928 // Nested paths
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1929 let m1 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1930 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1931 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1932 b"dir/subdir/x",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1933 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1934 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1935 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1936 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1937 let m2 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1938 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1939 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1940 b"dir/subdir",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1941 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1942 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1943 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1944 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1945 let matcher = IntersectionMatcher::new(m1, m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1946
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1947 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1948 set.insert(HgPathBuf::from_bytes(b"dir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1949 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1950 matcher.visit_children_set(HgPath::new(b"")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1951 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1952 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1953
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1954 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1955 set.insert(HgPathBuf::from_bytes(b"subdir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1956 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1957 matcher.visit_children_set(HgPath::new(b"dir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1958 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1959 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1960 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1961 set.insert(HgPathBuf::from_bytes(b"x"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1962 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1963 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1964 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1965 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1966 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1967 matcher.visit_children_set(HgPath::new(b"dir/foo")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1968 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1969 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1970 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1971 matcher.visit_children_set(HgPath::new(b"folder")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1972 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1973 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1974 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1975 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
1976 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1977 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1978 // OPT: this should probably be 'all' not 'this'.
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1979 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1980 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
1981 VisitChildrenSet::This
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1982 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1983
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1984 // Diverging paths
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1985 let m1 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1986 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1987 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1988 b"dir/subdir/x",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1989 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1990 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1991 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1992 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1993 let m2 = Box::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1994 IncludeMatcher::new(vec![IgnorePattern::new(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1995 PatternSyntax::RelPath,
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1996 b"dir/subdir/z",
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1997 Path::new(""),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1998 )])
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
1999 .unwrap(),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2000 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2001 let matcher = IntersectionMatcher::new(m1, m2);
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2002
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2003 // 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
2004 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2005 set.insert(HgPathBuf::from_bytes(b"dir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2006 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2007 matcher.visit_children_set(HgPath::new(b"")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2008 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2009 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2010 // 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
2011 let mut set = HashSet::new();
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2012 set.insert(HgPathBuf::from_bytes(b"subdir"));
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2013 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2014 matcher.visit_children_set(HgPath::new(b"dir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2015 VisitChildrenSet::Set(set)
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2016 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2017 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2018 matcher.visit_children_set(HgPath::new(b"dir/subdir")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2019 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2020 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2021 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2022 matcher.visit_children_set(HgPath::new(b"dir/foo")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2023 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2024 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2025 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2026 matcher.visit_children_set(HgPath::new(b"folder")),
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2027 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2028 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2029 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2030 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
2031 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2032 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2033 assert_eq!(
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2034 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
2035 VisitChildrenSet::Empty
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2036 );
5e53ecbc308f rust: add IntersectionMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49347
diff changeset
2037 }
49478
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2038
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2039 #[test]
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2040 fn test_differencematcher() {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2041 // Two alwaysmatchers should function like a nevermatcher
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2042 let m1 = AlwaysMatcher;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2043 let m2 = AlwaysMatcher;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2044 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
2045
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2046 for case in &[
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2047 &b""[..],
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2048 b"dir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2049 b"dir/subdir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2050 b"dir/subdir/z",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2051 b"dir/foo",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2052 b"dir/subdir/x",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2053 b"folder",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2054 ] {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2055 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2056 matcher.visit_children_set(HgPath::new(case)),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2057 VisitChildrenSet::Empty
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2058 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2059 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2060
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2061 // 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
2062 let m1 = AlwaysMatcher;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2063 let m2 = NeverMatcher;
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2064 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
2065
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2066 for case in &[
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2067 &b""[..],
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2068 b"dir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2069 b"dir/subdir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2070 b"dir/subdir/z",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2071 b"dir/foo",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2072 b"dir/subdir/x",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2073 b"folder",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2074 ] {
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2075 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2076 matcher.visit_children_set(HgPath::new(case)),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2077 VisitChildrenSet::Recursive
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2078 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2079 }
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2080
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2081 // Two include matchers
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2082 let m1 = Box::new(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2083 IncludeMatcher::new(vec![IgnorePattern::new(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2084 PatternSyntax::RelPath,
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2085 b"dir/subdir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2086 Path::new("/repo"),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2087 )])
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2088 .unwrap(),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2089 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2090 let m2 = Box::new(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2091 IncludeMatcher::new(vec![IgnorePattern::new(
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
2092 PatternSyntax::RootFilesIn,
49478
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2093 b"dir",
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2094 Path::new("/repo"),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2095 )])
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2096 .unwrap(),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2097 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2098
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2099 let matcher = DifferenceMatcher::new(m1, m2);
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2100
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2101 let mut set = HashSet::new();
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2102 set.insert(HgPathBuf::from_bytes(b"dir"));
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2103 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2104 matcher.visit_children_set(HgPath::new(b"")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2105 VisitChildrenSet::Set(set)
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2106 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2107
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2108 let mut set = HashSet::new();
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2109 set.insert(HgPathBuf::from_bytes(b"subdir"));
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2110 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2111 matcher.visit_children_set(HgPath::new(b"dir")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2112 VisitChildrenSet::Set(set)
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2113 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2114 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2115 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
2116 VisitChildrenSet::Recursive
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2117 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2118 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2119 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
2120 VisitChildrenSet::Empty
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2121 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2122 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2123 matcher.visit_children_set(HgPath::new(b"folder")),
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2124 VisitChildrenSet::Empty
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2125 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2126 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2127 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
2128 VisitChildrenSet::This
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2129 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2130 assert_eq!(
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2131 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
2132 VisitChildrenSet::This
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2133 );
d8ce883ff1f4 rust-matchers: implement DifferenceMatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49464
diff changeset
2134 }
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2135
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2136 mod invariants {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2137 pub mod visit_children_set {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2138
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2139 use crate::{
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2140 matchers::{tests::Tree, Matcher, VisitChildrenSet},
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2141 utils::hg_path::HgPath,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2142 };
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2143
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2144 #[allow(dead_code)]
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2145 #[derive(Debug)]
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2146 struct Error<'a, M> {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2147 matcher: &'a M,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2148 path: &'a HgPath,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2149 matching: &'a Tree,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2150 visit_children_set: &'a VisitChildrenSet,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2151 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2152
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2153 fn holds(
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2154 matching: &Tree,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2155 not_matching: &Tree,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2156 vcs: &VisitChildrenSet,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2157 ) -> bool {
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2158 match vcs {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2159 VisitChildrenSet::Empty => matching.is_empty(),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2160 VisitChildrenSet::This => {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2161 // `This` does not come with any obligations.
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2162 true
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2163 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2164 VisitChildrenSet::Recursive => {
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2165 // `Recursive` requires that *everything* in the
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2166 // subtree matches. This
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2167 // requirement is relied on for example in
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2168 // DifferenceMatcher implementation.
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2169 not_matching.is_empty()
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2170 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2171 VisitChildrenSet::Set(allowed_children) => {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2172 // `allowed_children` does not distinguish between
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2173 // files and directories: if it's not included, it
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2174 // must not be matched.
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2175 for k in matching.dirs.keys() {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2176 if !(allowed_children.contains(k)) {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2177 return false;
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2178 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2179 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2180 for k in matching.files.iter() {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2181 if !(allowed_children.contains(k)) {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2182 return false;
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2183 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2184 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2185 true
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2186 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2187 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2188 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2189
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2190 pub fn check<M: Matcher + std::fmt::Debug>(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2191 matcher: &M,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2192 path: &HgPath,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2193 matching: &Tree,
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2194 not_matching: &Tree,
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2195 visit_children_set: &VisitChildrenSet,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2196 ) {
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2197 if !holds(matching, not_matching, visit_children_set) {
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2198 panic!(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2199 "{:#?}",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2200 Error {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2201 matcher,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2202 path,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2203 visit_children_set,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2204 matching
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2205 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2206 )
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2207 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2208 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2209 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2210 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2211
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2212 #[derive(Debug, Clone)]
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2213 pub struct Tree {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2214 files: BTreeSet<HgPathBuf>,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2215 dirs: BTreeMap<HgPathBuf, Tree>,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2216 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2217
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2218 impl Tree {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2219 fn len(&self) -> usize {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2220 let mut n = 0;
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2221 n += self.files.len();
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2222 for d in self.dirs.values() {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2223 n += d.len();
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2224 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2225 n
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2226 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2227
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2228 fn is_empty(&self) -> bool {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2229 self.files.is_empty() && self.dirs.is_empty()
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2230 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2231
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2232 fn make(
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2233 files: BTreeSet<HgPathBuf>,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2234 dirs: BTreeMap<HgPathBuf, Tree>,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2235 ) -> Self {
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2236 Self {
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2237 files,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2238 dirs: dirs
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2239 .into_iter()
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2240 .filter(|(_k, v)| (!(v.is_empty())))
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2241 .collect(),
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2242 }
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2243 }
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2244
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2245 fn filter_and_check<M: Matcher + Debug>(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2246 &self,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2247 m: &M,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2248 path: &HgPath,
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2249 ) -> (Self, Self) {
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2250 let (files1, files2): (BTreeSet<HgPathBuf>, BTreeSet<HgPathBuf>) =
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2251 self.files
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2252 .iter()
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2253 .map(|v| v.to_owned())
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2254 .partition(|v| m.matches(&path.join(v)));
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2255 let (dirs1, dirs2): (
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2256 BTreeMap<HgPathBuf, Tree>,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2257 BTreeMap<HgPathBuf, Tree>,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2258 ) = self
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2259 .dirs
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2260 .iter()
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2261 .map(|(k, v)| {
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2262 let path = path.join(k);
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2263 let (t1, t2) = v.filter_and_check(m, &path);
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2264 ((k.clone(), t1), (k.clone(), t2))
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2265 })
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2266 .unzip();
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2267 let matching = Self::make(files1, dirs1);
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2268 let not_matching = Self::make(files2, dirs2);
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2269 let vcs = m.visit_children_set(path);
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2270 invariants::visit_children_set::check(
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2271 m,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2272 path,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2273 &matching,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2274 &not_matching,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2275 &vcs,
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2276 );
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2277 (matching, not_matching)
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2278 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2279
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2280 fn check_matcher<M: Matcher + Debug>(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2281 &self,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2282 m: &M,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2283 expect_count: usize,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2284 ) {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2285 let res = self.filter_and_check(m, &HgPathBuf::new());
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2286 if expect_count != res.0.len() {
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2287 eprintln!(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2288 "warning: expected {} matches, got {} for {:#?}",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2289 expect_count,
51568
74230abb2504 match: strengthen visit_children_set invariant, Recursive means "all files"
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51567
diff changeset
2290 res.0.len(),
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2291 m
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2292 );
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2293 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2294 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2295 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2296
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2297 fn mkdir(children: &[(&[u8], &Tree)]) -> Tree {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2298 let p = HgPathBuf::from_bytes;
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2299 let names = [
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2300 p(b"a"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2301 p(b"b.txt"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2302 p(b"file.txt"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2303 p(b"c.c"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2304 p(b"c.h"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2305 p(b"dir1"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2306 p(b"dir2"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2307 p(b"subdir"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2308 ];
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2309 let files: BTreeSet<HgPathBuf> = BTreeSet::from(names);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2310 let dirs = children
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2311 .iter()
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2312 .map(|(name, t)| (p(name), (*t).clone()))
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2313 .collect();
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2314 Tree { files, dirs }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2315 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2316
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2317 fn make_example_tree() -> Tree {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2318 let leaf = mkdir(&[]);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2319 let abc = mkdir(&[(b"d", &leaf)]);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2320 let ab = mkdir(&[(b"c", &abc)]);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2321 let a = mkdir(&[(b"b", &ab)]);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2322 let dir = mkdir(&[(b"subdir", &leaf), (b"subdir.c", &leaf)]);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2323 mkdir(&[(b"dir", &dir), (b"dir1", &dir), (b"dir2", &dir), (b"a", &a)])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2324 }
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2325
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2326 #[test]
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2327 fn test_pattern_matcher_visit_children_set() {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2328 let tree = make_example_tree();
51563
529a655874fb matchers: fix the bug in rust PatternMatcher that made it cut off early
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51561
diff changeset
2329 let pattern_dir1_glob_c =
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2330 PatternMatcher::new(vec![IgnorePattern::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2331 PatternSyntax::Glob,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2332 b"dir1/*.c",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2333 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2334 )])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2335 .unwrap();
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2336 let pattern_dir1 = || {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2337 PatternMatcher::new(vec![IgnorePattern::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2338 PatternSyntax::Path,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2339 b"dir1",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2340 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2341 )])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2342 .unwrap()
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2343 };
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2344 let pattern_dir1_a = PatternMatcher::new(vec![IgnorePattern::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2345 PatternSyntax::Glob,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2346 b"dir1/a",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2347 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2348 )])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2349 .unwrap();
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2350 let pattern_relglob_c = || {
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2351 PatternMatcher::new(vec![IgnorePattern::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2352 PatternSyntax::RelGlob,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2353 b"*.c",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2354 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2355 )])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2356 .unwrap()
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2357 };
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2358 let files = vec![HgPathBuf::from_bytes(b"dir/subdir/b.txt")];
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2359 let file_dir_subdir_b = FileMatcher::new(files).unwrap();
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2360
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2361 let files = vec![
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2362 HgPathBuf::from_bytes(b"file.txt"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2363 HgPathBuf::from_bytes(b"a/file.txt"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2364 HgPathBuf::from_bytes(b"a/b/file.txt"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2365 // No file in a/b/c
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2366 HgPathBuf::from_bytes(b"a/b/c/d/file.txt"),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2367 ];
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2368 let file_abcdfile = FileMatcher::new(files).unwrap();
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
2369 let rootfilesin_dir = PatternMatcher::new(vec![IgnorePattern::new(
51565
2a89d2f6336f match: rename RootFiles to RootFilesIn for more consistency
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51564
diff changeset
2370 PatternSyntax::RootFilesIn,
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2371 b"dir",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2372 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2373 )])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2374 .unwrap();
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2375
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2376 let pattern_filepath_dir_subdir =
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2377 PatternMatcher::new(vec![IgnorePattern::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2378 PatternSyntax::FilePath,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2379 b"dir/subdir",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2380 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2381 )])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2382 .unwrap();
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2383
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2384 let include_dir_subdir =
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2385 IncludeMatcher::new(vec![IgnorePattern::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2386 PatternSyntax::RelPath,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2387 b"dir/subdir",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2388 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2389 )])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2390 .unwrap();
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2391
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2392 let more_includematchers = [
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2393 IncludeMatcher::new(vec![IgnorePattern::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2394 PatternSyntax::Glob,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2395 b"dir/s*",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2396 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2397 )])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2398 .unwrap(),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2399 // Test multiple patterns
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2400 IncludeMatcher::new(vec![
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2401 IgnorePattern::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2402 PatternSyntax::RelPath,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2403 b"dir",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2404 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2405 ),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2406 IgnorePattern::new(PatternSyntax::Glob, b"s*", Path::new("")),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2407 ])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2408 .unwrap(),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2409 // Test multiple patterns
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2410 IncludeMatcher::new(vec![IgnorePattern::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2411 PatternSyntax::Glob,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2412 b"**/*.c",
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2413 Path::new(""),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2414 )])
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2415 .unwrap(),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2416 ];
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2417
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2418 tree.check_matcher(&pattern_dir1(), 25);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2419 tree.check_matcher(&pattern_dir1_a, 1);
51563
529a655874fb matchers: fix the bug in rust PatternMatcher that made it cut off early
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51561
diff changeset
2420 tree.check_matcher(&pattern_dir1_glob_c, 2);
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2421 tree.check_matcher(&pattern_relglob_c(), 14);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2422 tree.check_matcher(&AlwaysMatcher, 112);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2423 tree.check_matcher(&NeverMatcher, 0);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2424 tree.check_matcher(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2425 &IntersectionMatcher::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2426 Box::new(pattern_relglob_c()),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2427 Box::new(pattern_dir1()),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2428 ),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2429 3,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2430 );
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2431 tree.check_matcher(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2432 &UnionMatcher::new(vec![
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2433 Box::new(pattern_relglob_c()),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2434 Box::new(pattern_dir1()),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2435 ]),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2436 36,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2437 );
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2438 tree.check_matcher(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2439 &DifferenceMatcher::new(
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2440 Box::new(pattern_relglob_c()),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2441 Box::new(pattern_dir1()),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2442 ),
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2443 11,
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2444 );
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2445 tree.check_matcher(&file_dir_subdir_b, 1);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2446 tree.check_matcher(&file_abcdfile, 4);
51567
b39057b713b1 match: fix the rust-side bug in visit_children_set for rootfilesin matchers
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51565
diff changeset
2447 tree.check_matcher(&rootfilesin_dir, 8);
51561
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2448 tree.check_matcher(&pattern_filepath_dir_subdir, 1);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2449 tree.check_matcher(&include_dir_subdir, 9);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2450 tree.check_matcher(&more_includematchers[0], 17);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2451 tree.check_matcher(&more_includematchers[1], 25);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2452 tree.check_matcher(&more_includematchers[2], 35);
f5c367dc6541 tests: add tests and document expectations from visit_children_set in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51468
diff changeset
2453 }
44353
54d185eb24b5 rust-matchers: implement `visit_children_set` for `FileMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44006
diff changeset
2454 }