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