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