/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: 2020-05-24 00:39:50 UTC
  • mto: This revision was merged to the branch mainline in revision 7504.
  • Revision ID: jelmer@jelmer.uk-20200524003950-bbc545r76vc5yajg
Add github action.

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
204
204
    if re.match('(.+) is not a valid repository name',
205
205
                message.splitlines()[0]):
206
206
        return NotBranchError(url, message)
207
 
    if message == (
208
 
            'GitLab: You are not allowed to push code to protected branches '
209
 
            'on this project.'):
210
 
        return PermissionDenied(url, message)
211
207
    m = re.match(r'Permission to ([^ ]+) denied to ([^ ]+)\.', message)
212
208
    if m:
213
209
        return PermissionDenied(m.group(1), 'denied to %s' % m.group(2))
215
211
    return RemoteGitError(message)
216
212
 
217
213
 
218
 
def parse_git_hangup(url, e):
219
 
    """Parse the error lines from a git servers stderr on hangup.
220
 
 
221
 
    :param url: URL of the remote repository
222
 
    :param e: A HangupException
223
 
    """
224
 
    stderr_lines = getattr(e, 'stderr_lines', None)
225
 
    if not stderr_lines:
226
 
        return e
227
 
    if all(line.startswith(b'remote: ') for line in stderr_lines):
228
 
        stderr_lines = [
229
 
            line[len(b'remote: '):] for line in stderr_lines]
230
 
    interesting_lines = [
231
 
        line for line in stderr_lines
232
 
        if line and line.replace(b'=', b'')]
233
 
    if len(interesting_lines) == 1:
234
 
        interesting_line = interesting_lines[0]
235
 
        return parse_git_error(
236
 
            url, interesting_line.decode('utf-8', 'surrogateescape'))
237
 
    return RemoteGitError(
238
 
        b'\n'.join(stderr_lines).decode('utf-8', 'surrogateescape'))
239
 
 
240
 
 
241
214
class GitSmartTransport(Transport):
242
215
 
243
216
    def __init__(self, url, _client=None):
434
407
                write_error,
435
408
                format=(format.encode('ascii') if format else None),
436
409
                subdirs=subdirs,
437
 
                prefix=(encode_git_path(prefix) if prefix else None))
438
 
        except HangupException as e:
439
 
            raise parse_git_hangup(self.transport.external_url(), e)
 
410
                prefix=(prefix.encode('utf-8') if prefix else None))
440
411
        except GitProtocolError as e:
441
412
            raise parse_git_error(self.transport.external_url(), e)
442
413
        finally:
459
430
            self._refs = remote_refs_dict_to_container(
460
431
                result.refs, result.symrefs)
461
432
            return result
462
 
        except HangupException as e:
463
 
            raise parse_git_hangup(self.transport.external_url(), e)
464
433
        except GitProtocolError as e:
465
434
            raise parse_git_error(self.transport.external_url(), e)
466
435
        finally:
482
451
            return self._client.send_pack(
483
452
                self._client_path, get_changed_refs_wrapper,
484
453
                generate_pack_data, progress)
485
 
        except HangupException as e:
486
 
            raise parse_git_hangup(self.transport.external_url(), e)
487
454
        except GitProtocolError as e:
488
455
            raise parse_git_error(self.transport.external_url(), e)
489
456
        finally:
514
481
 
515
482
        def generate_pack_data(have, want, ofs_delta=False):
516
483
            return pack_objects_to_data([])
517
 
        result = self.send_pack(get_changed_refs, generate_pack_data)
518
 
        if result is not None and not isinstance(result, dict):
519
 
            error = result.ref_status.get(refname)
520
 
            if error:
521
 
                raise RemoteGitError(error)
 
484
        self.send_pack(get_changed_refs, generate_pack_data)
522
485
 
523
486
    @property
524
487
    def user_url(self):
588
551
            # No revision supplied by the user, default to the branch
589
552
            # revision
590
553
            revision_id = source.last_revision()
591
 
        else:
592
 
            if not source.repository.has_revision(revision_id):
593
 
                raise NoSuchRevision(source, revision_id)
594
554
 
595
555
        push_result = GitPushResult()
596
556
        push_result.workingtree_updated = None
643
603
                            new_sha = repo.lookup_bzr_revision_id(revid)[0]
644
604
                        except errors.NoSuchRevision:
645
605
                            continue
646
 
                        else:
647
 
                            if not source.repository.has_revision(revid):
648
 
                                continue
649
606
                    ret[tag_name_to_ref(tagname)] = new_sha
650
607
            return ret
651
608
        with source_store.lock_read():
667
624
                else:
668
625
                    return source_store.generate_pack_data(
669
626
                        have, want, progress=progress, ofs_delta=ofs_delta)
670
 
            dw_result = self.send_pack(get_changed_refs, generate_pack_data)
671
 
            if not isinstance(dw_result, dict):
672
 
                new_refs = dw_result.refs
673
 
                error = dw_result.ref_status.get(actual_refname)
674
 
                if error:
675
 
                    raise RemoteGitError(error)
676
 
                for ref, error in dw_result.ref_status.items():
677
 
                    if error:
678
 
                        trace.warning('unable to open ref %s: %s',
679
 
                                      ref, error)
680
 
            else:  # dulwich < 0.20.4
681
 
                new_refs = dw_result
 
627
            new_refs = self.send_pack(get_changed_refs, generate_pack_data)
682
628
        push_result.new_revid = repo.lookup_foreign_revision_id(
683
629
            new_refs[actual_refname])
684
630
        if old_sha is not None:
883
829
        """
884
830
        commit = self._repository.lookup_bzr_revision_id(
885
831
            self.get_revision_id())[0]
886
 
        import tempfile
887
832
        f = tempfile.SpooledTemporaryFile()
888
833
        # git-upload-archive(1) generaly only supports refs. So let's see if we
889
834
        # can find one.
940
885
 
941
886
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref,
942
887
                      progress=None):
943
 
        import tempfile
944
888
        fd, path = tempfile.mkstemp(suffix=".pack")
945
889
        try:
946
890
            self.fetch_pack(determine_wants, graph_walker,
999
943
 
1000
944
        def generate_pack_data(have, want, ofs_delta=False):
1001
945
            return pack_objects_to_data([])
1002
 
        result = self.repository.send_pack(
1003
 
            get_changed_refs, generate_pack_data)
1004
 
        if result and not isinstance(result, dict):
1005
 
            error = result.ref_status.get(ref)
1006
 
            if error:
1007
 
                raise RemoteGitError(error)
 
946
        self.repository.send_pack(get_changed_refs, generate_pack_data)
1008
947
 
1009
948
 
1010
949
class RemoteGitBranch(GitBranch):
1088
1027
            return {self.ref: sha}
1089
1028
        def generate_pack_data(have, want, ofs_delta=False):
1090
1029
            return pack_objects_to_data([])
1091
 
        result = self.repository.send_pack(
1092
 
            get_changed_refs, generate_pack_data)
1093
 
        if result is not None and not isinstance(result, dict):
1094
 
            error = result.ref_status.get(self.ref)
1095
 
            if error:
1096
 
                raise RemoteGitError(error)
 
1030
        self.repository.send_pack(get_changed_refs, generate_pack_data)
1097
1031
        self._sha = sha
1098
1032
 
1099
1033