annotate rust/hg-core/src/matchers.rs @ 49487:e8481625c582

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