[PATCH] changegroup: don't run changegroup hooks if nodes are gone

Durham Goode durham at fb.com
Mon Oct 7 16:17:29 CDT 2013


# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1381171501 25200
#      Mon Oct 07 11:45:01 2013 -0700
# Node ID 572bf59dd5950cefc2c00a20fbfee9fdf65a8176
# Parent  b3de50b0c7aa464fdf73ece8c4e5ee8af59b4242
changegroup: don't run changegroup hooks if nodes are gone

The changegroup hook runs when the repo lock is released, but it's possible that
multiple transactions have happened during that single lock and therefore the
commits the hook was for may be gone. This is the case in the shelve extension
where it adds a commit and strips it in the same lock but different
transactions (which results in warning messages during unshelve on hgsubversion
repos).

A real fix would be to attach the hook to the transaction instead, but that
might have unknown consequences. Since we're this close to code-freeze, this fix
just prevents the hook from running if the commit disappeared.

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -2229,6 +2229,12 @@
                     # In other case we can safely update cache on disk.
                     branchmap.updatecache(self.filtered('served'))
                 def runhooks():
+                    # 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.
+                    if clstart >= len(self):
+                        return
+
                     # forcefully update the on-disk branch cache
                     self.ui.debug("updating the branch cache\n")
                     self.hook("changegroup", node=hex(cl.node(clstart)),


More information about the Mercurial-devel mailing list