28 configitem(b'fakedirstatewritetime', b'fakenow', |
28 configitem(b'fakedirstatewritetime', b'fakenow', |
29 default=None, |
29 default=None, |
30 ) |
30 ) |
31 |
31 |
32 parsers = policy.importmod(r'parsers') |
32 parsers = policy.importmod(r'parsers') |
|
33 rustmod = policy.importrust(r'parsers') |
33 |
34 |
34 def pack_dirstate(fakenow, orig, dmap, copymap, pl, now): |
35 def pack_dirstate(fakenow, orig, dmap, copymap, pl, now): |
35 # execute what original parsers.pack_dirstate should do actually |
36 # execute what original parsers.pack_dirstate should do actually |
36 # for consistency |
37 # for consistency |
37 actualnow = int(now) |
38 actualnow = int(now) |
55 |
56 |
56 # parsing 'fakenow' in YYYYmmddHHMM format makes comparison between |
57 # parsing 'fakenow' in YYYYmmddHHMM format makes comparison between |
57 # 'fakenow' value and 'touch -t YYYYmmddHHMM' argument easy |
58 # 'fakenow' value and 'touch -t YYYYmmddHHMM' argument easy |
58 fakenow = dateutil.parsedate(fakenow, [b'%Y%m%d%H%M'])[0] |
59 fakenow = dateutil.parsedate(fakenow, [b'%Y%m%d%H%M'])[0] |
59 |
60 |
60 if rustext is not None: |
61 if rustmod is not None: |
61 orig_module = rustext.dirstate |
62 # The Rust implementation does not use public parse/pack dirstate |
62 orig_pack_dirstate = rustext.dirstate.pack_dirstate |
63 # to prevent conversion round-trips |
63 else: |
64 orig_dirstatemap_write = dirstate.dirstatemap.write |
64 orig_module = parsers |
65 wrapper = lambda self, st, now: orig_dirstatemap_write(self, |
65 orig_pack_dirstate = parsers.pack_dirstate |
66 st, |
|
67 fakenow) |
|
68 dirstate.dirstatemap.write = wrapper |
66 |
69 |
67 orig_dirstate_getfsnow = dirstate._getfsnow |
70 orig_dirstate_getfsnow = dirstate._getfsnow |
68 wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args) |
71 wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args) |
|
72 |
|
73 orig_module = parsers |
|
74 orig_pack_dirstate = parsers.pack_dirstate |
69 |
75 |
70 orig_module.pack_dirstate = wrapper |
76 orig_module.pack_dirstate = wrapper |
71 dirstate._getfsnow = lambda *args: fakenow |
77 dirstate._getfsnow = lambda *args: fakenow |
72 try: |
78 try: |
73 return func() |
79 return func() |
74 finally: |
80 finally: |
75 orig_module.pack_dirstate = orig_pack_dirstate |
81 orig_module.pack_dirstate = orig_pack_dirstate |
76 dirstate._getfsnow = orig_dirstate_getfsnow |
82 dirstate._getfsnow = orig_dirstate_getfsnow |
|
83 if rustmod is not None: |
|
84 dirstate.dirstatemap.write = orig_dirstatemap_write |
77 |
85 |
78 def _poststatusfixup(orig, workingctx, status, fixup): |
86 def _poststatusfixup(orig, workingctx, status, fixup): |
79 ui = workingctx.repo().ui |
87 ui = workingctx.repo().ui |
80 return fakewrite(ui, lambda : orig(workingctx, status, fixup)) |
88 return fakewrite(ui, lambda : orig(workingctx, status, fixup)) |
81 |
89 |