diff mercurial/localrepo.py @ 23129:eb315418224c stable

hook: protect commit hooks against stripping of temporary commit (issue4422) History rewriting commands like histedit tend to use temporary commits. They may schedule hook execution on these temporary commits for after the lock has been released. But temporary commits are likely to have been stripped before the lock is released (and the hook run). Hook executed for missing revisions leads to various crashes. We disable hooks execution for revision missing in the repo. This provides a dirty but simple fix to user issues.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Sat, 01 Nov 2014 23:17:50 +0000
parents 8b4a8a9176e2
children 3872d563e01a 53a65929ef1f
line wrap: on
line diff
--- a/mercurial/localrepo.py	Sat Nov 01 22:59:37 2014 +0000
+++ b/mercurial/localrepo.py	Sat Nov 01 23:17:50 2014 +0000
@@ -1370,7 +1370,11 @@
             wlock.release()
 
         def commithook(node=hex(ret), parent1=hookp1, parent2=hookp2):
-            self.hook("commit", node=node, parent1=parent1, parent2=parent2)
+            # hack for command that use a temporary commit (eg: histedit)
+            # temporary commit got stripped before hook release
+            if node in self:
+                self.hook("commit", node=node, parent1=parent1,
+                          parent2=parent2)
         self._afterlock(commithook)
         return ret