mercurial/exchange.py
changeset 37498 aacfca6f9767
parent 37237 f7d3915d5b3a
child 37635 cc8c06835097
equal deleted inserted replaced
37497:1541e1a8e87d 37498:aacfca6f9767
  1373     def release(self):
  1373     def release(self):
  1374         """release transaction if created"""
  1374         """release transaction if created"""
  1375         if self._tr is not None:
  1375         if self._tr is not None:
  1376             self._tr.release()
  1376             self._tr.release()
  1377 
  1377 
       
  1378 def _fullpullbundle2(repo, pullop):
       
  1379     # The server may send a partial reply, i.e. when inlining
       
  1380     # pre-computed bundles. In that case, update the common
       
  1381     # set based on the results and pull another bundle.
       
  1382     #
       
  1383     # There are two indicators that the process is finished:
       
  1384     # - no changeset has been added, or
       
  1385     # - all remote heads are known locally.
       
  1386     # The head check must use the unfiltered view as obsoletion
       
  1387     # markers can hide heads.
       
  1388     unfi = repo.unfiltered()
       
  1389     unficl = unfi.changelog
       
  1390     def headsofdiff(h1, h2):
       
  1391         """Returns heads(h1 % h2)"""
       
  1392         res = unfi.set('heads(%ln %% %ln)', h1, h2)
       
  1393         return set(ctx.node() for ctx in res)
       
  1394     def headsofunion(h1, h2):
       
  1395         """Returns heads((h1 + h2) - null)"""
       
  1396         res = unfi.set('heads((%ln + %ln - null))', h1, h2)
       
  1397         return set(ctx.node() for ctx in res)
       
  1398     while True:
       
  1399         old_heads = unficl.heads()
       
  1400         clstart = len(unficl)
       
  1401         _pullbundle2(pullop)
       
  1402         if changegroup.NARROW_REQUIREMENT in repo.requirements:
       
  1403             # XXX narrow clones filter the heads on the server side during
       
  1404             # XXX getbundle and result in partial replies as well.
       
  1405             # XXX Disable pull bundles in this case as band aid to avoid
       
  1406             # XXX extra round trips.
       
  1407             break
       
  1408         if clstart == len(unficl):
       
  1409             break
       
  1410         if all(unficl.hasnode(n) for n in pullop.rheads):
       
  1411             break
       
  1412         new_heads = headsofdiff(unficl.heads(), old_heads)
       
  1413         pullop.common = headsofunion(new_heads, pullop.common)
       
  1414         pullop.rheads = set(pullop.rheads) - pullop.common
       
  1415 
  1378 def pull(repo, remote, heads=None, force=False, bookmarks=(), opargs=None,
  1416 def pull(repo, remote, heads=None, force=False, bookmarks=(), opargs=None,
  1379          streamclonerequested=None):
  1417          streamclonerequested=None):
  1380     """Fetch repository data from a remote.
  1418     """Fetch repository data from a remote.
  1381 
  1419 
  1382     This is the main function used to retrieve data from a remote repository.
  1420     This is the main function used to retrieve data from a remote repository.
  1418         # before discovery to avoid extra work.
  1456         # before discovery to avoid extra work.
  1419         _maybeapplyclonebundle(pullop)
  1457         _maybeapplyclonebundle(pullop)
  1420         streamclone.maybeperformlegacystreamclone(pullop)
  1458         streamclone.maybeperformlegacystreamclone(pullop)
  1421         _pulldiscovery(pullop)
  1459         _pulldiscovery(pullop)
  1422         if pullop.canusebundle2:
  1460         if pullop.canusebundle2:
  1423             _pullbundle2(pullop)
  1461             _fullpullbundle2(repo, pullop)
  1424         _pullchangeset(pullop)
  1462         _pullchangeset(pullop)
  1425         _pullphase(pullop)
  1463         _pullphase(pullop)
  1426         _pullbookmarks(pullop)
  1464         _pullbookmarks(pullop)
  1427         _pullobsolete(pullop)
  1465         _pullobsolete(pullop)
  1428 
  1466