diff --git a/mercurial/store.py b/mercurial/store.py --- a/mercurial/store.py +++ b/mercurial/store.py @@ -374,17 +374,21 @@ l.sort() return l - def datafiles(self): + def datafiles(self, matcher=None): return self._walk('data', True) + self._walk('meta', True) def topfiles(self): # yield manifest before changelog return reversed(self._walk('', False)) - def walk(self): - '''yields (unencoded, encoded, size)''' + def walk(self, matcher=None): + '''yields (unencoded, encoded, size) + + if a matcher is passed, storage files of only those tracked paths + are passed with matches the matcher + ''' # yield data files first - for x in self.datafiles(): + for x in self.datafiles(matcher): yield x for x in self.topfiles(): yield x @@ -422,12 +426,14 @@ self.vfs = vfsmod.filtervfs(vfs, encodefilename) self.opener = self.vfs - def datafiles(self): + def datafiles(self, matcher=None): for a, b, size in super(encodedstore, self).datafiles(): try: a = decodefilename(a) except KeyError: a = None + if matcher and not matcher(_gettrackedpath(a)): + continue yield a, b, size def join(self, f): @@ -551,8 +557,10 @@ def getsize(self, path): return self.rawvfs.stat(path).st_size - def datafiles(self): + def datafiles(self, matcher=None): for f in sorted(self.fncache): + if matcher and not matcher(_gettrackedpath(f)): + continue ef = self.encode(f) try: yield f, ef, self.getsize(ef)