Mercurial > public > mercurial-scm > hg-stable
diff mercurial/exchange.py @ 23437:94e2862dbcfb
push: elevate phase transaction to cover entire operation
This patch series is intended to allow bundle2 push reply part handlers to
make changes to the local repository; it has been developed in parallel with
an extension that allows the server to rebase incoming changesets while applying
them.
Most pushes already open a transaction in order to sync phase information.
This diff replaces that transaction with one that spans the entire push
operation.
This transaction will be used in a later patch to guard repository changes
made during the reply handler.
author | Eric Sumner <ericsumner@fb.com> |
---|---|
date | Fri, 21 Nov 2014 15:06:38 -0800 |
parents | 52db731b964d |
children | 743736fc7c41 |
line wrap: on
line diff
--- a/mercurial/exchange.py Fri Nov 21 14:32:57 2014 -0800 +++ b/mercurial/exchange.py Fri Nov 21 15:06:38 2014 -0800 @@ -104,6 +104,8 @@ self.outobsmarkers = set() # outgoing bookmarks self.outbookmarks = [] + # transaction manager + self.trmanager = None @util.propertycache def futureheads(self): @@ -204,6 +206,10 @@ msg = 'cannot lock source repository: %s\n' % err pushop.ui.debug(msg) try: + if pushop.locallocked: + pushop.trmanager = transactionmanager(repo, + 'push-response', + pushop.remote.url()) pushop.repo.checkpush(pushop) lock = None unbundle = pushop.remote.capable('unbundle') @@ -222,7 +228,11 @@ finally: if lock is not None: lock.release() + if pushop.trmanager: + pushop.trmanager.close() finally: + if pushop.trmanager: + pushop.trmanager.release() if locallock is not None: locallock.release() @@ -693,13 +703,11 @@ def _localphasemove(pushop, nodes, phase=phases.public): """move <nodes> to <phase> in the local source repo""" - if pushop.locallocked: - tr = pushop.repo.transaction('push-phase-sync') - try: - phases.advanceboundary(pushop.repo, tr, phase, nodes) - tr.close() - finally: - tr.release() + if pushop.trmanager: + phases.advanceboundary(pushop.repo, + pushop.trmanager.transaction(), + phase, + nodes) else: # repo is not locked, do not change any phases! # Informs the user that phases should have been moved when