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): |