fakedirstatewritetime.py
106 lines
| 3.1 KiB
| text/x-python
|
PythonLexer
/ tests / fakedirstatewritetime.py
|
r25752 | # extension to emulate invoking 'dirstate.write()' at the time | ||
# specified by '[fakedirstatewritetime] fakenow', only when | ||||
# 'dirstate.write()' is invoked via functions below: | ||||
# | ||||
|
r32812 | # - 'workingctx._poststatusfixup()' (= 'repo.status()') | ||
|
r25752 | # - 'committablectx.markcommitted()' | ||
|
r27283 | from __future__ import absolute_import | ||
from mercurial import ( | ||||
context, | ||||
dirstate, | ||||
r48295 | dirstatemap as dirstatemapmod, | |||
|
r27283 | extensions, | ||
|
r32372 | policy, | ||
|
r34772 | registrar, | ||
|
r27283 | ) | ||
|
r36625 | from mercurial.utils import dateutil | ||
|
r25752 | |||
|
r42490 | try: | ||
from mercurial import rustext | ||||
|
r43346 | |||
|
r42490 | rustext.__name__ # force actual import (see hgdemandimport) | ||
except ImportError: | ||||
rustext = None | ||||
|
r34772 | configtable = {} | ||
configitem = registrar.configitem(configtable) | ||||
|
r43346 | configitem( | ||
|
r46554 | b'fakedirstatewritetime', | ||
b'fakenow', | ||||
default=None, | ||||
|
r34772 | ) | ||
|
r43906 | parsers = policy.importmod('parsers') | ||
rustmod = policy.importrust('parsers') | ||||
|
r32372 | |||
|
r43346 | |||
|
r25752 | def pack_dirstate(fakenow, orig, dmap, copymap, pl, now): | ||
# execute what original parsers.pack_dirstate should do actually | ||||
# for consistency | ||||
actualnow = int(now) | ||||
|
r36345 | for f, e in dmap.items(): | ||
r48332 | if e.need_delay(actualnow): | |||
r48469 | e.set_possibly_dirty() | |||
|
r25752 | |||
return orig(dmap, copymap, pl, fakenow) | ||||
|
r43346 | |||
|
r25752 | def fakewrite(ui, func): | ||
# fake "now" of 'pack_dirstate' only if it is invoked while 'func' | ||||
|
r36342 | fakenow = ui.config(b'fakedirstatewritetime', b'fakenow') | ||
|
r25752 | 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() | ||||
# parsing 'fakenow' in YYYYmmddHHMM format makes comparison between | ||||
# 'fakenow' value and 'touch -t YYYYmmddHHMM' argument easy | ||||
|
r36625 | fakenow = dateutil.parsedate(fakenow, [b'%Y%m%d%H%M'])[0] | ||
|
r25752 | |||
|
r42992 | if rustmod is not None: | ||
# The Rust implementation does not use public parse/pack dirstate | ||||
# to prevent conversion round-trips | ||||
r48295 | orig_dirstatemap_write = dirstatemapmod.dirstatemap.write | |||
|
r48474 | wrapper = lambda self, tr, st, now: orig_dirstatemap_write( | ||
self, tr, st, fakenow | ||||
|
r43346 | ) | ||
r48295 | dirstatemapmod.dirstatemap.write = wrapper | |||
|
r42490 | |||
|
r26634 | orig_dirstate_getfsnow = dirstate._getfsnow | ||
|
r25752 | wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args) | ||
|
r42992 | orig_module = parsers | ||
orig_pack_dirstate = parsers.pack_dirstate | ||||
|
r42490 | orig_module.pack_dirstate = wrapper | ||
|
r26634 | dirstate._getfsnow = lambda *args: fakenow | ||
|
r25752 | try: | ||
return func() | ||||
finally: | ||||
|
r42490 | orig_module.pack_dirstate = orig_pack_dirstate | ||
|
r26634 | dirstate._getfsnow = orig_dirstate_getfsnow | ||
|
r42992 | if rustmod is not None: | ||
r48295 | dirstatemapmod.dirstatemap.write = orig_dirstatemap_write | |||
|
r25752 | |||
|
r43346 | |||
|
r32813 | def _poststatusfixup(orig, workingctx, status, fixup): | ||
|
r25752 | ui = workingctx.repo().ui | ||
|
r43346 | return fakewrite(ui, lambda: orig(workingctx, status, fixup)) | ||
|
r25752 | |||
def markcommitted(orig, committablectx, node): | ||||
ui = committablectx.repo().ui | ||||
|
r43346 | return fakewrite(ui, lambda: orig(committablectx, node)) | ||
|
r25752 | |||
def extsetup(ui): | ||||
|
r43346 | extensions.wrapfunction( | ||
context.workingctx, '_poststatusfixup', _poststatusfixup | ||||
) | ||||
extensions.wrapfunction(context.workingctx, 'markcommitted', markcommitted) | ||||