# HG changeset patch # User Martin von Zweigbergk # Date 1563721156 25200 # Node ID 36c692eb28d3eed4178119888a00af6c8d1930af # Parent 52a383451739b64949b51d5b134e60f8c15760f5 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 diff -r 52a383451739 -r 36c692eb28d3 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