# HG changeset patch # User Martin von Zweigbergk # Date 2014-10-23 04:38:30 # Node ID 0cc283f446559bd61c8651481ae128c97bd3ed0d # Parent dd3f857598a0625305b106323544df425efeaf84 manifest: add matches() method Move the code in context._manifestmatches() into a new manifest.matches(). It's a natural place for the code to live and it allows other callers to easily use it. It should also make it easier to optimize the new method in alternative implementations of the manifest (same reasoning as with manifest.diff()). 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