# HG changeset patch # User Martin von Zweigbergk # Date 2018-09-27 06:09:28 # Node ID 43d3b09b3e5ae70f73fae7bb425b9e79d0dbedfb # Parent 3d35304bd09bf19e7e08d253a915e400f2d25591 repo: move unfiltered-repo optimization to workingctx localrepo.__getitem__ special-cased lookup of the working copy parent to avoid looking up obsmarkers. I think the reason for that code (which I once wrote myself) was to make `hg commit` not load obsmarkers, which it would otherwise do via ctx.p1() in localrepo.commitctx(). That had the somewhat unfortunate consequence of making lookup of an unrelated binary nodeid load the dirstate. Now that changectx's constructor is dumb, we can let workingctx._parents() have the opmtimization instead. This affects two tests, because they no longer end up loading the dirstate and their "warning: ignoring unknown working parent ..." messages therefore go way. Differential Revision: https://phab.mercurial-scm.org/D4828 diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -1241,7 +1241,9 @@ class workingctx(committablectx): p = self._repo.dirstate.parents() if p[1] == nullid: p = p[:-1] - return [self._repo[x] for x in p] + # use unfiltered repo to delay/avoid loading obsmarkers + unfi = self._repo.unfiltered() + return [changectx(self._repo, unfi.changelog.rev(n), n) for n in p] def _fileinfo(self, path): # populate __dict__['_manifest'] as workingctx has no _manifestdelta diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1228,8 +1228,7 @@ class localrepository(object): node = self.changelog.tip() rev = self.changelog.rev(node) return context.changectx(self, rev, node) - elif (changeid == '.' - or self.local() and changeid == self.dirstate.p1()): + elif changeid == '.': # this is a hack to delay/avoid loading obsmarkers # when we know that '.' won't be hidden node = self.dirstate.p1() diff --git a/tests/test-histedit-obsolete.t b/tests/test-histedit-obsolete.t --- a/tests/test-histedit-obsolete.t +++ b/tests/test-histedit-obsolete.t @@ -71,7 +71,6 @@ With some node gone missing during the e $ hg commit --amend -X . -m XXXXXX $ hg commit --amend -X . -m b2 $ hg --hidden --config extensions.strip= strip 'desc(XXXXXX)' --no-backup - warning: ignoring unknown working parent aba7da937030! $ hg histedit --continue $ hg log -G @ 8:273c1f3b8626 c diff --git a/tests/test-single-head.t b/tests/test-single-head.t --- a/tests/test-single-head.t +++ b/tests/test-single-head.t @@ -200,5 +200,4 @@ actual stripping $ hg strip --config extensions.strip= --rev 'desc("c_dH0")' saved backup bundle to $TESTTMP/client/.hg/strip-backup/fe47ea669cea-a41bf5a9-backup.hg - warning: ignoring unknown working parent 49003e504178!