comparison mercurial/bundle2.py @ 34820:a95067b1dca6

phase: introduce a new 'check:phases' part This part checks if revisions are still in the same phase as when the bundle was generated. This is similar to what 'check:heads' or 'check:updated-heads' bundle2 part achieves for changesets. We needs seems before we can move away from pushkey usage from phase since pushkey has it own built-in push-race detection.
author Boris Feld <boris.feld@octobus.net>
date Wed, 11 Oct 2017 07:13:02 +0200
parents 5f79f5f8487a
children 241d9caca11e
comparison
equal deleted inserted replaced
34819:eb6375651974 34820:a95067b1dca6
155 155
156 from .i18n import _ 156 from .i18n import _
157 from . import ( 157 from . import (
158 changegroup, 158 changegroup,
159 error, 159 error,
160 node as nodemod,
160 obsolete, 161 obsolete,
161 phases, 162 phases,
162 pushkey, 163 pushkey,
163 pycompat, 164 pycompat,
164 tags, 165 tags,
1747 for h in heads: 1748 for h in heads:
1748 if h not in currentheads: 1749 if h not in currentheads:
1749 raise error.PushRaced('repository changed while pushing - ' 1750 raise error.PushRaced('repository changed while pushing - '
1750 'please try again') 1751 'please try again')
1751 1752
1753 @parthandler('check:phases')
1754 def handlecheckphases(op, inpart):
1755 """check that phase boundaries of the repository did not change
1756
1757 This is used to detect a push race.
1758 """
1759 phasetonodes = phases.binarydecode(inpart)
1760 unfi = op.repo.unfiltered()
1761 cl = unfi.changelog
1762 phasecache = unfi._phasecache
1763 msg = ('repository changed while pushing - please try again '
1764 '(%s is %s expected %s)')
1765 for expectedphase, nodes in enumerate(phasetonodes):
1766 for n in nodes:
1767 actualphase = phasecache.phase(unfi, cl.rev(n))
1768 if actualphase != expectedphase:
1769 finalmsg = msg % (nodemod.short(n),
1770 phases.phasenames[actualphase],
1771 phases.phasenames[expectedphase])
1772 raise error.PushRaced(finalmsg)
1773
1752 @parthandler('output') 1774 @parthandler('output')
1753 def handleoutput(op, inpart): 1775 def handleoutput(op, inpart):
1754 """forward output captured on the server to the client""" 1776 """forward output captured on the server to the client"""
1755 for line in inpart.read().splitlines(): 1777 for line in inpart.read().splitlines():
1756 op.ui.status(_('remote: %s\n') % line) 1778 op.ui.status(_('remote: %s\n') % line)