Patchwork [4,of,6,events,v3] exchange: add pushafterdiscovery event

login
register
mail settings
Submitter Gregory Szorc
Date Sept. 28, 2014, 9:01 p.m.
Message ID <5fae746b4551e2c593ac.1411938102@vm-ubuntu-main.gateway.sonic.net>
Download mbox | patch
Permalink /patch/6018/
State Changes Requested
Headers show

Comments

Gregory Szorc - Sept. 28, 2014, 9:01 p.m.
# HG changeset patch
# User Gregory Szorc <gregory.szorc@gmail.com>
# Date 1408424584 25200
#      Mon Aug 18 22:03:04 2014 -0700
# Node ID 5fae746b4551e2c593aca077d25f8b6a4e5b6159
# Parent  33cbfe6b815d88ebee229e372af69c8276fce29c
exchange: add pushafterdiscovery event

Extensions may wish to inject code after discovery. For example,
they may wish to ban certain changesets or changesets with certain
content from being pushed. The "preoutgoing" hook facilitates this
today. However, it doesn't have access to the rich pushoperation
object because of backwards compatibility. The pushafterdiscovery
event gives extensions a more robust injection point.

Patch

diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -196,8 +196,9 @@  def push(repo, remote, force=False, revs
         if not unbundle:
             lock = pushop.remote.lock()
         try:
             _pushdiscovery(pushop)
+            pushop.repo.events.pushafterdiscovery(pushop=pushop)
             if (pushop.repo.ui.configbool('experimental', 'bundle2-exp',
                                           False)
                 and pushop.remote.capable('bundle2-exp')):
                 _pushbundle2(pushop)
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1792,4 +1792,17 @@  class localrepoevents(util.eventmanager)
         Expected use cases include policy checking a push's parameters and
         modifying what a push attempts to do.
         '''
 
+    def pushafterdiscovery(pushop):
+        '''Event fired during push, after discovery has been performed.
+
+        Event handlers receive the repo instance and an exchange.pushoperation
+        corresponding to the active push.
+
+        One of the first operations done as part of push is to discover which
+        nodes are present on the remote and thus which nodes and heads will
+        be pushed. This event fires after discovery has been performed.
+
+        Expected use cases of this event include examining and possibly
+        modifying the set of outgoing nodes and heads.
+        '''
diff --git a/tests/test-events.t b/tests/test-events.t
--- a/tests/test-events.t
+++ b/tests/test-events.t
@@ -2,10 +2,16 @@ 
   > from mercurial import exchange
   > def pushbegin(pushop):
   >     assert isinstance(pushop, exchange.pushoperation)
   >     pushop.ui.write('pushbegin %s\n' % pushop.repo.path)
+  > 
+  > def pushafterdiscovery(pushop):
+  >     assert isinstance(pushop, exchange.pushoperation)
+  >     pushop.ui.write('pushafterdiscovery %s\n' % pushop.repo.path)
+  > 
   > def reposetup(ui, repo):
   >     repo.events.pushbegin += pushbegin
+  >     repo.events.pushafterdiscovery += pushafterdiscovery
   > EOF
 
   $ hg init server
   $ hg init client
@@ -23,8 +29,9 @@  Ensure push-related events are firing
   $ hg push ../server
   pushing to ../server
   pushbegin $TESTTMP/client/.hg
   searching for changes
+  pushafterdiscovery $TESTTMP/client/.hg
   adding changesets
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files