diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -71,19 +71,7 @@ class basectx(object): object oriented way for other contexts to customize the manifest generation. """ - if match.always(): - return self.manifest().copy() - - files = match.files() - if (match.matchfn == match.exact or - (not match.anypats() and util.all(fn in self for fn in files))): - return self.manifest().intersectfiles(files) - - mf = self.manifest().copy() - for fn in mf.keys(): - if not match(fn): - del mf[fn] - return mf + return self.manifest().matches(match) def _matchstatus(self, other, match): """return match.always if match is none diff --git a/mercurial/manifest.py b/mercurial/manifest.py --- a/mercurial/manifest.py +++ b/mercurial/manifest.py @@ -39,6 +39,22 @@ class manifestdict(dict): ret._flags[fn] = flags return ret + def matches(self, match): + '''generate a new manifest filtered by the match argument''' + if match.always(): + return self.copy() + + files = match.files() + if (match.matchfn == match.exact or + (not match.anypats() and util.all(fn in self for fn in files))): + return self.intersectfiles(files) + + mf = self.copy() + for fn in mf.keys(): + if not match(fn): + del mf[fn] + return mf + def diff(self, m2): '''Finds changes between the current manifest and m2. The result is returned as a dict with filename as key and values of the form