rust-dirstate: add support for nevermatcher
authorRaphaël Gomès <rgomes@octobus.net>
Wed, 08 Jun 2022 18:18:19 +0200
changeset 49351 97dcd6906e6f
parent 49350 0b00998e336a
child 49353 fa8d974284f8
rust-dirstate: add support for nevermatcher This is in case this ever comes up, it's very easy to support, so might as well do it.
mercurial/dirstate.py
rust/hg-core/src/matchers.rs
rust/hg-cpython/src/dirstate/status.rs
--- a/mercurial/dirstate.py	Wed Jun 08 18:12:55 2022 +0200
+++ b/mercurial/dirstate.py	Wed Jun 08 18:18:19 2022 +0200
@@ -1248,6 +1248,7 @@
             matchmod.exactmatcher,
             matchmod.includematcher,
             matchmod.intersectionmatcher,
+            matchmod.nevermatcher,
             matchmod.unionmatcher,
         )
 
--- a/rust/hg-core/src/matchers.rs	Wed Jun 08 18:12:55 2022 +0200
+++ b/rust/hg-core/src/matchers.rs	Wed Jun 08 18:18:19 2022 +0200
@@ -134,6 +134,31 @@
     }
 }
 
+/// Matches nothing.
+#[derive(Debug)]
+pub struct NeverMatcher;
+
+impl Matcher for NeverMatcher {
+    fn file_set(&self) -> Option<&HashSet<HgPathBuf>> {
+        None
+    }
+    fn exact_match(&self, _filename: &HgPath) -> bool {
+        false
+    }
+    fn matches(&self, _filename: &HgPath) -> bool {
+        false
+    }
+    fn visit_children_set(&self, _directory: &HgPath) -> VisitChildrenSet {
+        VisitChildrenSet::Empty
+    }
+    fn matches_everything(&self) -> bool {
+        false
+    }
+    fn is_exact(&self) -> bool {
+        true
+    }
+}
+
 /// Matches the input files exactly. They are interpreted as paths, not
 /// patterns.
 ///
--- a/rust/hg-cpython/src/dirstate/status.rs	Wed Jun 08 18:12:55 2022 +0200
+++ b/rust/hg-cpython/src/dirstate/status.rs	Wed Jun 08 18:18:19 2022 +0200
@@ -15,7 +15,7 @@
     PyResult, PyTuple, Python, PythonObject, ToPyObject,
 };
 use hg::dirstate::status::StatusPath;
-use hg::matchers::{Matcher, UnionMatcher, IntersectionMatcher};
+use hg::matchers::{IntersectionMatcher, Matcher, NeverMatcher, UnionMatcher};
 use hg::{
     matchers::{AlwaysMatcher, FileMatcher, IncludeMatcher},
     parse_pattern_syntax,
@@ -158,6 +158,7 @@
 ) -> PyResult<Box<dyn Matcher + Sync>> {
     match matcher.get_type(py).name(py).borrow() {
         "alwaysmatcher" => Ok(Box::new(AlwaysMatcher)),
+        "nevermatcher" => Ok(Box::new(NeverMatcher)),
         "exactmatcher" => {
             let files = matcher.call_method(
                 py,