Mercurial > hg
annotate rust/hg-core/src/matchers.rs @ 46505:a25033eb43b5
rhg: add limited support for the `config` sub-command
Only with one argument and no flag. This is mostly for testing.
Differential Revision: https://phab.mercurial-scm.org/D9972
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 08 Feb 2021 23:41:58 +0100 |
parents | 75f785888a7b |
children | 777c3d231913 |
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, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
14 PatternFileWarning, PatternResult, SubInclude, |
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 |
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
|
25 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
|
26 use std::borrow::ToOwned; |
43438
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
27 use std::collections::HashSet; |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
28 use std::fmt::{Display, Error, Formatter}; |
43914
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
29 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
|
30 use std::ops::Deref; |
44597
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
31 use std::path::{Path, PathBuf}; |
43438
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
32 |
44784
83c97c0bd319
rust-matchers: add timing tracing to regex compilation
Raphaël Gomès <rgomes@octobus.net>
parents:
44597
diff
changeset
|
33 use micro_timer::timed; |
83c97c0bd319
rust-matchers: add timing tracing to regex compilation
Raphaël Gomès <rgomes@octobus.net>
parents:
44597
diff
changeset
|
34 |
44353
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
35 #[derive(Debug, PartialEq)] |
43832
1bb4e9b02984
rust-matchers: improve `Matcher` trait ergonomics
Raphaël Gomès <rgomes@octobus.net>
parents:
43611
diff
changeset
|
36 pub enum VisitChildrenSet<'a> { |
43438
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
37 /// Don't visit anything |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
38 Empty, |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
39 /// Only visit this directory |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
40 This, |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
41 /// 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
|
42 /// TODO Should we implement a `NonEmptyHashSet`? |
43832
1bb4e9b02984
rust-matchers: improve `Matcher` trait ergonomics
Raphaël Gomès <rgomes@octobus.net>
parents:
43611
diff
changeset
|
43 Set(HashSet<&'a HgPath>), |
43438
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
44 /// Visit this directory and all subdirectories |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
45 Recursive, |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
46 } |
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 pub trait Matcher { |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
49 /// Explicitly listed files |
43832
1bb4e9b02984
rust-matchers: improve `Matcher` trait ergonomics
Raphaël Gomès <rgomes@octobus.net>
parents:
43611
diff
changeset
|
50 fn file_set(&self) -> Option<&HashSet<&HgPath>>; |
43438
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
51 /// Returns whether `filename` is in `file_set` |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
52 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
|
53 /// 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
|
54 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
|
55 /// 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
|
56 /// 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
|
57 /// 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
|
58 /// 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
|
59 /// patterns. |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
60 /// |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
61 /// # Example |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
62 /// |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
63 /// 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
|
64 /// 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
|
65 /// 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
|
66 /// are not). |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
67 /// |
44006
72bced4f2936
rust-matchers: fixing cargo doc
Georges Racinet <georges.racinet@octobus.net>
parents:
43914
diff
changeset
|
68 /// ```text |
43438
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
69 /// ```ignore |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
70 /// '' -> {'foo', 'qux'} |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
71 /// 'baz' -> set() |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
72 /// 'foo' -> {'bar'} |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
73 /// // 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
|
74 /// // 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
|
75 /// // 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
|
76 /// // `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
|
77 /// 'foo/bar' -> 'this' |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
78 /// 'qux' -> 'this' |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
79 /// ``` |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
80 /// # Important |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
81 /// |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
82 /// 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
|
83 /// 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
|
84 /// 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
|
85 /// 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
|
86 /// 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
|
87 /// it may return `VisitChildrenSet::This`. |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
88 /// 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
|
89 /// 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
|
90 /// 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
|
91 /// `VisitChildrenSet::This`). |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
92 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
|
93 /// 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
|
94 /// 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
|
95 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
|
96 /// 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
|
97 /// might be possible. |
43611
27c25c0dc967
rust-matchers: remove default implementations for `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43438
diff
changeset
|
98 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
|
99 } |
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 /// Matches everything. |
43834
542c8b277261
rust-matchers: add doctests for `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
43832
diff
changeset
|
102 ///``` |
542c8b277261
rust-matchers: add doctests for `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
43832
diff
changeset
|
103 /// 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
|
104 /// |
542c8b277261
rust-matchers: add doctests for `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
43832
diff
changeset
|
105 /// let matcher = AlwaysMatcher; |
542c8b277261
rust-matchers: add doctests for `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
43832
diff
changeset
|
106 /// |
43914
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
107 /// assert_eq!(matcher.matches(HgPath::new(b"whatever")), true); |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
108 /// assert_eq!(matcher.matches(HgPath::new(b"b.txt")), 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"main.c")), 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(br"re:.*\.c$")), true); |
43834
542c8b277261
rust-matchers: add doctests for `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
43832
diff
changeset
|
111 /// ``` |
43438
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
112 #[derive(Debug)] |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
113 pub struct AlwaysMatcher; |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
114 |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
115 impl Matcher for AlwaysMatcher { |
43832
1bb4e9b02984
rust-matchers: improve `Matcher` trait ergonomics
Raphaël Gomès <rgomes@octobus.net>
parents:
43611
diff
changeset
|
116 fn file_set(&self) -> Option<&HashSet<&HgPath>> { |
1bb4e9b02984
rust-matchers: improve `Matcher` trait ergonomics
Raphaël Gomès <rgomes@octobus.net>
parents:
43611
diff
changeset
|
117 None |
43438
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
118 } |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
119 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
|
120 false |
27c25c0dc967
rust-matchers: remove default implementations for `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43438
diff
changeset
|
121 } |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
122 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
|
123 true |
27c25c0dc967
rust-matchers: remove default implementations for `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43438
diff
changeset
|
124 } |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
125 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
|
126 VisitChildrenSet::Recursive |
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
127 } |
43611
27c25c0dc967
rust-matchers: remove default implementations for `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43438
diff
changeset
|
128 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
|
129 true |
27c25c0dc967
rust-matchers: remove default implementations for `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43438
diff
changeset
|
130 } |
27c25c0dc967
rust-matchers: remove default implementations for `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43438
diff
changeset
|
131 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
|
132 false |
27c25c0dc967
rust-matchers: remove default implementations for `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43438
diff
changeset
|
133 } |
43438
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
134 } |
43914
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
135 |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
136 /// 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
|
137 /// patterns. |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
138 /// |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
139 ///``` |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
140 /// 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
|
141 /// |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
142 /// let files = [HgPathBuf::from_bytes(b"a.txt"), HgPathBuf::from_bytes(br"re:.*\.c$")]; |
43914
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
143 /// let matcher = FileMatcher::new(&files).unwrap(); |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
144 /// |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
145 /// 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
|
146 /// 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
|
147 /// 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
|
148 /// 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
|
149 /// ``` |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
150 #[derive(Debug)] |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
151 pub struct FileMatcher<'a> { |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
152 files: HashSet<&'a HgPath>, |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
153 dirs: DirsMultiset, |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
154 } |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
155 |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
156 impl<'a> FileMatcher<'a> { |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
157 pub fn new(files: &'a [HgPathBuf]) -> Result<Self, DirstateMapError> { |
43914
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
158 Ok(Self { |
44973
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44870
diff
changeset
|
159 files: HashSet::from_iter(files.iter().map(AsRef::as_ref)), |
43914
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
160 dirs: DirsMultiset::from_manifest(files)?, |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
161 }) |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
162 } |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
163 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
|
164 self.files.contains(filename.as_ref()) |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
165 } |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
166 } |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
167 |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
168 impl<'a> Matcher for FileMatcher<'a> { |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
169 fn file_set(&self) -> Option<&HashSet<&HgPath>> { |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
170 Some(&self.files) |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
171 } |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
172 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
|
173 self.inner_matches(filename) |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
174 } |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
175 fn matches(&self, filename: &HgPath) -> bool { |
43914
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
176 self.inner_matches(filename) |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
177 } |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
178 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
|
179 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
|
180 return VisitChildrenSet::Empty; |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
181 } |
44973
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44870
diff
changeset
|
182 let dirs_as_set = self.dirs.iter().map(Deref::deref).collect(); |
44353
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
183 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
184 let mut candidates: HashSet<&HgPath> = |
44973
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44870
diff
changeset
|
185 self.files.union(&dirs_as_set).cloned().collect(); |
44353
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
186 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
|
187 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
188 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
|
189 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
|
190 candidates = candidates |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
191 .iter() |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
192 .filter_map(|c| { |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
193 if c.as_bytes().starts_with(&directory) { |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
194 Some(HgPath::new(&c.as_bytes()[directory.len()..])) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
195 } else { |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
196 None |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
197 } |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
198 }) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
199 .collect(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
200 } |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
201 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
202 // `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
|
203 // 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
|
204 // '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
|
205 // '/' 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
|
206 // 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
|
207 VisitChildrenSet::Set( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
208 candidates |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
209 .iter() |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
210 .filter_map(|c| { |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
211 if c.bytes().all(|b| *b != b'/') { |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
212 Some(*c) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
213 } else { |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
214 None |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
215 } |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
216 }) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
217 .collect(), |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
218 ) |
43914
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
219 } |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
220 fn matches_everything(&self) -> bool { |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
221 false |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
222 } |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
223 fn is_exact(&self) -> bool { |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
224 true |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
225 } |
69c4f3cf2cdf
rust-matchers: add `FileMatcher` implementation
Raphaël Gomès <rgomes@octobus.net>
parents:
43863
diff
changeset
|
226 } |
44519
52d40f8fb82d
rust-matchers: add function to generate a regex matcher function
Raphaël Gomès <rgomes@octobus.net>
parents:
44353
diff
changeset
|
227 |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
228 /// 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
|
229 /// ``` |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
230 /// use hg::{ |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
231 /// matchers::{IncludeMatcher, Matcher}, |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
232 /// IgnorePattern, |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
233 /// PatternSyntax, |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
234 /// utils::hg_path::HgPath |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
235 /// }; |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
236 /// use std::path::Path; |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
237 /// /// |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
238 /// let ignore_patterns = |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
239 /// vec![IgnorePattern::new(PatternSyntax::RootGlob, b"this*", Path::new(""))]; |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
240 /// let (matcher, _) = IncludeMatcher::new(ignore_patterns, "").unwrap(); |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
241 /// /// |
9f96beb9bafe
rust: remove support for `re2`
Raphaël Gomès <rgomes@octobus.net>
parents:
44852
diff
changeset
|
242 /// 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
|
243 /// 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
|
244 /// 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
|
245 /// 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
|
246 /// ``` |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
247 pub struct IncludeMatcher<'a> { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
248 patterns: Vec<u8>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
249 match_fn: Box<dyn for<'r> Fn(&'r HgPath) -> bool + 'a + Sync>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
250 /// 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
|
251 prefix: bool, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
252 roots: HashSet<HgPathBuf>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
253 dirs: HashSet<HgPathBuf>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
254 parents: HashSet<HgPathBuf>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
255 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
256 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
257 impl<'a> Matcher for IncludeMatcher<'a> { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
258 fn file_set(&self) -> Option<&HashSet<&HgPath>> { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
259 None |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
260 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
261 |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
262 fn exact_match(&self, _filename: &HgPath) -> bool { |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
263 false |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
264 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
265 |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
266 fn matches(&self, filename: &HgPath) -> bool { |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
267 (self.match_fn)(filename.as_ref()) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
268 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
269 |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
270 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
|
271 let dir = directory.as_ref(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
272 if self.prefix && self.roots.contains(dir) { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
273 return VisitChildrenSet::Recursive; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
274 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
275 if self.roots.contains(HgPath::new(b"")) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
276 || self.roots.contains(dir) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
277 || self.dirs.contains(dir) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
278 || 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
|
279 { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
280 return VisitChildrenSet::This; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
281 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
282 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
283 if self.parents.contains(directory.as_ref()) { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
284 let multiset = self.get_all_parents_children(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
285 if let Some(children) = multiset.get(dir) { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
286 return VisitChildrenSet::Set(children.to_owned()); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
287 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
288 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
289 VisitChildrenSet::Empty |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
290 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
291 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
292 fn matches_everything(&self) -> bool { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
293 false |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
294 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
295 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
296 fn is_exact(&self) -> bool { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
297 false |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
298 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
299 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
300 |
44593
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
301 /// 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
|
302 /// pattern. |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
303 /// |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
304 /// 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
|
305 /// 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
|
306 /// back-references. |
44784
83c97c0bd319
rust-matchers: add timing tracing to regex compilation
Raphaël Gomès <rgomes@octobus.net>
parents:
44597
diff
changeset
|
307 #[timed] |
44593
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
308 fn re_matcher( |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
309 pattern: &[u8], |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
310 ) -> PatternResult<impl Fn(&HgPath) -> bool + Sync> { |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
311 use std::io::Write; |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
312 |
44832
ad1ec40975aa
rust-regex: fix issues with regex anchoring and performance
Raphaël Gomès <rgomes@octobus.net>
parents:
44803
diff
changeset
|
313 // 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
|
314 // 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
|
315 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
|
316 for byte in pattern { |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
317 if *byte > 127 { |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
318 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
|
319 } else { |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
320 escaped_bytes.push(*byte); |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
321 } |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
322 } |
44832
ad1ec40975aa
rust-regex: fix issues with regex anchoring and performance
Raphaël Gomès <rgomes@octobus.net>
parents:
44803
diff
changeset
|
323 escaped_bytes.push(b')'); |
44593
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
324 |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
325 // Avoid the cost of UTF8 checking |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
326 // |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
327 // # Safety |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
328 // 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
|
329 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
|
330 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
|
331 .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
|
332 // 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
|
333 // 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
|
334 // 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
|
335 .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
|
336 .build() |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
337 .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
|
338 |
496868f1030c
rust-matchers: use the `regex` crate
Raphaël Gomès <rgomes@octobus.net>
parents:
44541
diff
changeset
|
339 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
|
340 } |
52d40f8fb82d
rust-matchers: add function to generate a regex matcher function
Raphaël Gomès <rgomes@octobus.net>
parents:
44353
diff
changeset
|
341 |
44521
a21881b40942
rust-matchers: add `build_regex_match` function
Raphaël Gomès <rgomes@octobus.net>
parents:
44520
diff
changeset
|
342 /// 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
|
343 /// said regex formed by the given ignore patterns. |
a21881b40942
rust-matchers: add `build_regex_match` function
Raphaël Gomès <rgomes@octobus.net>
parents:
44520
diff
changeset
|
344 fn build_regex_match<'a>( |
a21881b40942
rust-matchers: add `build_regex_match` function
Raphaël Gomès <rgomes@octobus.net>
parents:
44520
diff
changeset
|
345 ignore_patterns: &'a [&'a IgnorePattern], |
a21881b40942
rust-matchers: add `build_regex_match` function
Raphaël Gomès <rgomes@octobus.net>
parents:
44520
diff
changeset
|
346 ) -> PatternResult<(Vec<u8>, Box<dyn Fn(&HgPath) -> bool + Sync>)> { |
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
|
347 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
|
348 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
|
349 |
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
|
350 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
|
351 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
|
352 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
|
353 } 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
|
354 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
|
355 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
|
356 } |
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
|
357 } |
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
|
358 |
44521
a21881b40942
rust-matchers: add `build_regex_match` function
Raphaël Gomès <rgomes@octobus.net>
parents:
44520
diff
changeset
|
359 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
|
360 |
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
|
361 // 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
|
362 // (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
|
363 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
|
364 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
|
365 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
|
366 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
|
367 }; |
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
|
368 Box::new(func) as Box<dyn Fn(&HgPath) -> bool + Sync> |
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
|
369 } 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
|
370 let func = move |filename: &HgPath| exact_set.contains(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
|
371 Box::new(func) as Box<dyn Fn(&HgPath) -> bool + Sync> |
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
|
372 }; |
44521
a21881b40942
rust-matchers: add `build_regex_match` function
Raphaël Gomès <rgomes@octobus.net>
parents:
44520
diff
changeset
|
373 |
a21881b40942
rust-matchers: add `build_regex_match` function
Raphaël Gomès <rgomes@octobus.net>
parents:
44520
diff
changeset
|
374 Ok((full_regex, func)) |
a21881b40942
rust-matchers: add `build_regex_match` function
Raphaël Gomès <rgomes@octobus.net>
parents:
44520
diff
changeset
|
375 } |
a21881b40942
rust-matchers: add `build_regex_match` function
Raphaël Gomès <rgomes@octobus.net>
parents:
44520
diff
changeset
|
376 |
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
|
377 /// 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
|
378 /// |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
379 /// 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
|
380 /// 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
|
381 /// 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
|
382 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
|
383 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
|
384 ) -> (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
|
385 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
|
386 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
|
387 |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
388 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
|
389 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
|
390 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
|
391 } = 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
|
392 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
|
393 PatternSyntax::RootGlob | PatternSyntax::Glob => { |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
394 let mut root = 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
|
395 |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
396 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
|
397 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
|
398 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
|
399 _ => 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
|
400 }) { |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
401 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
|
402 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
403 root.push(HgPathBuf::from_bytes(p)); |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
404 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
405 let buf = |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
406 root.iter().fold(HgPathBuf::new(), |acc, r| acc.join(r)); |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
407 roots.push(buf); |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
408 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
409 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
|
410 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
|
411 &[] 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
|
412 } 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
|
413 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
|
414 }); |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
415 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
|
416 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
417 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
|
418 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
|
419 &[] 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
|
420 } 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
|
421 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
|
422 }; |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
423 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
|
424 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
425 _ => { |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
426 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
|
427 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
428 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
429 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
430 (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
|
431 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
432 |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
433 /// 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
|
434 #[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
|
435 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
|
436 /// 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
|
437 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
|
438 /// 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
|
439 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
|
440 /// 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
|
441 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
|
442 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
443 |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
444 /// 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
|
445 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
|
446 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
|
447 ) -> 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
|
448 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
|
449 |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
450 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
|
451 |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
452 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
|
453 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
|
454 .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
|
455 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
|
456 _ => 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
|
457 })? |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
458 .iter() |
44973
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44870
diff
changeset
|
459 .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
|
460 ); |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
461 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
|
462 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
|
463 .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
|
464 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
|
465 _ => 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
|
466 })? |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
467 .iter() |
44973
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44870
diff
changeset
|
468 .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
|
469 ); |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
470 |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
471 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
|
472 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
|
473 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
|
474 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
|
475 }) |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
476 } |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
477 |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
478 /// 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
|
479 /// should be matched. |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
480 fn build_match<'a, 'b>( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
481 ignore_patterns: &'a [IgnorePattern], |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
482 root_dir: impl AsRef<Path>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
483 ) -> PatternResult<( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
484 Vec<u8>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
485 Box<dyn Fn(&HgPath) -> bool + 'b + Sync>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
486 Vec<PatternFileWarning>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
487 )> { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
488 let mut match_funcs: Vec<Box<dyn Fn(&HgPath) -> bool + Sync>> = vec![]; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
489 // For debugging and printing |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
490 let mut patterns = vec![]; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
491 let mut all_warnings = vec![]; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
492 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
493 let (subincludes, ignore_patterns) = |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
494 filter_subincludes(ignore_patterns, root_dir)?; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
495 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
496 if !subincludes.is_empty() { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
497 // Build prefix-based matcher functions for subincludes |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
498 let mut submatchers = FastHashMap::default(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
499 let mut prefixes = vec![]; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
500 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
501 for SubInclude { prefix, root, path } in subincludes.into_iter() { |
44597
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
502 let (match_fn, warnings) = |
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
503 get_ignore_function(vec![path.to_path_buf()], root)?; |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
504 all_warnings.extend(warnings); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
505 prefixes.push(prefix.to_owned()); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
506 submatchers.insert(prefix.to_owned(), match_fn); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
507 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
508 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
509 let match_subinclude = move |filename: &HgPath| { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
510 for prefix in prefixes.iter() { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
511 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
|
512 if (submatchers[prefix])(rel) { |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
513 return true; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
514 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
515 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
516 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
517 false |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
518 }; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
519 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
520 match_funcs.push(Box::new(match_subinclude)); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
521 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
522 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
523 if !ignore_patterns.is_empty() { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
524 // 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
|
525 // with a regex. |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
526 if ignore_patterns |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
527 .iter() |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
528 .all(|k| k.syntax == PatternSyntax::RootFiles) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
529 { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
530 let dirs: HashSet<_> = ignore_patterns |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
531 .iter() |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
532 .map(|k| k.pattern.to_owned()) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
533 .collect(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
534 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
|
535 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
536 let match_func = move |path: &HgPath| -> bool { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
537 let path = path.as_bytes(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
538 let i = path.iter().rfind(|a| **a == b'/'); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
539 let dir = if let Some(i) = i { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
540 &path[..*i as usize] |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
541 } else { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
542 b"." |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
543 }; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
544 dirs.contains(dir.deref()) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
545 }; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
546 match_funcs.push(Box::new(match_func)); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
547 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
548 patterns.extend(b"rootfilesin: "); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
549 dirs_vec.sort(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
550 patterns.extend(dirs_vec.escaped_bytes()); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
551 } else { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
552 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
|
553 patterns = new_re; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
554 match_funcs.push(match_func) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
555 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
556 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
557 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
558 Ok(if match_funcs.len() == 1 { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
559 (patterns, match_funcs.remove(0), all_warnings) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
560 } else { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
561 ( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
562 patterns, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
563 Box::new(move |f: &HgPath| -> bool { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
564 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
|
565 }), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
566 all_warnings, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
567 ) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
568 }) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
569 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
570 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
571 /// 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
|
572 /// 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
|
573 /// ignored. |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
574 pub fn get_ignore_function<'a>( |
44597
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
575 all_pattern_files: Vec<PathBuf>, |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
576 root_dir: impl AsRef<Path>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
577 ) -> PatternResult<( |
44597
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
578 Box<dyn for<'r> Fn(&'r HgPath) -> bool + Sync + 'a>, |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
579 Vec<PatternFileWarning>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
580 )> { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
581 let mut all_patterns = vec![]; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
582 let mut all_warnings = vec![]; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
583 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
584 for pattern_file in all_pattern_files.into_iter() { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
585 let (patterns, warnings) = |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
586 get_patterns_from_file(pattern_file, &root_dir)?; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
587 |
44597
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
588 all_patterns.extend(patterns.to_owned()); |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
589 all_warnings.extend(warnings); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
590 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
591 let (matcher, warnings) = IncludeMatcher::new(all_patterns, root_dir)?; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
592 all_warnings.extend(warnings); |
44597
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
593 Ok(( |
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
594 Box::new(move |path: &HgPath| matcher.matches(path)), |
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
595 all_warnings, |
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44593
diff
changeset
|
596 )) |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
597 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
598 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
599 impl<'a> IncludeMatcher<'a> { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
600 pub fn new( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
601 ignore_patterns: Vec<IgnorePattern>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
602 root_dir: impl AsRef<Path>, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
603 ) -> PatternResult<(Self, Vec<PatternFileWarning>)> { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
604 let (patterns, match_fn, warnings) = |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
605 build_match(&ignore_patterns, root_dir)?; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
606 let RootsDirsAndParents { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
607 roots, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
608 dirs, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
609 parents, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
610 } = roots_dirs_and_parents(&ignore_patterns)?; |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
611 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
612 let prefix = ignore_patterns.iter().any(|k| match k.syntax { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
613 PatternSyntax::Path | PatternSyntax::RelPath => true, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
614 _ => false, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
615 }); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
616 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
617 Ok(( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
618 Self { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
619 patterns, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
620 match_fn, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
621 prefix, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
622 roots, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
623 dirs, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
624 parents, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
625 }, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
626 warnings, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
627 )) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
628 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
629 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
630 fn get_all_parents_children(&self) -> DirsChildrenMultiset { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
631 // TODO cache |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
632 let thing = self |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
633 .dirs |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
634 .iter() |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
635 .chain(self.roots.iter()) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
636 .chain(self.parents.iter()); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
637 DirsChildrenMultiset::new(thing, Some(&self.parents)) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
638 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
639 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
640 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
641 impl<'a> Display for IncludeMatcher<'a> { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
642 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
|
643 // 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
|
644 // 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
|
645 // 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
|
646 // 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
|
647 // 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
|
648 // (on purpose) missing from the `includes`. |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
649 write!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
650 f, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
651 "IncludeMatcher(includes='{}')", |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
652 String::from_utf8_lossy(&self.patterns.escaped_bytes()) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
653 ) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
654 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
655 } |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
656 |
44353
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
657 #[cfg(test)] |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
658 mod tests { |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
659 use super::*; |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
660 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
|
661 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
|
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 #[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
|
664 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
|
665 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
|
666 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
|
667 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
|
668 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
|
669 ]; |
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 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
|
671 |
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 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
|
673 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
|
674 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
|
675 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
|
676 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
|
677 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
|
678 ), |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
679 ); |
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 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
|
681 } |
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 |
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 #[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
|
684 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
|
685 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
|
686 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
|
687 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
|
688 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
|
689 ]; |
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 |
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
691 let mut roots = 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
|
692 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
|
693 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
|
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 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
|
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 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
|
698 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
|
699 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
|
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 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
|
702 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
|
703 RootsDirsAndParents { |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44522
diff
changeset
|
704 roots, |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44522
diff
changeset
|
705 dirs, |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44522
diff
changeset
|
706 parents |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44522
diff
changeset
|
707 } |
44520
d4e8cfcde012
rust-matchers: add functions to get roots, dirs and parents from patterns
Raphaël Gomès <rgomes@octobus.net>
parents:
44519
diff
changeset
|
708 ); |
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 } |
44353
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
710 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
711 #[test] |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
712 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
|
713 // Visitchildrenset |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
714 let files = vec![HgPathBuf::from_bytes(b"dir/subdir/foo.txt")]; |
44353
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
715 let matcher = FileMatcher::new(&files).unwrap(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
716 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
717 let mut set = HashSet::new(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
718 set.insert(HgPath::new(b"dir")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
719 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
720 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
|
721 VisitChildrenSet::Set(set) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
722 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
723 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
724 let mut set = HashSet::new(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
725 set.insert(HgPath::new(b"subdir")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
726 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
727 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
|
728 VisitChildrenSet::Set(set) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
729 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
730 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
731 let mut set = HashSet::new(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
732 set.insert(HgPath::new(b"foo.txt")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
733 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
734 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
|
735 VisitChildrenSet::Set(set) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
736 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
737 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
738 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
739 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
|
740 VisitChildrenSet::Empty |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
741 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
742 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
743 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
|
744 VisitChildrenSet::Empty |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
745 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
746 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
747 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
|
748 VisitChildrenSet::Empty |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
749 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
750 } |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
751 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
752 #[test] |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
753 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
|
754 let files = vec![ |
45607
75f785888a7b
rust-matchers: make `Matcher` trait object-safe
Raphaël Gomès <rgomes@octobus.net>
parents:
44973
diff
changeset
|
755 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
|
756 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
|
757 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
|
758 // 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
|
759 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
|
760 ]; |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
761 let matcher = FileMatcher::new(&files).unwrap(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
762 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
763 let mut set = HashSet::new(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
764 set.insert(HgPath::new(b"a")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
765 set.insert(HgPath::new(b"rootfile.txt")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
766 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
767 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
|
768 VisitChildrenSet::Set(set) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
769 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
770 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
771 let mut set = HashSet::new(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
772 set.insert(HgPath::new(b"b")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
773 set.insert(HgPath::new(b"file1.txt")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
774 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
775 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
|
776 VisitChildrenSet::Set(set) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
777 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
778 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
779 let mut set = HashSet::new(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
780 set.insert(HgPath::new(b"c")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
781 set.insert(HgPath::new(b"file2.txt")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
782 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
783 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
|
784 VisitChildrenSet::Set(set) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
785 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
786 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
787 let mut set = HashSet::new(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
788 set.insert(HgPath::new(b"d")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
789 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
790 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
|
791 VisitChildrenSet::Set(set) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
792 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
793 let mut set = HashSet::new(); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
794 set.insert(HgPath::new(b"file4.txt")); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
795 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
796 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
|
797 VisitChildrenSet::Set(set) |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
798 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
799 |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
800 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
801 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
|
802 VisitChildrenSet::Empty |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
803 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
804 assert_eq!( |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
805 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
|
806 VisitChildrenSet::Empty |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
807 ); |
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
808 } |
44522
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
809 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
810 #[test] |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
811 fn test_includematcher() { |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
812 // VisitchildrensetPrefix |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
813 let (matcher, _) = IncludeMatcher::new( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
814 vec![IgnorePattern::new( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
815 PatternSyntax::RelPath, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
816 b"dir/subdir", |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
817 Path::new(""), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
818 )], |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
819 "", |
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 .unwrap(); |
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 let mut set = HashSet::new(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
824 set.insert(HgPath::new(b"dir")); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
825 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
826 matcher.visit_children_set(HgPath::new(b"")), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
827 VisitChildrenSet::Set(set) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
828 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
829 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
830 let mut set = HashSet::new(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
831 set.insert(HgPath::new(b"subdir")); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
832 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
833 matcher.visit_children_set(HgPath::new(b"dir")), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
834 VisitChildrenSet::Set(set) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
835 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
836 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
837 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
|
838 VisitChildrenSet::Recursive |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
839 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
840 // 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
|
841 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
842 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
|
843 VisitChildrenSet::This |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
844 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
845 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
846 matcher.visit_children_set(HgPath::new(b"folder")), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
847 VisitChildrenSet::Empty |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
848 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
849 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
850 // VisitchildrensetRootfilesin |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
851 let (matcher, _) = IncludeMatcher::new( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
852 vec![IgnorePattern::new( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
853 PatternSyntax::RootFiles, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
854 b"dir/subdir", |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
855 Path::new(""), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
856 )], |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
857 "", |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
858 ) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
859 .unwrap(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
860 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
861 let mut set = HashSet::new(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
862 set.insert(HgPath::new(b"dir")); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
863 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
864 matcher.visit_children_set(HgPath::new(b"")), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
865 VisitChildrenSet::Set(set) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
866 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
867 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
868 let mut set = HashSet::new(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
869 set.insert(HgPath::new(b"subdir")); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
870 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
871 matcher.visit_children_set(HgPath::new(b"dir")), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
872 VisitChildrenSet::Set(set) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
873 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
874 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
875 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
876 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
|
877 VisitChildrenSet::This |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
878 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
879 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
880 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
|
881 VisitChildrenSet::Empty |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
882 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
883 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
884 matcher.visit_children_set(HgPath::new(b"folder")), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
885 VisitChildrenSet::Empty |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
886 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
887 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
888 // VisitchildrensetGlob |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
889 let (matcher, _) = IncludeMatcher::new( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
890 vec![IgnorePattern::new( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
891 PatternSyntax::Glob, |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
892 b"dir/z*", |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
893 Path::new(""), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
894 )], |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
895 "", |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
896 ) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
897 .unwrap(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
898 |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
899 let mut set = HashSet::new(); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
900 set.insert(HgPath::new(b"dir")); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
901 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
902 matcher.visit_children_set(HgPath::new(b"")), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
903 VisitChildrenSet::Set(set) |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
904 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
905 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
906 matcher.visit_children_set(HgPath::new(b"folder")), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
907 VisitChildrenSet::Empty |
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 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
910 matcher.visit_children_set(HgPath::new(b"dir")), |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
911 VisitChildrenSet::This |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
912 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
913 // OPT: these should probably be set(). |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
914 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
915 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
|
916 VisitChildrenSet::This |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
917 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
918 assert_eq!( |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
919 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
|
920 VisitChildrenSet::This |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
921 ); |
c697638e0e91
rust-matchers: add `IgnoreMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44521
diff
changeset
|
922 } |
44353
54d185eb24b5
rust-matchers: implement `visit_children_set` for `FileMatcher`
Raphaël Gomès <rgomes@octobus.net>
parents:
44006
diff
changeset
|
923 } |