fakedirstatewritetime.py
98 lines
| 3.3 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 __future__ import absolute_import | ||
from mercurial import ( | ||||
context, | ||||
dirstate, | ||||
extensions, | ||||
Yuya Nishihara
|
r32372 | policy, | ||
Boris Feld
|
r34772 | registrar, | ||
Gregory Szorc
|
r27283 | ) | ||
Boris Feld
|
r36625 | from mercurial.utils import dateutil | ||
FUJIWARA Katsunori
|
r25752 | |||
Raphaël Gomès
|
r42490 | try: | ||
from mercurial import rustext | ||||
rustext.__name__ # force actual import (see hgdemandimport) | ||||
except ImportError: | ||||
rustext = None | ||||
Boris Feld
|
r34772 | configtable = {} | ||
configitem = registrar.configitem(configtable) | ||||
Pulkit Goyal
|
r36342 | configitem(b'fakedirstatewritetime', b'fakenow', | ||
Boris Feld
|
r34772 | default=None, | ||
) | ||||
Yuya Nishihara
|
r32372 | parsers = policy.importmod(r'parsers') | ||
Raphaël Gomès
|
r42992 | rustmod = policy.importrust(r'parsers') | ||
Yuya Nishihara
|
r32372 | |||
FUJIWARA Katsunori
|
r25752 | def pack_dirstate(fakenow, orig, dmap, copymap, pl, now): | ||
# execute what original parsers.pack_dirstate should do actually | ||||
# for consistency | ||||
actualnow = int(now) | ||||
Pulkit Goyal
|
r36345 | for f, e in dmap.items(): | ||
FUJIWARA Katsunori
|
r25752 | 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' | ||||
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] | ||
FUJIWARA Katsunori
|
r25752 | |||
Raphaël Gomès
|
r42992 | if rustmod is not None: | ||
# The Rust implementation does not use public parse/pack dirstate | ||||
# to prevent conversion round-trips | ||||
orig_dirstatemap_write = dirstate.dirstatemap.write | ||||
wrapper = lambda self, st, now: orig_dirstatemap_write(self, | ||||
st, | ||||
fakenow) | ||||
dirstate.dirstatemap.write = wrapper | ||||
Raphaël Gomès
|
r42490 | |||
FUJIWARA Katsunori
|
r26634 | orig_dirstate_getfsnow = dirstate._getfsnow | ||
FUJIWARA Katsunori
|
r25752 | wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args) | ||
Raphaël Gomès
|
r42992 | orig_module = parsers | ||
orig_pack_dirstate = parsers.pack_dirstate | ||||
Raphaël Gomès
|
r42490 | orig_module.pack_dirstate = wrapper | ||
FUJIWARA Katsunori
|
r26634 | dirstate._getfsnow = lambda *args: fakenow | ||
FUJIWARA Katsunori
|
r25752 | try: | ||
return func() | ||||
finally: | ||||
Raphaël Gomès
|
r42490 | orig_module.pack_dirstate = orig_pack_dirstate | ||
FUJIWARA Katsunori
|
r26634 | dirstate._getfsnow = orig_dirstate_getfsnow | ||
Raphaël Gomès
|
r42992 | if rustmod is not None: | ||
dirstate.dirstatemap.write = orig_dirstatemap_write | ||||
FUJIWARA Katsunori
|
r25752 | |||
Siddharth Agarwal
|
r32813 | def _poststatusfixup(orig, workingctx, status, fixup): | ||
FUJIWARA Katsunori
|
r25752 | ui = workingctx.repo().ui | ||
Siddharth Agarwal
|
r32813 | return fakewrite(ui, lambda : orig(workingctx, status, fixup)) | ||
FUJIWARA Katsunori
|
r25752 | |||
def markcommitted(orig, committablectx, node): | ||||
ui = committablectx.repo().ui | ||||
return fakewrite(ui, lambda : orig(committablectx, node)) | ||||
def extsetup(ui): | ||||
Siddharth Agarwal
|
r32812 | extensions.wrapfunction(context.workingctx, '_poststatusfixup', | ||
_poststatusfixup) | ||||
Martin von Zweigbergk
|
r42481 | extensions.wrapfunction(context.workingctx, 'markcommitted', | ||
FUJIWARA Katsunori
|
r25752 | markcommitted) | ||