/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: Breezy landing bot
  • Author(s): Jelmer Vernooij
  • Date: 2020-06-01 21:57:00 UTC
  • mfrom: (7490.39.3 move-launchpad)
  • Revision ID: breezy.the.bot@gmail.com-20200601215700-joxuzo6w172gq74v
Move launchpad hoster support to the launchpad plugin.

Merged from https://code.launchpad.net/~jelmer/brz/move-launchpad/+merge/384931

Show diffs side-by-side

added added

removed removed

Lines of Context:
76
76
    NoSuchRef,
77
77
    )
78
78
from .mapping import (
79
 
    encode_git_path,
80
79
    mapping_registry,
81
80
    )
82
81
from .object_store import (
116
115
    )
117
116
import os
118
117
import select
 
118
import tempfile
119
119
 
120
120
import urllib.parse as urlparse
121
121
from urllib.parse import splituser
201
201
        return PermissionDenied(url, message)
202
202
    if message.endswith(' does not appear to be a git repository'):
203
203
        return NotBranchError(url, message)
204
 
    if message == 'pre-receive hook declined':
205
 
        return PermissionDenied(url, message)
206
204
    if re.match('(.+) is not a valid repository name',
207
205
                message.splitlines()[0]):
208
206
        return NotBranchError(url, message)
209
 
    if message == (
210
 
            'GitLab: You are not allowed to push code to protected branches '
211
 
            'on this project.'):
212
 
        return PermissionDenied(url, message)
213
207
    m = re.match(r'Permission to ([^ ]+) denied to ([^ ]+)\.', message)
214
208
    if m:
215
209
        return PermissionDenied(m.group(1), 'denied to %s' % m.group(2))
217
211
    return RemoteGitError(message)
218
212
 
219
213
 
220
 
def parse_git_hangup(url, e):
221
 
    """Parse the error lines from a git servers stderr on hangup.
222
 
 
223
 
    :param url: URL of the remote repository
224
 
    :param e: A HangupException
225
 
    """
226
 
    stderr_lines = getattr(e, 'stderr_lines', None)
227
 
    if not stderr_lines:
228
 
        return e
229
 
    if all(line.startswith(b'remote: ') for line in stderr_lines):
230
 
        stderr_lines = [
231
 
            line[len(b'remote: '):] for line in stderr_lines]
232
 
    interesting_lines = [
233
 
        line for line in stderr_lines
234
 
        if line and line.replace(b'=', b'')]
235
 
    if len(interesting_lines) == 1:
236
 
        interesting_line = interesting_lines[0]
237
 
        return parse_git_error(
238
 
            url, interesting_line.decode('utf-8', 'surrogateescape'))
239
 
    return RemoteGitError(
240
 
        b'\n'.join(stderr_lines).decode('utf-8', 'surrogateescape'))
241
 
 
242
 
 
243
214
class GitSmartTransport(Transport):
244
215
 
245
216
    def __init__(self, url, _client=None):
436
407
                write_error,
437
408
                format=(format.encode('ascii') if format else None),
438
409
                subdirs=subdirs,
439
 
                prefix=(encode_git_path(prefix) if prefix else None))
440
 
        except HangupException as e:
441
 
            raise parse_git_hangup(self.transport.external_url(), e)
 
410
                prefix=(prefix.encode('utf-8') if prefix else None))
442
411
        except GitProtocolError as e:
443
412
            raise parse_git_error(self.transport.external_url(), e)
444
413
        finally:
461
430
            self._refs = remote_refs_dict_to_container(
462
431
                result.refs, result.symrefs)
463
432
            return result
464
 
        except HangupException as e:
465
 
            raise parse_git_hangup(self.transport.external_url(), e)
466
433
        except GitProtocolError as e:
467
434
            raise parse_git_error(self.transport.external_url(), e)
468
435
        finally:
484
451
            return self._client.send_pack(
485
452
                self._client_path, get_changed_refs_wrapper,
486
453
                generate_pack_data, progress)
487
 
        except HangupException as e:
488
 
            raise parse_git_hangup(self.transport.external_url(), e)
489
454
        except GitProtocolError as e:
490
455
            raise parse_git_error(self.transport.external_url(), e)
491
456
        finally:
516
481
 
517
482
        def generate_pack_data(have, want, ofs_delta=False):
518
483
            return pack_objects_to_data([])
519
 
        result = self.send_pack(get_changed_refs, generate_pack_data)
520
 
        if result is not None and not isinstance(result, dict):
521
 
            error = result.ref_status.get(refname)
522
 
            if error:
523
 
                raise RemoteGitError(error)
 
484
        self.send_pack(get_changed_refs, generate_pack_data)
524
485
 
525
486
    @property
526
487
    def user_url(self):
590
551
            # No revision supplied by the user, default to the branch
591
552
            # revision
592
553
            revision_id = source.last_revision()
593
 
        else:
594
 
            if not source.repository.has_revision(revision_id):
595
 
                raise NoSuchRevision(source, revision_id)
596
554
 
597
555
        push_result = GitPushResult()
598
556
        push_result.workingtree_updated = None
602
560
        push_result.branch_push_result = None
603
561
        repo = self.find_repository()
604
562
        refname = self._get_selected_ref(name)
605
 
        try:
606
 
            ref_chain, old_sha = self.get_refs_container().follow(refname)
607
 
        except NotBranchError:
 
563
        ref_chain, old_sha = self.get_refs_container().follow(refname)
 
564
        if ref_chain:
 
565
            actual_refname = ref_chain[-1]
 
566
        else:
608
567
            actual_refname = refname
609
 
            old_sha = None
610
 
        else:
611
 
            if ref_chain:
612
 
                actual_refname = ref_chain[-1]
613
 
            else:
614
 
                actual_refname = refname
615
568
        if isinstance(source, GitBranch) and lossy:
616
569
            raise errors.LossyPushToSameVCS(source.controldir, self)
617
570
        source_store = get_object_store(source.repository)
631
584
                    raise errors.NoRoundtrippingSupport(
632
585
                        source, self.open_branch(name=name, nascent_ok=True))
633
586
            if not overwrite:
634
 
                old_sha = remote_refs.get(actual_refname)
635
587
                if remote_divergence(old_sha, new_sha, source_store):
636
588
                    raise DivergedBranches(
637
589
                        source, self.open_branch(name, nascent_ok=True))
651
603
                            new_sha = repo.lookup_bzr_revision_id(revid)[0]
652
604
                        except errors.NoSuchRevision:
653
605
                            continue
654
 
                        else:
655
 
                            if not source.repository.has_revision(revid):
656
 
                                continue
657
606
                    ret[tag_name_to_ref(tagname)] = new_sha
658
607
            return ret
659
608
        with source_store.lock_read():
675
624
                else:
676
625
                    return source_store.generate_pack_data(
677
626
                        have, want, progress=progress, ofs_delta=ofs_delta)
678
 
            dw_result = self.send_pack(get_changed_refs, generate_pack_data)
679
 
            if not isinstance(dw_result, dict):
680
 
                new_refs = dw_result.refs
681
 
                error = dw_result.ref_status.get(actual_refname)
682
 
                if error:
683
 
                    raise RemoteGitError(error)
684
 
                for ref, error in dw_result.ref_status.items():
685
 
                    if error:
686
 
                        trace.warning('unable to open ref %s: %s',
687
 
                                      ref, error)
688
 
            else:  # dulwich < 0.20.4
689
 
                new_refs = dw_result
 
627
            new_refs = self.send_pack(get_changed_refs, generate_pack_data)
690
628
        push_result.new_revid = repo.lookup_foreign_revision_id(
691
629
            new_refs[actual_refname])
692
630
        if old_sha is not None:
891
829
        """
892
830
        commit = self._repository.lookup_bzr_revision_id(
893
831
            self.get_revision_id())[0]
894
 
        import tempfile
895
832
        f = tempfile.SpooledTemporaryFile()
896
833
        # git-upload-archive(1) generaly only supports refs. So let's see if we
897
834
        # can find one.
948
885
 
949
886
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref,
950
887
                      progress=None):
951
 
        import tempfile
952
888
        fd, path = tempfile.mkstemp(suffix=".pack")
953
889
        try:
954
890
            self.fetch_pack(determine_wants, graph_walker,
1007
943
 
1008
944
        def generate_pack_data(have, want, ofs_delta=False):
1009
945
            return pack_objects_to_data([])
1010
 
        result = self.repository.send_pack(
1011
 
            get_changed_refs, generate_pack_data)
1012
 
        if result and not isinstance(result, dict):
1013
 
            error = result.ref_status.get(ref)
1014
 
            if error:
1015
 
                raise RemoteGitError(error)
 
946
        self.repository.send_pack(get_changed_refs, generate_pack_data)
1016
947
 
1017
948
 
1018
949
class RemoteGitBranch(GitBranch):
1096
1027
            return {self.ref: sha}
1097
1028
        def generate_pack_data(have, want, ofs_delta=False):
1098
1029
            return pack_objects_to_data([])
1099
 
        result = self.repository.send_pack(
1100
 
            get_changed_refs, generate_pack_data)
1101
 
        if result is not None and not isinstance(result, dict):
1102
 
            error = result.ref_status.get(self.ref)
1103
 
            if error:
1104
 
                raise RemoteGitError(error)
 
1030
        self.repository.send_pack(get_changed_refs, generate_pack_data)
1105
1031
        self._sha = sha
1106
1032
 
1107
1033