# HG changeset patch # User Sean Farley # Date 2014-04-24 13:34:44 # Node ID d19f491e5d5b19d0bc3ee81cb8b9df09c772a1b2 # Parent e18ef2e112198ab3475e84399bf965191d799708 workingctx: use inheritance for _buildstatus while keeping the fastpath This patch maintains the fast path for workingctx which is to not build a manifest if the working directory is being compared to its parent since, in this case, we can just copy the parent manifest. diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -1327,6 +1327,21 @@ class workingctx(committablectx): return [modified, added, removed, deleted, unknown, ignored, clean] + def _buildstatus(self, other, s, match, listignored, listclean, + listunknown): + """build a status with respect to another context + + This includes logic for maintaining the fast path of status when + comparing the working directory against its parent, which is to skip + building a new manifest if self (working directory) is not comparing + against its parent (repo['.']). + """ + if other != self._repo['.']: + s = super(workingctx, self)._buildstatus(other, s, match, + listignored, listclean, + listunknown) + return s + def status(self, ignored=False, clean=False, unknown=False, match=None): """Explicit status query Unless this method is used to query the working copy status, the diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1551,11 +1551,8 @@ class localrepository(object): r = [[], [], [], [], [], [], []] r = ctx2._prestatus(ctx1, r, match, listignored, listclean, listunknown) - - if not parentworking: - r = ctx2._buildstatus(ctx1, r, match, listignored, listclean, - listunknown) - + r = ctx2._buildstatus(ctx1, r, match, listignored, listclean, + listunknown) r = ctx2._poststatus(ctx1, r, match, listignored, listclean, listunknown)