comparison mercurial/httppeer.py @ 50437:3a2df812e1c7

pull: add --remote-hidden option and pass it through peer creation This option will allow to pull changesets that are hidden on the remote. This is useful when looking into a changeset?s evolution history, resolving evolution instability or mirroring a repository. The option is best effort and will only affect the pull when it can. The option will be ignored when it cannot be honored. Support for each type of peer is yet to be implemented. They currently all warn about lack of support. The warning code will get removed as peers gain support for this option. The option is still experimental, so we will have freedom to update the UI or implementation before it graduates out of experimental. Based on a changeset by Pierre-Yves David, which added the option.
author Manuel Jacob <me@manueljacob.de>
date Thu, 04 Apr 2019 18:07:30 +0200
parents ed052780ad5e
children 315f537627c1
comparison
equal deleted inserted replaced
50436:4077d6222cf1 50437:3a2df812e1c7
379 379
380 return respurl, proto, resp 380 return respurl, proto, resp
381 381
382 382
383 class httppeer(wireprotov1peer.wirepeer): 383 class httppeer(wireprotov1peer.wirepeer):
384 def __init__(self, ui, path, url, opener, requestbuilder, caps): 384 def __init__(
385 super().__init__(ui, path=path) 385 self, ui, path, url, opener, requestbuilder, caps, remotehidden=False
386 ):
387 super().__init__(ui, path=path, remotehidden=remotehidden)
388 if remotehidden:
389 msg = _(
390 b"ignoring `--remote-hidden` request\n"
391 b"(access to hidden changeset for http peers not "
392 b"supported yet)\n"
393 )
394 ui.warn(msg)
386 self._url = url 395 self._url = url
387 self._caps = caps 396 self._caps = caps
388 self.limitedarguments = caps is not None and b'httppostargs' not in caps 397 self.limitedarguments = caps is not None and b'httppostargs' not in caps
389 self._urlopener = opener 398 self._urlopener = opener
390 self._requestbuilder = requestbuilder 399 self._requestbuilder = requestbuilder
590 info = {b'v1capabilities': set(rawdata.split())} 599 info = {b'v1capabilities': set(rawdata.split())}
591 600
592 return respurl, info 601 return respurl, info
593 602
594 603
595 def _make_peer(ui, path, opener=None, requestbuilder=urlreq.request): 604 def _make_peer(
605 ui, path, opener=None, requestbuilder=urlreq.request, remotehidden=False
606 ):
596 """Construct an appropriate HTTP peer instance. 607 """Construct an appropriate HTTP peer instance.
597 608
598 ``opener`` is an ``url.opener`` that should be used to establish 609 ``opener`` is an ``url.opener`` that should be used to establish
599 connections, perform HTTP requests. 610 connections, perform HTTP requests.
600 611
613 opener = opener or urlmod.opener(ui, authinfo) 624 opener = opener or urlmod.opener(ui, authinfo)
614 625
615 respurl, info = performhandshake(ui, url, opener, requestbuilder) 626 respurl, info = performhandshake(ui, url, opener, requestbuilder)
616 627
617 return httppeer( 628 return httppeer(
618 ui, path, respurl, opener, requestbuilder, info[b'v1capabilities'] 629 ui,
630 path,
631 respurl,
632 opener,
633 requestbuilder,
634 info[b'v1capabilities'],
635 remotehidden=remotehidden,
619 ) 636 )
620 637
621 638
622 def make_peer(ui, path, create, intents=None, createopts=None): 639 def make_peer(
640 ui, path, create, intents=None, createopts=None, remotehidden=False
641 ):
623 if create: 642 if create:
624 raise error.Abort(_(b'cannot create new http repository')) 643 raise error.Abort(_(b'cannot create new http repository'))
625 try: 644 try:
626 if path.url.scheme == b'https' and not urlmod.has_https: 645 if path.url.scheme == b'https' and not urlmod.has_https:
627 raise error.Abort( 646 raise error.Abort(
628 _(b'Python support for SSL and HTTPS is not installed') 647 _(b'Python support for SSL and HTTPS is not installed')
629 ) 648 )
630 649
631 inst = _make_peer(ui, path) 650 inst = _make_peer(ui, path, remotehidden=remotehidden)
632 651
633 return inst 652 return inst
634 except error.RepoError as httpexception: 653 except error.RepoError as httpexception:
635 try: 654 try:
636 r = statichttprepo.make_peer(ui, b"static-" + path.loc, create) 655 r = statichttprepo.make_peer(ui, b"static-" + path.loc, create)