tests/fakedirstatewritetime.py
changeset 43076 2372284d9457
parent 42747 760a7851e9ba
child 43506 9f70512ae2cf
equal deleted inserted replaced
43075:57875cf423c9 43076:2372284d9457
    16 )
    16 )
    17 from mercurial.utils import dateutil
    17 from mercurial.utils import dateutil
    18 
    18 
    19 try:
    19 try:
    20     from mercurial import rustext
    20     from mercurial import rustext
       
    21 
    21     rustext.__name__  # force actual import (see hgdemandimport)
    22     rustext.__name__  # force actual import (see hgdemandimport)
    22 except ImportError:
    23 except ImportError:
    23     rustext = None
    24     rustext = None
    24 
    25 
    25 configtable = {}
    26 configtable = {}
    26 configitem = registrar.configitem(configtable)
    27 configitem = registrar.configitem(configtable)
    27 
    28 
    28 configitem(b'fakedirstatewritetime', b'fakenow',
    29 configitem(
    29     default=None,
    30     b'fakedirstatewritetime', b'fakenow', default=None,
    30 )
    31 )
    31 
    32 
    32 parsers = policy.importmod(r'parsers')
    33 parsers = policy.importmod(r'parsers')
    33 rustmod = policy.importrust(r'parsers')
    34 rustmod = policy.importrust(r'parsers')
       
    35 
    34 
    36 
    35 def pack_dirstate(fakenow, orig, dmap, copymap, pl, now):
    37 def pack_dirstate(fakenow, orig, dmap, copymap, pl, now):
    36     # execute what original parsers.pack_dirstate should do actually
    38     # execute what original parsers.pack_dirstate should do actually
    37     # for consistency
    39     # for consistency
    38     actualnow = int(now)
    40     actualnow = int(now)
    40         if e[0] == 'n' and e[3] == actualnow:
    42         if e[0] == 'n' and e[3] == actualnow:
    41             e = parsers.dirstatetuple(e[0], e[1], e[2], -1)
    43             e = parsers.dirstatetuple(e[0], e[1], e[2], -1)
    42             dmap[f] = e
    44             dmap[f] = e
    43 
    45 
    44     return orig(dmap, copymap, pl, fakenow)
    46     return orig(dmap, copymap, pl, fakenow)
       
    47 
    45 
    48 
    46 def fakewrite(ui, func):
    49 def fakewrite(ui, func):
    47     # fake "now" of 'pack_dirstate' only if it is invoked while 'func'
    50     # fake "now" of 'pack_dirstate' only if it is invoked while 'func'
    48 
    51 
    49     fakenow = ui.config(b'fakedirstatewritetime', b'fakenow')
    52     fakenow = ui.config(b'fakedirstatewritetime', b'fakenow')
    60 
    63 
    61     if rustmod is not None:
    64     if rustmod is not None:
    62         # The Rust implementation does not use public parse/pack dirstate
    65         # The Rust implementation does not use public parse/pack dirstate
    63         # to prevent conversion round-trips
    66         # to prevent conversion round-trips
    64         orig_dirstatemap_write = dirstate.dirstatemap.write
    67         orig_dirstatemap_write = dirstate.dirstatemap.write
    65         wrapper = lambda self, st, now: orig_dirstatemap_write(self,
    68         wrapper = lambda self, st, now: orig_dirstatemap_write(
    66                                                                st,
    69             self, st, fakenow
    67                                                                fakenow)
    70         )
    68         dirstate.dirstatemap.write = wrapper
    71         dirstate.dirstatemap.write = wrapper
    69 
    72 
    70     orig_dirstate_getfsnow = dirstate._getfsnow
    73     orig_dirstate_getfsnow = dirstate._getfsnow
    71     wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args)
    74     wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args)
    72 
    75 
    81         orig_module.pack_dirstate = orig_pack_dirstate
    84         orig_module.pack_dirstate = orig_pack_dirstate
    82         dirstate._getfsnow = orig_dirstate_getfsnow
    85         dirstate._getfsnow = orig_dirstate_getfsnow
    83         if rustmod is not None:
    86         if rustmod is not None:
    84             dirstate.dirstatemap.write = orig_dirstatemap_write
    87             dirstate.dirstatemap.write = orig_dirstatemap_write
    85 
    88 
       
    89 
    86 def _poststatusfixup(orig, workingctx, status, fixup):
    90 def _poststatusfixup(orig, workingctx, status, fixup):
    87     ui = workingctx.repo().ui
    91     ui = workingctx.repo().ui
    88     return fakewrite(ui, lambda : orig(workingctx, status, fixup))
    92     return fakewrite(ui, lambda: orig(workingctx, status, fixup))
       
    93 
    89 
    94 
    90 def markcommitted(orig, committablectx, node):
    95 def markcommitted(orig, committablectx, node):
    91     ui = committablectx.repo().ui
    96     ui = committablectx.repo().ui
    92     return fakewrite(ui, lambda : orig(committablectx, node))
    97     return fakewrite(ui, lambda: orig(committablectx, node))
       
    98 
    93 
    99 
    94 def extsetup(ui):
   100 def extsetup(ui):
    95     extensions.wrapfunction(context.workingctx, '_poststatusfixup',
   101     extensions.wrapfunction(
    96                             _poststatusfixup)
   102         context.workingctx, '_poststatusfixup', _poststatusfixup
    97     extensions.wrapfunction(context.workingctx, 'markcommitted',
   103     )
    98                             markcommitted)
   104     extensions.wrapfunction(context.workingctx, 'markcommitted', markcommitted)