diff --git a/hgext/remotefilelog/__init__.py b/hgext/remotefilelog/__init__.py --- a/hgext/remotefilelog/__init__.py +++ b/hgext/remotefilelog/__init__.py @@ -1063,7 +1063,7 @@ # update a revset with a date limit bgprefetchrevs = revdatelimit(ui, bgprefetchrevs) - def anon(): + def anon(unused_success): if util.safehasattr(repo, b'ranprefetch') and repo.ranprefetch: return repo.ranprefetch = True diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -2372,7 +2372,7 @@ if pushkeycompat: - def runhook(): + def runhook(unused_success): for hookargs in allhooks: op.repo.hook(b'pushkey', **pycompat.strkwargs(hookargs)) diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py --- a/mercurial/changegroup.py +++ b/mercurial/changegroup.py @@ -436,7 +436,7 @@ if changesets > 0: - def runhooks(): + def runhooks(unused_success): # These hooks run when the lock releases, not when the # transaction closes. So it's possible for the changelog # to have changed since we last saw it. diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -2203,7 +2203,7 @@ # fixes the function accumulation. hookargs = tr2.hookargs - def hookfunc(): + def hookfunc(unused_success): repo = reporef() if hook.hashook(repo.ui, b'txnclose-bookmark'): bmchanges = sorted(tr.changes[b'bookmarks'].items()) @@ -2615,7 +2615,7 @@ l.postrelease.append(callback) break else: # no lock have been found. - callback() + callback(True) def lock(self, wait=True): '''Lock the repository store (.hg/store) and return a weak reference @@ -2953,7 +2953,7 @@ ) raise - def commithook(): + def commithook(unused_success): # hack for command that use a temporary commit (eg: histedit) # temporary commit got stripped before hook release if self.changelog.hasnode(ret): @@ -3399,7 +3399,7 @@ self.ui.debug(b'pushing key for "%s:%s"\n' % (namespace, key)) ret = pushkey.push(self, namespace, key, old, new) - def runhook(): + def runhook(unused_success): self.hook( b'pushkey', namespace=namespace, diff --git a/mercurial/lock.py b/mercurial/lock.py --- a/mercurial/lock.py +++ b/mercurial/lock.py @@ -233,7 +233,8 @@ return self def __exit__(self, exc_type, exc_value, exc_tb): - self.release() + success = all(a is None for a in (exc_type, exc_value, exc_tb)) + self.release(success=success) def __del__(self): if self.held: @@ -408,7 +409,7 @@ self.acquirefn() self._inherited = False - def release(self): + def release(self, success=True): """release the lock and execute callback function if any If the lock has been acquired multiple times, the actual release is @@ -433,7 +434,7 @@ # at all. if not self._parentheld: for callback in self.postrelease: - callback() + callback(success) # Prevent double usage and help clear cycles. self.postrelease = None diff --git a/mercurial/manifest.py b/mercurial/manifest.py --- a/mercurial/manifest.py +++ b/mercurial/manifest.py @@ -1572,7 +1572,11 @@ reporef = weakref.ref(repo) manifestrevlogref = weakref.ref(self) - def persistmanifestcache(): + def persistmanifestcache(success): + # Repo is in an unknown state, do not persist. + if not success: + return + repo = reporef() self = manifestrevlogref() if repo is None or self is None: diff --git a/tests/test-lock.py b/tests/test-lock.py --- a/tests/test-lock.py +++ b/tests/test-lock.py @@ -65,7 +65,7 @@ def releasefn(self): self._releasecalled = True - def postreleasefn(self): + def postreleasefn(self, success): self._postreleasecalled = True def assertacquirecalled(self, called):