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