fakedirstatewritetime.py
99 lines
| 3.0 KiB
| text/x-python
|
PythonLexer
/ tests / fakedirstatewritetime.py
FUJIWARA Katsunori
|
r25752 | # extension to emulate invoking 'dirstate.write()' at the time | ||
# specified by '[fakedirstatewritetime] fakenow', only when | ||||
# 'dirstate.write()' is invoked via functions below: | ||||
# | ||||
Siddharth Agarwal
|
r32812 | # - 'workingctx._poststatusfixup()' (= 'repo.status()') | ||
FUJIWARA Katsunori
|
r25752 | # - 'committablectx.markcommitted()' | ||
Gregory Szorc
|
r27283 | |||
from mercurial import ( | ||||
context, | ||||
r48295 | dirstatemap as dirstatemapmod, | |||
Gregory Szorc
|
r27283 | extensions, | ||
Yuya Nishihara
|
r32372 | policy, | ||
Boris Feld
|
r34772 | registrar, | ||
Gregory Szorc
|
r27283 | ) | ||
Simon Sapin
|
r49079 | from mercurial.dirstateutils import timestamp | ||
Boris Feld
|
r36625 | from mercurial.utils import dateutil | ||
FUJIWARA Katsunori
|
r25752 | |||
Raphaël Gomès
|
r42490 | try: | ||
from mercurial import rustext | ||||
Augie Fackler
|
r43346 | |||
Raphaël Gomès
|
r42490 | rustext.__name__ # force actual import (see hgdemandimport) | ||
except ImportError: | ||||
rustext = None | ||||
Boris Feld
|
r34772 | configtable = {} | ||
configitem = registrar.configitem(configtable) | ||||
Augie Fackler
|
r43346 | configitem( | ||
Augie Fackler
|
r46554 | b'fakedirstatewritetime', | ||
b'fakenow', | ||||
default=None, | ||||
Boris Feld
|
r34772 | ) | ||
Augie Fackler
|
r43906 | parsers = policy.importmod('parsers') | ||
Simon Sapin
|
r48832 | has_rust_dirstate = policy.importrust('dirstate') is not None | ||
Yuya Nishihara
|
r32372 | |||
Augie Fackler
|
r43346 | |||
r49221 | def pack_dirstate(orig, dmap, copymap, pl): | |||
return orig(dmap, copymap, pl) | ||||
FUJIWARA Katsunori
|
r25752 | |||
Augie Fackler
|
r43346 | |||
FUJIWARA Katsunori
|
r25752 | def fakewrite(ui, func): | ||
# fake "now" of 'pack_dirstate' only if it is invoked while 'func' | ||||
Pulkit Goyal
|
r36342 | fakenow = ui.config(b'fakedirstatewritetime', b'fakenow') | ||
FUJIWARA Katsunori
|
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 | ||||
Boris Feld
|
r36625 | fakenow = dateutil.parsedate(fakenow, [b'%Y%m%d%H%M'])[0] | ||
r49227 | fakenow = timestamp.timestamp((fakenow, 0, False)) | |||
FUJIWARA Katsunori
|
r25752 | |||
Simon Sapin
|
r48832 | if has_rust_dirstate: | ||
Raphaël Gomès
|
r42992 | # The Rust implementation does not use public parse/pack dirstate | ||
# to prevent conversion round-trips | ||||
r48295 | orig_dirstatemap_write = dirstatemapmod.dirstatemap.write | |||
r49221 | wrapper = lambda self, tr, st: orig_dirstatemap_write(self, tr, st) | |||
r48295 | dirstatemapmod.dirstatemap.write = wrapper | |||
Raphaël Gomès
|
r42490 | |||
r49202 | orig_get_fs_now = timestamp.get_fs_now | |||
r49221 | wrapper = lambda *args: pack_dirstate(orig_pack_dirstate, *args) | |||
FUJIWARA Katsunori
|
r25752 | |||
Raphaël Gomès
|
r42992 | orig_module = parsers | ||
orig_pack_dirstate = parsers.pack_dirstate | ||||
Raphaël Gomès
|
r42490 | orig_module.pack_dirstate = wrapper | ||
r49221 | timestamp.get_fs_now = ( | |||
lambda *args: fakenow | ||||
) # XXX useless for this purpose now | ||||
FUJIWARA Katsunori
|
r25752 | try: | ||
return func() | ||||
finally: | ||||
Raphaël Gomès
|
r42490 | orig_module.pack_dirstate = orig_pack_dirstate | ||
r49202 | timestamp.get_fs_now = orig_get_fs_now | |||
Simon Sapin
|
r48832 | if has_rust_dirstate: | ||
r48295 | dirstatemapmod.dirstatemap.write = orig_dirstatemap_write | |||
FUJIWARA Katsunori
|
r25752 | |||
Augie Fackler
|
r43346 | |||
Siddharth Agarwal
|
r32813 | def _poststatusfixup(orig, workingctx, status, fixup): | ||
FUJIWARA Katsunori
|
r25752 | ui = workingctx.repo().ui | ||
Augie Fackler
|
r43346 | return fakewrite(ui, lambda: orig(workingctx, status, fixup)) | ||
FUJIWARA Katsunori
|
r25752 | |||
def markcommitted(orig, committablectx, node): | ||||
ui = committablectx.repo().ui | ||||
Augie Fackler
|
r43346 | return fakewrite(ui, lambda: orig(committablectx, node)) | ||
FUJIWARA Katsunori
|
r25752 | |||
def extsetup(ui): | ||||
Augie Fackler
|
r43346 | extensions.wrapfunction( | ||
context.workingctx, '_poststatusfixup', _poststatusfixup | ||||
) | ||||
extensions.wrapfunction(context.workingctx, 'markcommitted', markcommitted) | ||||