diff --git a/hgext3rd/treedirstate.py b/hgext3rd/treedirstate.py --- a/hgext3rd/treedirstate.py +++ b/hgext3rd/treedirstate.py @@ -6,6 +6,7 @@ from __future__ import absolute_import from mercurial import ( + commands, dirstate, encoding, error, @@ -32,17 +33,22 @@ dirstateheader = b'########################treedirstate####' treedirstateversion = 1 treefileprefix = 'dirstate.tree.' -useinnewrepos = True + +configtable = {} +configitem = registrar.configitem(configtable) +configitem('treedirstate', 'useinnewrepos', default=False) +configitem('treedirstate', 'upgradeonpull', default=False) +configitem('treedirstate', 'downgradeonpull', default=False) # Sentinel length value for when a nonnormalset or otherparentset is absent. setabsent = 0xffffffff # Minimum size the treedirstate file can be before auto-repacking. -minrepackthreshold = 1024 * 1024 +configitem('treedirstate', 'minrepackthreshold', default=1024 * 1024) # Number of times the treedirstate file can grow by, compared to its initial # size, before auto-repacking. -repackfactor = 3 +configitem('treedirstate', 'repackfactor', 3) class _reader(object): def __init__(self, data, offset): @@ -419,6 +425,9 @@ else: def nonnormadd(f): pass + repackfactor = self._ui.configint('treedirstate', 'repackfactor') + minrepackthreshold = self._ui.configint('treedirstate', + 'minrepackthreshold') repackthreshold = max(self._packedsize * repackfactor, minrepackthreshold) if self._rmap.storeoffset() > repackthreshold: @@ -637,6 +646,19 @@ reqs.add('treedirstate') return reqs +def wrappull(orig, ui, repo, *args, **kwargs): + if (ui.configbool('treedirstate', 'downgradeonpull') and + istreedirstate(repo)): + ui.status(_('disabling treedirstate...\n')) + downgrade(ui, repo) + elif (ui.configbool('treedirstate', 'upgradeonpull') and + not istreedirstate(repo)): + ui.status(_('migrating your repo to treedirstate which will make your ' + 'hg commands faster...\n')) + upgrade(ui, repo) + + return orig(ui, repo, *args, **kwargs) + def featuresetup(ui, supported): supported |= {'treedirstate'} @@ -646,6 +668,7 @@ ui.warn(_("this version of Mercurial doesn't support treedirstate\n")) return + useinnewrepos = ui.configbool('treedirstate', 'useinnewrepos') if useinnewrepos and util.safehasattr(localrepo, 'newreporequirements'): extensions.wrapfunction(localrepo, 'newreporequirements', wrapnewreporequirements) @@ -655,6 +678,7 @@ wrapdirstate) extensions.wrapfunction(scmutil, 'casecollisionauditor', wrapcca) extensions.wrapfunction(localrepo.localrepository, 'close', wrapclose) + extensions.wrapcommand(commands.table, 'pull', wrappull) def reposetup(ui, repo): ui.setconfig('treedirstate', 'enabled', istreedirstate(repo))