transaction: leave unfinished without crashing when not properly released
authorMartin von Zweigbergk <martinvonz@google.com>
Sun, 21 Jul 2019 07:59:16 -0700
changeset 42669 36c692eb28d3
parent 42668 52a383451739
child 42670 a7f1a0b3f461
transaction: leave unfinished without crashing when not properly released I think the transaction.__del__ is there just as a last resort in case we (or an extension) forgot to release the transaction. When that happens, the repo can (or will on Python 3?) get deleted before the transaction. This leads to a crash in test-devel-warnings.t on Python 3 because we tried to access repo.dirstate, where repo was retried from a weak reference. There's not much we can do here, but let's at least avoid the crash. The user will have run `hg recover` afterwards regardless. Differential Revision: https://phab.mercurial-scm.org/D6664
mercurial/localrepo.py
--- a/mercurial/localrepo.py	Tue Jul 30 21:36:15 2019 +0530
+++ b/mercurial/localrepo.py	Sun Jul 21 07:59:16 2019 -0700
@@ -1893,6 +1893,12 @@
                       **pycompat.strkwargs(tr.hookargs))
         def releasefn(tr, success):
             repo = reporef()
+            if repo is None:
+                # If the repo has been GC'd (and this release function is being
+                # called from transaction.__del__), there's not much we can do,
+                # so just leave the unfinished transaction there and let the
+                # user run `hg recover`.
+                return
             if success:
                 # this should be explicitly invoked here, because
                 # in-memory changes aren't written out at closing