mercurial/exchange.py
changeset 37757 2a8ad00b8aed
parent 37663 fc114a16a484
child 37768 5527aa808dea
equal deleted inserted replaced
37756:e7bf5a73e4e1 37757:2a8ad00b8aed
   589     """discover the phase that needs to be pushed
   589     """discover the phase that needs to be pushed
   590 
   590 
   591     (computed for both success and failure case for changesets push)"""
   591     (computed for both success and failure case for changesets push)"""
   592     outgoing = pushop.outgoing
   592     outgoing = pushop.outgoing
   593     unfi = pushop.repo.unfiltered()
   593     unfi = pushop.repo.unfiltered()
   594     remotephases = pushop.remote.listkeys('phases')
   594     remotephases = listkeys(pushop.remote, 'phases')
       
   595 
   595     if (pushop.ui.configbool('ui', '_usedassubrepo')
   596     if (pushop.ui.configbool('ui', '_usedassubrepo')
   596         and remotephases    # server supports phases
   597         and remotephases    # server supports phases
   597         and not pushop.outgoing.missing # no changesets to be pushed
   598         and not pushop.outgoing.missing # no changesets to be pushed
   598         and remotephases.get('publishing', False)):
   599         and remotephases.get('publishing', False)):
   599         # When:
   600         # When:
   636     pushop.outdatedphases = future
   637     pushop.outdatedphases = future
   637     pushop.fallbackoutdatedphases = fallback
   638     pushop.fallbackoutdatedphases = fallback
   638 
   639 
   639 @pushdiscovery('obsmarker')
   640 @pushdiscovery('obsmarker')
   640 def _pushdiscoveryobsmarkers(pushop):
   641 def _pushdiscoveryobsmarkers(pushop):
   641     if (obsolete.isenabled(pushop.repo, obsolete.exchangeopt)
   642     if not obsolete.isenabled(pushop.repo, obsolete.exchangeopt):
   642         and pushop.repo.obsstore
   643         return
   643         and 'obsolete' in pushop.remote.listkeys('namespaces')):
   644 
   644         repo = pushop.repo
   645     if not pushop.repo.obsstore:
   645         # very naive computation, that can be quite expensive on big repo.
   646         return
   646         # However: evolution is currently slow on them anyway.
   647 
   647         nodes = (c.node() for c in repo.set('::%ln', pushop.futureheads))
   648     if 'obsolete' not in listkeys(pushop.remote, 'namespaces'):
   648         pushop.outobsmarkers = pushop.repo.obsstore.relevantmarkers(nodes)
   649         return
       
   650 
       
   651     repo = pushop.repo
       
   652     # very naive computation, that can be quite expensive on big repo.
       
   653     # However: evolution is currently slow on them anyway.
       
   654     nodes = (c.node() for c in repo.set('::%ln', pushop.futureheads))
       
   655     pushop.outobsmarkers = pushop.repo.obsstore.relevantmarkers(nodes)
   649 
   656 
   650 @pushdiscovery('bookmarks')
   657 @pushdiscovery('bookmarks')
   651 def _pushdiscoverybookmarks(pushop):
   658 def _pushdiscoverybookmarks(pushop):
   652     ui = pushop.ui
   659     ui = pushop.ui
   653     repo = pushop.repo.unfiltered()
   660     repo = pushop.repo.unfiltered()
   655     ui.debug("checking for updated bookmarks\n")
   662     ui.debug("checking for updated bookmarks\n")
   656     ancestors = ()
   663     ancestors = ()
   657     if pushop.revs:
   664     if pushop.revs:
   658         revnums = map(repo.changelog.rev, pushop.revs)
   665         revnums = map(repo.changelog.rev, pushop.revs)
   659         ancestors = repo.changelog.ancestors(revnums, inclusive=True)
   666         ancestors = repo.changelog.ancestors(revnums, inclusive=True)
   660     remotebookmark = remote.listkeys('bookmarks')
   667 
       
   668     remotebookmark = listkeys(remote, 'bookmarks')
   661 
   669 
   662     explicit = set([repo._bookmarks.expandname(bookmark)
   670     explicit = set([repo._bookmarks.expandname(bookmark)
   663                     for bookmark in pushop.bookmarks])
   671                     for bookmark in pushop.bookmarks])
   664 
   672 
   665     remotebookmark = bookmod.unhexlifybookmarks(remotebookmark)
   673     remotebookmark = bookmod.unhexlifybookmarks(remotebookmark)
  1166 
  1174 
  1167 def _pushsyncphase(pushop):
  1175 def _pushsyncphase(pushop):
  1168     """synchronise phase information locally and remotely"""
  1176     """synchronise phase information locally and remotely"""
  1169     cheads = pushop.commonheads
  1177     cheads = pushop.commonheads
  1170     # even when we don't push, exchanging phase data is useful
  1178     # even when we don't push, exchanging phase data is useful
  1171     remotephases = pushop.remote.listkeys('phases')
  1179     remotephases = listkeys(pushop.remote, 'phases')
  1172     if (pushop.ui.configbool('ui', '_usedassubrepo')
  1180     if (pushop.ui.configbool('ui', '_usedassubrepo')
  1173         and remotephases    # server supports phases
  1181         and remotephases    # server supports phases
  1174         and pushop.cgresult is None # nothing was pushed
  1182         and pushop.cgresult is None # nothing was pushed
  1175         and remotephases.get('publishing', False)):
  1183         and remotephases.get('publishing', False)):
  1176         # When:
  1184         # When:
  1389 
  1397 
  1390     def release(self):
  1398     def release(self):
  1391         """release transaction if created"""
  1399         """release transaction if created"""
  1392         if self._tr is not None:
  1400         if self._tr is not None:
  1393             self._tr.release()
  1401             self._tr.release()
       
  1402 
       
  1403 def listkeys(remote, namespace):
       
  1404     with remote.commandexecutor() as e:
       
  1405         return e.callcommand('listkeys', {'namespace': namespace}).result()
  1394 
  1406 
  1395 def _fullpullbundle2(repo, pullop):
  1407 def _fullpullbundle2(repo, pullop):
  1396     # The server may send a partial reply, i.e. when inlining
  1408     # The server may send a partial reply, i.e. when inlining
  1397     # pre-computed bundles. In that case, update the common
  1409     # pre-computed bundles. In that case, update the common
  1398     # set based on the results and pull another bundle.
  1410     # set based on the results and pull another bundle.
  1527         return
  1539         return
  1528     if pullop.canusebundle2 and 'listkeys' in pullop.remotebundle2caps:
  1540     if pullop.canusebundle2 and 'listkeys' in pullop.remotebundle2caps:
  1529         # all known bundle2 servers now support listkeys, but lets be nice with
  1541         # all known bundle2 servers now support listkeys, but lets be nice with
  1530         # new implementation.
  1542         # new implementation.
  1531         return
  1543         return
  1532     books = pullop.remote.listkeys('bookmarks')
  1544     books = listkeys(pullop.remote, 'bookmarks')
  1533     pullop.remotebookmarks = bookmod.unhexlifybookmarks(books)
  1545     pullop.remotebookmarks = bookmod.unhexlifybookmarks(books)
  1534 
  1546 
  1535 
  1547 
  1536 @pulldiscovery('changegroup')
  1548 @pulldiscovery('changegroup')
  1537 def _pulldiscoverychangegroup(pullop):
  1549 def _pulldiscoverychangegroup(pullop):
  1739 
  1751 
  1740 def _pullphase(pullop):
  1752 def _pullphase(pullop):
  1741     # Get remote phases data from remote
  1753     # Get remote phases data from remote
  1742     if 'phases' in pullop.stepsdone:
  1754     if 'phases' in pullop.stepsdone:
  1743         return
  1755         return
  1744     remotephases = pullop.remote.listkeys('phases')
  1756     remotephases = listkeys(pullop.remote, 'phases')
  1745     _pullapplyphases(pullop, remotephases)
  1757     _pullapplyphases(pullop, remotephases)
  1746 
  1758 
  1747 def _pullapplyphases(pullop, remotephases):
  1759 def _pullapplyphases(pullop, remotephases):
  1748     """apply phase movement from observed remote state"""
  1760     """apply phase movement from observed remote state"""
  1749     if 'phases' in pullop.stepsdone:
  1761     if 'phases' in pullop.stepsdone:
  1803         return
  1815         return
  1804     pullop.stepsdone.add('obsmarkers')
  1816     pullop.stepsdone.add('obsmarkers')
  1805     tr = None
  1817     tr = None
  1806     if obsolete.isenabled(pullop.repo, obsolete.exchangeopt):
  1818     if obsolete.isenabled(pullop.repo, obsolete.exchangeopt):
  1807         pullop.repo.ui.debug('fetching remote obsolete markers\n')
  1819         pullop.repo.ui.debug('fetching remote obsolete markers\n')
  1808         remoteobs = pullop.remote.listkeys('obsolete')
  1820         remoteobs = listkeys(pullop.remote, 'obsolete')
  1809         if 'dump0' in remoteobs:
  1821         if 'dump0' in remoteobs:
  1810             tr = pullop.gettransaction()
  1822             tr = pullop.gettransaction()
  1811             markers = []
  1823             markers = []
  1812             for key in sorted(remoteobs, reverse=True):
  1824             for key in sorted(remoteobs, reverse=True):
  1813                 if key.startswith('dump'):
  1825                 if key.startswith('dump'):