comparison mercurial/dirstate.py @ 50076:63c4e9639753

dirstate: generalize the dirstate's invalidation on transaction abort The previous code was too specific, we should add the invalidation at next to the `addfilegenerator` in the `write` call.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 16 Feb 2023 02:34:54 +0100
parents 8eb460e0a202
children 605f0ccffb43
comparison
equal deleted inserted replaced
50075:8eb460e0a202 50076:63c4e9639753
215 # We don't have more straightforward code, because the 215 # We don't have more straightforward code, because the
216 # Exception catching (and the associated `invalidate` 216 # Exception catching (and the associated `invalidate`
217 # calling) might have been called by a nested context 217 # calling) might have been called by a nested context
218 # instead of the top level one. 218 # instead of the top level one.
219 tr = repo.currenttransaction() 219 tr = repo.currenttransaction()
220 if tr is not None:
221 abort_cb = lambda tr: self.invalidate()
222 tr.addabort(b'dirstate', abort_cb)
223 self.write(tr) 220 self.write(tr)
224 221
225 @contextlib.contextmanager 222 @contextlib.contextmanager
226 def changing_parents(self, repo): 223 def changing_parents(self, repo):
227 with self._changing(repo, CHANGE_TYPE_PARENTS) as c: 224 with self._changing(repo, CHANGE_TYPE_PARENTS) as c:
915 if not self._dirty: 912 if not self._dirty:
916 return 913 return
917 914
918 write_key = self._use_tracked_hint and self._dirty_tracked_set 915 write_key = self._use_tracked_hint and self._dirty_tracked_set
919 if tr: 916 if tr:
917 # make sure we invalidate the current change on abort
918 if tr is not None:
919 tr.addabort(
920 b'dirstate-invalidate',
921 lambda tr: self.invalidate(),
922 )
920 # delay writing in-memory changes out 923 # delay writing in-memory changes out
921 tr.addfilegenerator( 924 tr.addfilegenerator(
922 b'dirstate-1-main', 925 b'dirstate-1-main',
923 (self._filename,), 926 (self._filename,),
924 lambda f: self._writedirstate(tr, f), 927 lambda f: self._writedirstate(tr, f),