Patchwork [3,of,6] exchange: add pushbegin event

login
register
mail settings
Submitter Gregory Szorc
Date Aug. 19, 2014, 5:30 a.m.
Message ID <be70417132e8c06c4634.1408426215@vm-ubuntu-main.gateway.sonic.net>
Download mbox | patch
Permalink /patch/5507/
State Changes Requested
Headers show

Comments

Gregory Szorc - Aug. 19, 2014, 5:30 a.m.
# HG changeset patch
# User Gregory Szorc <gregory.szorc@gmail.com>
# Date 1408423943 25200
#      Mon Aug 18 21:52:23 2014 -0700
# Node ID be70417132e8c06c4634150cca755b3742bc7ac3
# Parent  ec6632877a28678be887e4041409c398aadec529
exchange: add pushbegin event

Extensions may wish to influence what is being done by a push
operation. To facilitate this, we establish the "pushbegin"
event, which fires immediately after a pushoperation is created
and gives extensions the ability to inspect and/or change
the pushoperation before any additional action is taken.

Patch

diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -138,8 +138,9 @@  def push(repo, remote, force=False, revs
         we have outgoing changesets but refused to push
       - other values as described by addchangegroup()
     '''
     pushop = pushoperation(repo, remote, force, revs, newbranch)
+    repo.events.pushbegin(pushop)
     if pushop.remote.local():
         missing = (set(pushop.repo.requirements)
                    - pushop.remote.local().supported)
         if missing:
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -304,8 +304,14 @@  class localrepository(object):
         self.filteredrevcache = {}
 
         self.events = util.eventmanager()
 
+        # pushbefore is fired when a push operation is about to be performed.
+        # Event handlers will receive an exchange.pushoperation as a single
+        # argument. Event handlers can modify the pushop to change what will
+        # be done by the push operation.
+        self.events.register('pushbegin')
+
     def close(self):
         pass
 
     def _restrictcapabilities(self, caps):
diff --git a/tests/test-events.t b/tests/test-events.t
new file mode 100644
--- /dev/null
+++ b/tests/test-events.t
@@ -0,0 +1,30 @@ 
+  $ cat >> events.py << EOF
+  > from mercurial import exchange
+  > def pushbegin(pushop):
+  >     assert isinstance(pushop, exchange.pushoperation)
+  >     pushop.ui.write('pushbegin %s\n' % pushop.repo.path)
+  > def reposetup(ui, repo):
+  >     repo.events.pushbegin += pushbegin
+  > EOF
+
+  $ hg init server
+  $ hg init client
+  $ cd client
+  $ cat >> .hg/hgrc << EOF
+  > [extensions]
+  > events = $TESTTMP/events.py
+  > EOF
+
+Ensure push-related events are firing
+
+  $ touch foo
+  $ hg commit -A -m 'initial'
+  adding foo
+  $ hg push ../server
+  pushing to ../server
+  pushbegin $TESTTMP/client/.hg
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files