dirstate: write dirstate on successful exit of changing_parents context
authorPierre-Yves David <pierre-yves.david@octobus.net>
Tue, 13 Dec 2022 12:10:37 +0100
changeset 49961 5b0beaf45491
parent 49960 7a8bfc05b691
child 49962 23b70ce09e55
dirstate: write dirstate on successful exit of changing_parents context This is the first step toward having more sensible and predicatable write patterns for the dirstate. Having better write/rollback patterns will greatly reduce and clarify the needs to backup the dirstate.
mercurial/dirstate.py
--- a/mercurial/dirstate.py	Wed Jan 25 19:12:31 2023 +0100
+++ b/mercurial/dirstate.py	Tue Dec 13 12:10:37 2022 +0100
@@ -178,7 +178,18 @@
                 # manager
                 if self._parentwriters <= 0:
                     assert self._parentwriters == 0
-                    self._invalidated_context = False
+                    if self._invalidated_context:
+                        self._invalidated_context = False
+                    else:
+                        # When an exception occured, `_invalidated_context`
+                        # would have been set to True by the `invalidate`
+                        # call earlier.
+                        #
+                        # We don't have more straightforward code, because the
+                        # Exception catching (and the associated `invalidate`
+                        # calling) might have been called by a nested context
+                        # instead of the top level one.
+                        self.write(repo.currenttransaction())
 
     # here to help migration to the new code
     def parentchange(self):