changeset 50081:d50d45cd5a5f

dirstate: invalidate the dirstate change on transaction failure If the change context lives inside a transaction, the change are not flushed to disk on exit as this is delegated to the transaction. As a result we should also delegate the part that do cleanup on failure. The issue was caught by tests with other change, but it seems useful to fix this as soon as possible.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 13 Feb 2023 21:51:45 +0100
parents 0dc2fb4b4b11
children 3550e4a88ccd
files mercurial/dirstate.py
diffstat 1 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/dirstate.py	Thu Jan 26 17:16:24 2023 +0100
+++ b/mercurial/dirstate.py	Mon Feb 13 21:51:45 2023 +0100
@@ -204,7 +204,11 @@
                         # 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())
+                        tr = repo.currenttransaction()
+                        if tr is not None:
+                            abort_cb = lambda tr: self.invalidate()
+                            tr.addabort(b'dirstate', abort_cb)
+                        self.write(tr)
 
     @contextlib.contextmanager
     def changing_parents(self, repo):