# HG changeset patch # User Matt Mackall # Date 1273108917 18000 # Node ID 5024748392938e4fe0e1a0b08b3583e90189aeff # Parent 83968ae4aaf2a5aafa79588cd83a423bb25532d3 context: only scan unknowns when needed diff -r 83968ae4aaf2 -r 502474839293 mercurial/context.py --- a/mercurial/context.py Tue May 04 15:52:42 2010 -0500 +++ b/mercurial/context.py Wed May 05 20:21:57 2010 -0500 @@ -564,10 +564,12 @@ if user: self._user = user if changes: - self._status = list(changes[:5]) + self._status = list(changes[:4]) + self._unknown = changes[4] self._ignored = changes[5] self._clean = changes[6] else: + self._unknown = None self._ignored = None self._clean = None @@ -597,6 +599,9 @@ def _manifest(self): """generate a manifest corresponding to the working directory""" + if self._unknown is None: + self.status(unknown=True) + man = self._parents[0].manifest().copy() copied = self._repo.dirstate.copies() if len(self._parents) > 1: @@ -611,7 +616,8 @@ f = copied.get(f, f) return getman(f).flags(f) ff = self._repo.dirstate.flagfunc(cf) - modified, added, removed, deleted, unknown = self._status[:5] + modified, added, removed, deleted = self._status + unknown = self._unknown for i, l in (("a", added), ("m", modified), ("u", unknown)): for f in l: orig = copied.get(f, f) @@ -629,7 +635,7 @@ @propertycache def _status(self): - return self._repo.status(unknown=True)[:5] + return self._repo.status()[:4] @propertycache def _user(self): @@ -653,10 +659,15 @@ _status property will implicitly read the status using its default arguments.""" stat = self._repo.status(ignored=ignored, clean=clean, unknown=unknown) - self._ignored = ignored and stat[5] or None - self._clean = clean and stat[6] or None - self._status = stat[:5] - return self._status + self._unknown = self._ignored = self._clean = None + if unknown: + self._unknown = stat[4] + if ignored: + self._ignored = stat[5] + if clean: + self._clean = stat[6] + self._status = stat[:4] + return stat def manifest(self): return self._manifest @@ -678,7 +689,8 @@ def deleted(self): return self._status[3] def unknown(self): - return self._status[4] + assert self._unknown is not None # must call status first + return self._unknown def ignored(self): assert self._ignored is not None # must call status first return self._ignored diff -r 83968ae4aaf2 -r 502474839293 mercurial/merge.py --- a/mercurial/merge.py Tue May 04 15:52:42 2010 -0500 +++ b/mercurial/merge.py Wed May 05 20:21:57 2010 -0500 @@ -491,6 +491,7 @@ ### calculate phase action = [] + wc.status(unknown=True) # prime cache if not force: _checkunknown(wc, p2) if not util.checkcase(repo.path):