mercurial/exchange.py
changeset 23382 a81c76106d90
parent 23282 6c1351352b6c
parent 23376 2e65da5f80df
child 23436 52db731b964d
equal deleted inserted replaced
23380:90cc552ceed5 23382:a81c76106d90
   679 
   679 
   680         pushop.stepsdone.add('phases')
   680         pushop.stepsdone.add('phases')
   681 
   681 
   682         # filter heads already turned public by the push
   682         # filter heads already turned public by the push
   683         outdated = [c for c in outdated if c.node() not in pheads]
   683         outdated = [c for c in outdated if c.node() not in pheads]
   684         b2caps = bundle2.bundle2caps(pushop.remote)
   684         # fallback to independent pushkey command
   685         if 'b2x:pushkey' in b2caps:
   685         for newremotehead in outdated:
   686             # server supports bundle2, let's do a batched push through it
   686             r = pushop.remote.pushkey('phases',
   687             #
   687                                       newremotehead.hex(),
   688             # This will eventually be unified with the changesets bundle2 push
   688                                       str(phases.draft),
   689             bundler = bundle2.bundle20(pushop.ui, b2caps)
   689                                       str(phases.public))
   690             capsblob = bundle2.encodecaps(bundle2.getrepocaps(pushop.repo))
   690             if not r:
   691             bundler.newpart('b2x:replycaps', data=capsblob)
   691                 pushop.ui.warn(_('updating %s to public failed!\n')
   692             part2node = []
   692                                % newremotehead)
   693             enc = pushkey.encode
       
   694             for newremotehead in outdated:
       
   695                 part = bundler.newpart('b2x:pushkey')
       
   696                 part.addparam('namespace', enc('phases'))
       
   697                 part.addparam('key', enc(newremotehead.hex()))
       
   698                 part.addparam('old', enc(str(phases.draft)))
       
   699                 part.addparam('new', enc(str(phases.public)))
       
   700                 part2node.append((part.id, newremotehead))
       
   701             stream = util.chunkbuffer(bundler.getchunks())
       
   702             try:
       
   703                 reply = pushop.remote.unbundle(stream, ['force'], 'push')
       
   704                 op = bundle2.processbundle(pushop.repo, reply)
       
   705             except error.BundleValueError, exc:
       
   706                 raise util.Abort('missing support for %s' % exc)
       
   707             for partid, node in part2node:
       
   708                 partrep = op.records.getreplies(partid)
       
   709                 results = partrep['pushkey']
       
   710                 assert len(results) <= 1
       
   711                 msg = None
       
   712                 if not results:
       
   713                     msg = _('server ignored update of %s to public!\n') % node
       
   714                 elif not int(results[0]['return']):
       
   715                     msg = _('updating %s to public failed!\n') % node
       
   716                 if msg is not None:
       
   717                     pushop.ui.warn(msg)
       
   718 
       
   719         else:
       
   720             # fallback to independent pushkey command
       
   721             for newremotehead in outdated:
       
   722                 r = pushop.remote.pushkey('phases',
       
   723                                           newremotehead.hex(),
       
   724                                           str(phases.draft),
       
   725                                           str(phases.public))
       
   726                 if not r:
       
   727                     pushop.ui.warn(_('updating %s to public failed!\n')
       
   728                                    % newremotehead)
       
   729 
   693 
   730 def _localphasemove(pushop, nodes, phase=phases.public):
   694 def _localphasemove(pushop, nodes, phase=phases.public):
   731     """move <nodes> to <phase> in the local source repo"""
   695     """move <nodes> to <phase> in the local source repo"""
   732     if pushop.locallocked:
   696     if pushop.locallocked:
   733         tr = pushop.repo.transaction('push-phase-sync')
   697         tr = pushop.repo.transaction('push-phase-sync')