diff -r aac054e5389b -r bd884ef2ee46 mercurial/context.py --- a/mercurial/context.py Tue Mar 07 17:49:50 2017 -0800 +++ b/mercurial/context.py Tue Mar 07 17:52:45 2017 -0800 @@ -18,7 +18,6 @@ bin, hex, modifiednodeid, - newnodeid, nullid, nullrev, short, @@ -91,14 +90,11 @@ def __iter__(self): return iter(self._manifest) - def _manifestmatches(self, match, s): - """generate a new manifest filtered by the match argument - - This method is for internal use only and mainly exists to provide an - object oriented way for other contexts to customize the manifest - generation. - """ - return self.manifest().matches(match) + def _buildstatusmanifest(self, status): + """Builds a manifest that includes the given status results, if this is + a working copy context. For non-working copy contexts, it just returns + the normal manifest.""" + return self.manifest() def _matchstatus(self, other, match): """return match.always if match is none @@ -119,17 +115,17 @@ # delta application. mf2 = None if self.rev() is not None and self.rev() < other.rev(): - mf2 = self._manifestmatches(match, s) - mf1 = other._manifestmatches(match, s) + mf2 = self._buildstatusmanifest(s) + mf1 = other._buildstatusmanifest(s) if mf2 is None: - mf2 = self._manifestmatches(match, s) + mf2 = self._buildstatusmanifest(s) modified, added = [], [] removed = [] clean = [] deleted, unknown, ignored = s.deleted, s.unknown, s.ignored deletedset = set(deleted) - d = mf1.diff(mf2, clean=listclean) + d = mf1.diff(mf2, match=match, clean=listclean) for fn, value in d.iteritems(): if fn in deletedset: continue @@ -156,8 +152,10 @@ if removed: # need to filter files if they are already reported as removed - unknown = [fn for fn in unknown if fn not in mf1] - ignored = [fn for fn in ignored if fn not in mf1] + unknown = [fn for fn in unknown if fn not in mf1 and + (not match or match(fn))] + ignored = [fn for fn in ignored if fn not in mf1 and + (not match or match(fn))] # if they're deleted, don't report them as removed removed = [fn for fn in removed if fn not in deletedset] @@ -1581,22 +1579,6 @@ pass return modified, fixup - def _manifestmatches(self, match, s): - """Slow path for workingctx - - The fast path is when we compare the working directory to its parent - which means this function is comparing with a non-parent; therefore we - need to build a manifest and return what matches. - """ - mf = self._repo['.']._manifestmatches(match, s) - for f in s.modified + s.added: - mf[f] = newnodeid - mf.setflag(f, self.flags(f)) - for f in s.removed: - if f in mf: - del mf[f] - return mf - def _dirstatestatus(self, match=None, ignored=False, clean=False, unknown=False): '''Gets the status from the dirstate -- internal use only.'''