dirstate: track that changes are pending in a transaction
authorPierre-Yves David <pierre-yves.david@octobus.net>
Mon, 20 Feb 2023 16:31:36 +0100
changeset 50122 72b4d9284411
parent 50121 15531d101313
child 50123 4e95341c89aa
dirstate: track that changes are pending in a transaction Nothing is currently broken because if this, but this make the `_invalidated_context` attribute more accurate. Being more accurate here will help us later, when dealing with `status` call.
mercurial/dirstate.py
--- a/mercurial/dirstate.py	Tue Feb 21 17:43:43 2023 +0100
+++ b/mercurial/dirstate.py	Mon Feb 20 16:31:36 2023 +0100
@@ -174,6 +174,7 @@
         # True if the current dirstate changing operations have been
         # invalidated (used to make sure all nested contexts have been exited)
         self._invalidated_context = False
+        self._attached_to_a_transaction = False
         self._filename = b'dirstate'
         self._filename_th = b'dirstate-tracked-hint'
         self._pendingfilename = b'%s.pending' % self._filename
@@ -556,7 +557,9 @@
                 delattr(self, a)
         self._dirty = False
         self._dirty_tracked_set = False
-        self._invalidated_context = self._changing_level > 0
+        self._invalidated_context = (
+            self._changing_level > 0 or self._attached_to_a_transaction
+        )
         self._origpl = None
 
     @requires_changing_any
@@ -941,17 +944,26 @@
 
         write_key = self._use_tracked_hint and self._dirty_tracked_set
         if tr:
+
+            def on_abort(tr):
+                self._attached_to_a_transaction = False
+                self.invalidate()
+
             # make sure we invalidate the current change on abort
             if tr is not None:
-                tr.addabort(
-                    b'dirstate-invalidate',
-                    lambda tr: self.invalidate(),
-                )
+                tr.addabort(b'dirstate-invalidate', on_abort)
+
+            self._attached_to_a_transaction = True
+
+            def on_success(f):
+                self._attached_to_a_transaction = False
+                self._writedirstate(tr, f),
+
             # delay writing in-memory changes out
             tr.addfilegenerator(
                 b'dirstate-1-main',
                 (self._filename,),
-                lambda f: self._writedirstate(tr, f),
+                on_success,
                 location=b'plain',
                 post_finalize=True,
             )