run commit and update hooks after command completion (issue1827) stable
authorSune Foldager <cryo@cyanite.org>
Wed, 17 Feb 2010 15:43:21 +0100
branchstable
changeset 10492 0e64d814d7d0
parent 10491 d7e582cab6b6
child 10493 283f3b413f19
run commit and update hooks after command completion (issue1827) Previously, the working dir state hadn't been written when these hooks were invoked, so external commands couldn't see all changes.
hgext/keyword.py
mercurial/localrepo.py
mercurial/merge.py
tests/test-hook
tests/test-hook.out
--- a/hgext/keyword.py	Wed Feb 17 11:00:48 2010 +0100
+++ b/hgext/keyword.py	Wed Feb 17 15:43:21 2010 +0100
@@ -480,7 +480,14 @@
             # other extensions can still wrap repo.commitctx directly
             self.commitctx = self.kwcommitctx
             try:
-                return super(kwrepo, self).commit(*args, **opts)
+                self._kwcommithooks = {}
+                n = super(kwrepo, self).commit(*args, **opts)
+                if self._kwcommithooks:
+                    xp1, xp2 = self._kwxp1, self._kwxp2
+                    for name, cmd in self._kwcommithooks.iteritems():
+                        ui.setconfig('hooks', name, cmd)
+                    self.hook('commit', node=n, parent1=xp1, parent2=xp2)
+                return n
             finally:
                 del self.commitctx
 
@@ -490,23 +497,18 @@
                 wlock = self.wlock()
                 lock = self.lock()
                 # store and postpone commit hooks
-                commithooks = {}
                 for name, cmd in ui.configitems('hooks'):
                     if name.split('.', 1)[0] == 'commit':
-                        commithooks[name] = cmd
+                        self._kwcommithooks[name] = cmd
                         ui.setconfig('hooks', name, None)
-                if commithooks:
+                if self._kwcommithooks:
                     # store parents for commit hooks
                     p1, p2 = ctx.p1(), ctx.p2()
-                    xp1, xp2 = p1.hex(), p2 and p2.hex() or ''
+                    self._kwxp1, self._kwxp2 = p1.hex(), p2 and p2.hex() or ''
 
                 n = super(kwrepo, self).commitctx(ctx, error)
 
                 kwt.overwrite(n, True, None)
-                if commithooks:
-                    for name, cmd in commithooks.iteritems():
-                        ui.setconfig('hooks', name, cmd)
-                    self.hook('commit', node=n, parent1=xp1, parent2=xp2)
                 return n
             finally:
                 release(lock, wlock)
--- a/mercurial/localrepo.py	Wed Feb 17 11:00:48 2010 +0100
+++ b/mercurial/localrepo.py	Wed Feb 17 15:43:21 2010 +0100
@@ -846,6 +846,8 @@
             msgfile.close()
 
             try:
+                hookp1, hookp2 = hex(p1), (p2 != nullid and hex(p2) or '')
+                self.hook("precommit", throw=True, parent1=hookp1, parent2=hookp2)
                 ret = self.commitctx(cctx, True)
             except:
                 if edited:
@@ -861,15 +863,14 @@
                 self.dirstate.forget(f)
             self.dirstate.setparents(ret)
             ms.reset()
-
-            return ret
-
         finally:
             wlock.release()
 
+        self.hook("commit", node=hex(ret), parent1=hookp1, parent2=hookp2)
+        return ret
+
     def commitctx(self, ctx, error=False):
         """Add a new revision to current repository.
-
         Revision information is passed via the context argument.
         """
 
@@ -880,9 +881,6 @@
         m2 = p2.manifest()
         user = ctx.user()
 
-        xp1, xp2 = p1.hex(), p2 and p2.hex() or ''
-        self.hook("precommit", throw=True, parent1=xp1, parent2=xp2)
-
         lock = self.lock()
         try:
             tr = self.transaction()
@@ -925,6 +923,7 @@
                                    trp, p1.node(), p2.node(),
                                    user, ctx.date(), ctx.extra().copy())
             p = lambda: self.changelog.writepending() and self.root or ""
+            xp1, xp2 = p1.hex(), p2 and p2.hex() or ''
             self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1,
                       parent2=xp2, pending=p)
             self.changelog.finalize(trp)
@@ -932,8 +931,6 @@
 
             if self._branchcache:
                 self.branchtags()
-
-            self.hook("commit", node=hex(n), parent1=xp1, parent2=xp2)
             return n
         finally:
             del tr
--- a/mercurial/merge.py	Wed Feb 17 11:00:48 2010 +0100
+++ b/mercurial/merge.py	Wed Feb 17 15:43:21 2010 +0100
@@ -511,8 +511,9 @@
             repo.dirstate.setparents(fp1, fp2)
             if not branchmerge and not fastforward:
                 repo.dirstate.setbranch(p2.branch())
-            repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
-
-        return stats
     finally:
         wlock.release()
+
+    if not partial:
+        repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
+    return stats
--- a/tests/test-hook	Wed Feb 17 11:00:48 2010 +0100
+++ b/tests/test-hook	Wed Feb 17 15:43:21 2010 +0100
@@ -205,8 +205,8 @@
 echo '[hooks]' > .hg/hgrc
 echo 'commit.abort = python:hooktests.aborthook' >> .hg/hgrc
 
-echo a >> a
-hg --traceback commit -A -m a 2>&1 | grep '^Traceback'
+echo aa > a
+hg --traceback commit -d '0 0' -ma 2>&1 | grep '^Traceback'
 
 cd ..
 hg init c
@@ -224,9 +224,9 @@
 
 touch foo
 hg add foo
-hg ci -m 'add foo'
+hg ci -d '0 0' -m 'add foo'
 echo >> foo
-hg ci --debug -m 'change foo' | sed -e 's/ at .*>/>/'
+hg ci --debug -d '0 0' -m 'change foo' | sed -e 's/ at .*>/>/'
 
 hg showconfig hooks | sed -e 's/ at .*>/>/'
 
@@ -246,7 +246,7 @@
 echo "pre-commit.test = python:`pwd`/testhooks.py:testhook" >> ../repo/.hg/hgrc
 
 cd ../repo
-hg commit
+hg commit -d '0 0'
 
 cd ../../b
 echo '# make sure --traceback works on hook import failure'
@@ -260,6 +260,14 @@
 echo 'precommit.importfail = python:importfail.whatever' >> .hg/hgrc
 
 echo a >> a
-hg --traceback commit -Ama 2>&1 | egrep '^(exception|Traceback|ImportError)'
+hg --traceback commit -d '0 0' -ma 2>&1 | egrep '^(exception|Traceback|ImportError)'
+
+echo '# commit and update hooks should run after command completion (issue 1827)'
+echo '[hooks]' > .hg/hgrc
+echo 'commit = hg id' >> .hg/hgrc
+echo 'update = hg id' >> .hg/hgrc
+echo bb > a
+hg ci -d '0 0' -ma
+hg up 0
 
 exit 0
--- a/tests/test-hook.out	Wed Feb 17 11:00:48 2010 +0100
+++ b/tests/test-hook.out	Wed Feb 17 15:43:21 2010 +0100
@@ -171,3 +171,7 @@
 Traceback (most recent call last):
 ImportError: No module named hgext_importfail
 Traceback (most recent call last):
+# commit and update hooks should run after command completion (issue 1827)
+8da618c33484 tip
+29b62aeb769f
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved