/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/git/remote.py

  • Committer: Jelmer Vernooij
  • Date: 2019-12-23 01:39:21 UTC
  • mfrom: (7424 work)
  • mto: This revision was merged to the branch mainline in revision 7425.
  • Revision ID: jelmer@jelmer.uk-20191223013921-2kzd0wlcoylgxksk
Merge trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
59
59
 
60
60
from . import (
61
61
    lazy_check_versions,
 
62
    is_github_url,
62
63
    user_agent_for_github,
63
64
    )
64
65
lazy_check_versions()
208
209
        return PermissionDenied(url, message)
209
210
    if message.endswith(' does not appear to be a git repository'):
210
211
        return NotBranchError(url, message)
 
212
    if re.match('(.+) is not a valid repository name',
 
213
                message.splitlines()[0]):
 
214
        return NotBranchError(url, message)
211
215
    m = re.match(r'Permission to ([^ ]+) denied to ([^ ]+)\.', message)
212
216
    if m:
213
217
        return PermissionDenied(m.group(1), 'denied to %s' % m.group(2))
650
654
 
651
655
    def _idx_load_or_generate(self, path):
652
656
        if not os.path.exists(path):
653
 
            pb = ui.ui_factory.nested_progress_bar()
654
 
            try:
 
657
            with ui.ui_factory.nested_progress_bar() as pb:
655
658
                def report_progress(cur, total):
656
659
                    pb.update("generating index", cur, total)
657
 
                self.data.create_index(path,
658
 
                                       progress=report_progress)
659
 
            finally:
660
 
                pb.finished()
 
660
                self.data.create_index(path, progress=report_progress)
661
661
        return load_pack_index(path)
662
662
 
663
663
    def __del__(self):
676
676
        url = urlutils.URL.from_string(transport.external_url())
677
677
        url.user = url.quoted_user = None
678
678
        url.password = url.quoted_password = None
679
 
        super(BzrGitHttpClient, self).__init__(str(url), *args, **kwargs)
 
679
        url = urlutils.split_segment_parameters(str(url))[0]
 
680
        super(BzrGitHttpClient, self).__init__(url, *args, **kwargs)
680
681
 
681
682
    def _http_request(self, url, headers=None, data=None,
682
683
                      allow_compression=False):
691
692
            `redirect_location` properties, and `read` is a consumable read
692
693
            method for the response data.
693
694
        """
694
 
        from breezy.transport.http._urllib2_wrappers import Request
695
 
        headers['User-agent'] = user_agent_for_github()
 
695
        if is_github_url(url):
 
696
            headers['User-agent'] = user_agent_for_github()
696
697
        headers["Pragma"] = "no-cache"
697
698
        if allow_compression:
698
699
            headers["Accept-Encoding"] = "gzip"
699
700
        else:
700
701
            headers["Accept-Encoding"] = "identity"
701
702
 
702
 
        request = Request(
 
703
        response = self.transport.request(
703
704
            ('GET' if data is None else 'POST'),
704
 
            url, data, headers,
705
 
            accepted_errors=[200, 404])
706
 
        request.follow_redirections = True
707
 
 
708
 
        response = self.transport._perform(request)
709
 
 
710
 
        if response.code == 404:
 
705
            url,
 
706
            body=data,
 
707
            headers=headers, retries=8)
 
708
 
 
709
        if response.status == 404:
711
710
            raise NotGitRepository()
712
 
        elif response.code != 200:
 
711
        elif response.status != 200:
713
712
            raise GitProtocolError("unexpected http resp %d for %s" %
714
713
                                   (response.code, url))
715
714
 
727
726
 
728
727
            def __init__(self, response):
729
728
                self._response = response
730
 
                self.status = response.code
 
729
                self.status = response.status
731
730
                self.content_type = response.getheader("Content-Type")
732
 
                self.redirect_location = response.geturl()
 
731
                self.redirect_location = response._actual.geturl()
733
732
 
734
733
            def readlines(self):
735
734
                return self._response.readlines()
736
735
 
737
736
            def close(self):
738
 
                self._response.close()
 
737
                pass
739
738
 
740
739
        return WrapResponse(response), read
741
740
 
742
741
 
 
742
def _git_url_and_path_from_transport(external_url):
 
743
    url, _ = urlutils.split_segment_parameters(external_url)
 
744
    return urlparse.urlsplit(url)
 
745
 
 
746
 
743
747
class RemoteGitControlDirFormat(GitControlDirFormat):
744
748
    """The .git directory control format."""
745
749
 
766
770
        """Open this directory.
767
771
 
768
772
        """
769
 
        # we dont grok readonly - git isn't integrated with transport.
770
 
        url = transport.base
771
 
        if url.startswith('readonly+'):
772
 
            url = url[len('readonly+'):]
773
 
        scheme = urlparse.urlsplit(transport.external_url())[0]
 
773
        split_url = _git_url_and_path_from_transport(transport.external_url())
774
774
        if isinstance(transport, GitSmartTransport):
775
775
            client = transport._get_client()
776
 
            client_path = transport._get_path()
777
 
        elif scheme in ("http", "https"):
 
776
        elif split_url.scheme in ("http", "https"):
778
777
            client = BzrGitHttpClient(transport)
779
 
            client_path, _ = urlutils.split_segment_parameters(transport._path)
780
 
        elif scheme == 'file':
 
778
        elif split_url.scheme in ('file', ):
781
779
            client = dulwich.client.LocalGitClient()
782
 
            client_path = transport.local_abspath('.')
783
780
        else:
784
781
            raise NotBranchError(transport.base)
785
782
        if not _found:
786
783
            pass  # TODO(jelmer): Actually probe for something
787
 
        return RemoteGitDir(transport, self, client, client_path)
 
784
        return RemoteGitDir(transport, self, client, split_url.path)
788
785
 
789
786
    def get_format_description(self):
790
787
        return "Remote Git Repository"
844
841
    def get_file_text(self, path):
845
842
        raise GitSmartRemoteNotSupported(self.get_file_text, self)
846
843
 
 
844
    def list_files(self, include_root=False, from_dir=None, recursive=True):
 
845
        raise GitSmartRemoteNotSupported(self.list_files, self)
 
846
 
847
847
 
848
848
class RemoteGitRepository(GitRepository):
849
849