match: introduce nevermatcher for when no ignore files are present
952017471f93 introduced a deterministic `__repr__` for ignores. However, it
didn't account for when ignore was `util.never`. This broke fsmonitor's ignore
change detection -- with an empty hgignore, it would kick in all the time.
Introduce `nevermatcher` and switch to it. This neatly parallels
`alwaysmatcher`.
--- a/mercurial/dirstate.py Wed May 31 11:41:54 2017 -0700
+++ b/mercurial/dirstate.py Thu Jun 01 00:40:52 2017 -0700
@@ -232,7 +232,7 @@
def _ignore(self):
files = self._ignorefiles()
if not files:
- return util.never
+ return matchmod.never(self._root, '')
pats = ['include:%s' % f for f in files]
return matchmod.match(self._root, '', [], pats, warn=self._ui.warn)
--- a/mercurial/match.py Wed May 31 11:41:54 2017 -0700
+++ b/mercurial/match.py Thu Jun 01 00:40:52 2017 -0700
@@ -175,6 +175,9 @@
def always(root, cwd):
return alwaysmatcher(root, cwd)
+def never(root, cwd):
+ return nevermatcher(root, cwd)
+
def badmatch(match, badfn):
"""Make a copy of the given matcher, replacing its bad method with the given
one.
@@ -339,6 +342,25 @@
def __repr__(self):
return '<alwaysmatcher>'
+class nevermatcher(basematcher):
+ '''Matches nothing.'''
+
+ def __init__(self, root, cwd, badfn=None, relativeuipath=False):
+ super(nevermatcher, self).__init__(root, cwd, badfn,
+ relativeuipath=relativeuipath)
+
+ def always(self):
+ return False
+
+ def matchfn(self, f):
+ return False
+
+ def visitdir(self, dir):
+ return False
+
+ def __repr__(self):
+ return '<nevermatcher>'
+
class patternmatcher(basematcher):
def __init__(self, root, cwd, kindpats, ctx=None, listsubrepos=False,
--- a/tests/test-hgignore.t Wed May 31 11:41:54 2017 -0700
+++ b/tests/test-hgignore.t Thu Jun 01 00:40:52 2017 -0700
@@ -1,6 +1,10 @@
$ hg init ignorerepo
$ cd ignorerepo
+debugignore with no hgignore should be deterministic:
+ $ hg debugignore
+ <nevermatcher>
+
Issue562: .hgignore requires newline at end:
$ touch foo