diff --git a/hgext3rd/perftweaks.py b/hgext3rd/perftweaks.py --- a/hgext3rd/perftweaks.py +++ b/hgext3rd/perftweaks.py @@ -19,6 +19,7 @@ dispatch, extensions, merge, + namespaces, phases, revlog, scmutil, @@ -64,10 +65,30 @@ except KeyError: pass + wrapfunction(namespaces.namespaces, 'singlenode', _singlenode) + def reposetup(ui, repo): if repo.local() is not None: _preloadrevs(repo) +def _singlenode(orig, self, repo, name): + """Skips reading branches namespace if unnecessary""" + # developer config: perftweaks.disableresolvingbranches + if not repo.ui.configbool('perftweaks', 'disableresolvingbranches'): + return orig(self, repo, name) + + # If branches are disabled, only resolve the 'default' branch. Loading + # 'branches' is O(len(changelog)) time complexity because it calls + # headrevs() which scans the entire changelog. + names = self._names + namesbak = names.copy() + if name != 'default' and 'branches' in names: + del names['branches'] + try: + return orig(self, repo, name) + finally: + self.names = namesbak + def _readtagcache(orig, ui, repo): """Disables reading tags if the repo is known to not contain any.""" if ui.configbool('perftweaks', 'disabletags'): diff --git a/tests/test-perftweaks.t b/tests/test-perftweaks.t --- a/tests/test-perftweaks.t +++ b/tests/test-perftweaks.t @@ -52,6 +52,28 @@ $ cd .. #endif +Test disabling resolving non-default branch names + + $ hg init branchresolve + $ cd branchresolve + $ echo 1 >> A + $ hg commit -A A -m 1 + $ hg branch foo + marked working directory as branch foo + (branches are permanent and global, did you want a bookmark?) + $ echo 2 >> A + $ hg commit -A A -m 2 + $ hg log -r default -T '{desc}\n' + 1 + $ hg log -r foo -T '{desc}\n' + 2 + $ hg log -r default -T '{desc}\n' --config perftweaks.disableresolvingbranches=1 + 1 + $ hg log -r foo -T '{desc}\n' --config perftweaks.disableresolvingbranches=1 + abort: unknown revision 'foo'! + [255] + $ cd .. + Test disabling the branchcache $ hg init branchcache $ cd branchcache