From patchwork Tue Aug 19 05:30:16 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [4,of,6] exchange: add pushafterdiscovery event From: Gregory Szorc X-Patchwork-Id: 5504 Message-Id: <8548dee3e8f6699c0e2c.1408426216@vm-ubuntu-main.gateway.sonic.net> To: mercurial-devel@selenic.com Date: Mon, 18 Aug 2014 22:30:16 -0700 # HG changeset patch # User Gregory Szorc # Date 1408424584 25200 # Mon Aug 18 22:03:04 2014 -0700 # Node ID 8548dee3e8f6699c0e2c530f1d5fa7e1009a540c # Parent be70417132e8c06c4634150cca755b3742bc7ac3 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. diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -180,8 +180,9 @@ def push(repo, remote, force=False, revs if not unbundle: lock = pushop.remote.lock() try: _pushdiscovery(pushop) + pushop.repo.events.pushafterdiscovery(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 @@ -310,8 +310,14 @@ class localrepository(object): # argument. Event handlers can modify the pushop to change what will # be done by the push operation. self.events.register('pushbegin') + # pushafterdiscovery is fired in the middle of a push operation, after + # discovery has been performed but before data is pushed to the remote. + # Event handlers receive the exchange.pushoperation instance for the + # in-progress push. + self.events.register('pushafterdiscovery') + def close(self): pass def _restrictcapabilities(self, caps): 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