tests/fakedirstatewritetime.py
branchstable
changeset 48796 c00d3ce4e94b
parent 48398 111098af6356
child 48875 6000f5b25c9b
equal deleted inserted replaced
48776:b84ff512b645 48796:c00d3ce4e94b
     7 
     7 
     8 from __future__ import absolute_import
     8 from __future__ import absolute_import
     9 
     9 
    10 from mercurial import (
    10 from mercurial import (
    11     context,
    11     context,
    12     dirstate,
       
    13     dirstatemap as dirstatemapmod,
    12     dirstatemap as dirstatemapmod,
    14     extensions,
    13     extensions,
    15     policy,
    14     policy,
    16     registrar,
    15     registrar,
    17 )
    16 )
    36 
    35 
    37 parsers = policy.importmod('parsers')
    36 parsers = policy.importmod('parsers')
    38 has_rust_dirstate = policy.importrust('dirstate') is not None
    37 has_rust_dirstate = policy.importrust('dirstate') is not None
    39 
    38 
    40 
    39 
    41 def pack_dirstate(fakenow, orig, dmap, copymap, pl, now):
    40 def pack_dirstate(orig, dmap, copymap, pl):
    42     # execute what original parsers.pack_dirstate should do actually
    41     return orig(dmap, copymap, pl)
    43     # for consistency
       
    44     for f, e in dmap.items():
       
    45         if e.need_delay(now):
       
    46             e.set_possibly_dirty()
       
    47 
       
    48     return orig(dmap, copymap, pl, fakenow)
       
    49 
    42 
    50 
    43 
    51 def fakewrite(ui, func):
    44 def fakewrite(ui, func):
    52     # fake "now" of 'pack_dirstate' only if it is invoked while 'func'
    45     # fake "now" of 'pack_dirstate' only if it is invoked while 'func'
    53 
    46 
    60         return func()
    53         return func()
    61 
    54 
    62     # parsing 'fakenow' in YYYYmmddHHMM format makes comparison between
    55     # parsing 'fakenow' in YYYYmmddHHMM format makes comparison between
    63     # 'fakenow' value and 'touch -t YYYYmmddHHMM' argument easy
    56     # 'fakenow' value and 'touch -t YYYYmmddHHMM' argument easy
    64     fakenow = dateutil.parsedate(fakenow, [b'%Y%m%d%H%M'])[0]
    57     fakenow = dateutil.parsedate(fakenow, [b'%Y%m%d%H%M'])[0]
    65     fakenow = timestamp.timestamp((fakenow, 0))
    58     fakenow = timestamp.timestamp((fakenow, 0, False))
    66 
    59 
    67     if has_rust_dirstate:
    60     if has_rust_dirstate:
    68         # The Rust implementation does not use public parse/pack dirstate
    61         # The Rust implementation does not use public parse/pack dirstate
    69         # to prevent conversion round-trips
    62         # to prevent conversion round-trips
    70         orig_dirstatemap_write = dirstatemapmod.dirstatemap.write
    63         orig_dirstatemap_write = dirstatemapmod.dirstatemap.write
    71         wrapper = lambda self, tr, st, now: orig_dirstatemap_write(
    64         wrapper = lambda self, tr, st: orig_dirstatemap_write(self, tr, st)
    72             self, tr, st, fakenow
       
    73         )
       
    74         dirstatemapmod.dirstatemap.write = wrapper
    65         dirstatemapmod.dirstatemap.write = wrapper
    75 
    66 
    76     orig_dirstate_getfsnow = dirstate._getfsnow
    67     orig_get_fs_now = timestamp.get_fs_now
    77     wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args)
    68     wrapper = lambda *args: pack_dirstate(orig_pack_dirstate, *args)
    78 
    69 
    79     orig_module = parsers
    70     orig_module = parsers
    80     orig_pack_dirstate = parsers.pack_dirstate
    71     orig_pack_dirstate = parsers.pack_dirstate
    81 
    72 
    82     orig_module.pack_dirstate = wrapper
    73     orig_module.pack_dirstate = wrapper
    83     dirstate._getfsnow = lambda *args: fakenow
    74     timestamp.get_fs_now = (
       
    75         lambda *args: fakenow
       
    76     )  # XXX useless for this purpose now
    84     try:
    77     try:
    85         return func()
    78         return func()
    86     finally:
    79     finally:
    87         orig_module.pack_dirstate = orig_pack_dirstate
    80         orig_module.pack_dirstate = orig_pack_dirstate
    88         dirstate._getfsnow = orig_dirstate_getfsnow
    81         timestamp.get_fs_now = orig_get_fs_now
    89         if has_rust_dirstate:
    82         if has_rust_dirstate:
    90             dirstatemapmod.dirstatemap.write = orig_dirstatemap_write
    83             dirstatemapmod.dirstatemap.write = orig_dirstatemap_write
    91 
    84 
    92 
    85 
    93 def _poststatusfixup(orig, workingctx, status, fixup):
    86 def _poststatusfixup(orig, workingctx, status, fixup):