match: override 'visitdir' in subdirmatcher

The manifest.manifest class has a _treeinmem member than one can
manually set to True to test that the treemanifest class works as a
drop-in replacement for manifestdict (which is mostly a requirement
for treemanifest repos to work). However, it doesn't quite work at the
moment. These tests fail:

test-largefiles-misc.t
test-rebase-newancestor.t
test-subrepo.t
test-subrepo-deep-nested-change.t
test-subrepo-recursion.t

All but test-rebase-newancestor.t fail because they trigger calls to
subdirmatcher.visitdir(), which tries to access a _excluderoots field
that does not exist on the subdirmatcher. Let's fix that by overriding
visitdir() in a similar way to how matchfn is overridden, i.e. by
prepending the directory before calling the superclass method.
This commit is contained in:
Martin von Zweigbergk 2016-02-05 21:25:44 -08:00
parent cf3e9474ef
commit cc3e946787

View File

@ -381,7 +381,16 @@ class subdirmatcher(match):
self._always = any(f == path for f in matcher._files)
self._anypats = matcher._anypats
# Some information is lost in the superclass's constructor, so we
# can not accurately create the matching function for the subdirectory
# from the inputs. Instead, we override matchfn() and visitdir() to
# call the original matcher with the subdirectory path prepended.
self.matchfn = lambda fn: matcher.matchfn(self._path + "/" + fn)
def visitdir(dir):
if dir == '.':
return matcher.visitdir(self._path)
return matcher.visitdir(self._path + "/" + dir)
self.visitdir = visitdir
self._fileroots = set(self._files)
def abs(self, f):