sapling/eden/scm/tests/fakedirstatewritetime.py
Adam Simpkins 0bc787c4c0 remove the mercurial.policy module
Summary:
This module previously used to handle deciding how a particular module should
be imported if it had multiple versions (e.g., pure Python or native).
However, as of D18819680 it was changed to always import the native C version.

Lets go ahead and remove it entirely now.  Using `policy.importmod` simply
makes it harder for type checkers to figure out the actual module that will be
used.

The only functionality that `policy.importmod()` still provided was verifying
that the module contained a "version" field that looked like what was
expected.  In practice these version numbers are not bumped often, so this
doesn't really seem to provide much value in checking that we imported the
correct version that we expected to be shipped with this release.

Reviewed By: xavierd

Differential Revision: D19958227

fbshipit-source-id: 05f1d027d0a41cf99c4aa93cb84a51e830305077
2020-02-21 13:54:19 -08:00

98 lines
2.9 KiB
Python

# extension to emulate invoking 'dirstate.write()' at the time
# specified by '[fakedirstatewritetime] fakenow', only when
# 'dirstate.write()' is invoked via functions below:
#
# - 'workingctx._poststatusfixup()' (= 'repo.status()')
# - 'committablectx.markcommitted()'
from __future__ import absolute_import
from edenscm.mercurial import (
context,
dirstate,
extensions,
pycompat,
registrar,
treedirstate,
treestate,
util,
)
from edenscmnative import parsers
configtable = {}
configitem = registrar.configitem(configtable)
configitem("fakedirstatewritetime", "fakenow", default=None)
def pack_dirstate(fakenow, orig, dmap, copymap, pl, now):
# execute what original parsers.pack_dirstate should do actually
# for consistency
actualnow = int(now)
for f, e in pycompat.iteritems(dmap):
if e[0] == "n" and e[3] == actualnow:
e = parsers.dirstatetuple(e[0], e[1], e[2], -1)
dmap[f] = e
return orig(dmap, copymap, pl, fakenow)
def fakewrite(ui, func):
# fake "now" of 'pack_dirstate' only if it is invoked while 'func'
fakenow = ui.config("fakedirstatewritetime", "fakenow")
if not fakenow:
# Execute original one, if fakenow isn't configured. This is
# useful to prevent subrepos from executing replaced one,
# because replacing 'parsers.pack_dirstate' is also effective
# in subrepos.
return func()
fakenow = util.parsedate(fakenow)[0]
orig_pack_dirstate = parsers.pack_dirstate
orig_dirstate_getfsnow = dirstate._getfsnow
wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args)
parsers.pack_dirstate = wrapper
dirstate._getfsnow = lambda *args: fakenow
try:
return func()
finally:
parsers.pack_dirstate = orig_pack_dirstate
dirstate._getfsnow = orig_dirstate_getfsnow
def _poststatusfixup(orig, self, status, workingctx, oldid):
ui = workingctx.repo().ui
return fakewrite(ui, lambda: orig(self, status, workingctx, oldid))
def markcommitted(orig, committablectx, node):
ui = committablectx.repo().ui
return fakewrite(ui, lambda: orig(committablectx, node))
def treedirstatewrite(orig, self, st, now):
ui = self._ui
fakenow = ui.config("fakedirstatewritetime", "fakenow")
if fakenow:
now = util.parsedate(fakenow)[0]
return orig(self, st, now)
def treestatewrite(orig, self, st, now):
ui = self._ui
fakenow = ui.config("fakedirstatewritetime", "fakenow")
if fakenow:
now = util.parsedate(fakenow)[0]
return orig(self, st, now)
def extsetup(ui):
extensions.wrapfunction(dirstate.dirstate, "_poststatusfixup", _poststatusfixup)
extensions.wrapfunction(context.committablectx, "markcommitted", markcommitted)
extensions.wrapfunction(treedirstate.treedirstatemap, "write", treedirstatewrite)
extensions.wrapfunction(treestate.treestatemap, "write", treestatewrite)