Mercurial > public > mercurial-scm > hg
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) |