/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/mapping.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:
46
46
    )
47
47
from .errors import (
48
48
    NoPushSupport,
49
 
    UnknownCommitExtra,
50
 
    UnknownMercurialCommitExtra,
51
49
    )
52
50
from .hg import (
53
51
    format_hg_metadata,
57
55
    extract_bzr_metadata,
58
56
    inject_bzr_metadata,
59
57
    CommitSupplement,
60
 
    deserialize_fileid_map,
61
 
    serialize_fileid_map,
62
58
    )
63
59
 
64
60
 
75
71
ROOT_ID = b"TREE_ROOT"
76
72
 
77
73
 
 
74
class UnknownCommitExtra(errors.BzrError):
 
75
    _fmt = "Unknown extra fields in %(object)r: %(fields)r."
 
76
 
 
77
    def __init__(self, object, fields):
 
78
        errors.BzrError.__init__(self)
 
79
        self.object = object
 
80
        self.fields = ",".join(fields)
 
81
 
 
82
 
 
83
class UnknownMercurialCommitExtra(errors.BzrError):
 
84
    _fmt = "Unknown mercurial extra fields in %(object)r: %(fields)r."
 
85
 
 
86
    def __init__(self, object, fields):
 
87
        errors.BzrError.__init__(self)
 
88
        self.object = object
 
89
        self.fields = b",".join(fields)
 
90
 
 
91
 
78
92
def escape_file_id(file_id):
79
93
    file_id = file_id.replace(b'_', b'__')
80
94
    file_id = file_id.replace(b' ', b'_s')
131
145
    """Class that maps between Git and Bazaar semantics."""
132
146
    experimental = False
133
147
 
134
 
    BZR_FILE_IDS_FILE = None
135
 
 
136
148
    BZR_DUMMY_FILE = None
137
149
 
138
150
    def is_special_file(self, filename):
139
 
        return (filename in (self.BZR_FILE_IDS_FILE, self.BZR_DUMMY_FILE))
 
151
        return (filename in (self.BZR_DUMMY_FILE, ))
140
152
 
141
153
    def __init__(self):
142
154
        super(BzrGitMapping, self).__init__(foreign_vcs_git)
257
269
    def _encode_commit_message(self, rev, message, encoding):
258
270
        return message.encode(encoding)
259
271
 
260
 
    def export_fileid_map(self, fileid_map):
261
 
        """Export a file id map to a fileid map.
262
 
 
263
 
        :param fileid_map: File id map, mapping paths to file ids
264
 
        :return: A Git blob object (or None if there are no entries)
265
 
        """
266
 
        from dulwich.objects import Blob
267
 
        b = Blob()
268
 
        b.set_raw_chunks(serialize_fileid_map(fileid_map))
269
 
        return b
270
 
 
271
272
    def export_commit(self, rev, tree_sha, parent_lookup, lossy,
272
273
                      verifiers):
273
274
        """Turn a Bazaar revision in to a Git commit
370
371
                 for l in rev.properties[u'git-extra'].splitlines()])
371
372
        return commit
372
373
 
373
 
    def import_fileid_map(self, blob):
374
 
        """Convert a git file id map blob.
375
 
 
376
 
        :param blob: Git blob object with fileid map
377
 
        :return: Dictionary mapping paths to file ids
378
 
        """
379
 
        return deserialize_fileid_map(blob.data)
380
 
 
381
374
    def get_revision_id(self, commit):
382
375
        if commit.encoding:
383
376
            encoding = commit.encoding.decode('ascii')
393
386
                return metadata.revision_id
394
387
        return self.revision_id_foreign_to_bzr(commit.id)
395
388
 
396
 
    def import_commit(self, commit, lookup_parent_revid):
 
389
    def import_commit(self, commit, lookup_parent_revid, strict=True):
397
390
        """Convert a git commit to a bzr revision.
398
391
 
399
392
        :return: a `breezy.revision.Revision` object, foreign revid and a
467
460
                extra_lines.append(k + b' ' + v + b'\n')
468
461
            elif k == HG_EXTRA:
469
462
                hgk, hgv = v.split(b':', 1)
470
 
                if hgk not in (HG_EXTRA_AMEND_SOURCE, ):
 
463
                if hgk not in (HG_EXTRA_AMEND_SOURCE, ) and strict:
471
464
                    raise UnknownMercurialCommitExtra(commit, [hgk])
472
465
                extra_lines.append(k + b' ' + v + b'\n')
473
466
            else:
474
467
                unknown_extra_fields.append(k)
475
 
        if unknown_extra_fields:
 
468
        if unknown_extra_fields and strict:
476
469
            raise UnknownCommitExtra(
477
470
                commit,
478
471
                [f.decode('ascii', 'replace') for f in unknown_extra_fields])
480
473
            rev.properties[u'git-extra'] = b''.join(extra_lines)
481
474
        return rev, roundtrip_revid, verifiers
482
475
 
483
 
    def get_fileid_map(self, lookup_object, tree_sha):
484
 
        """Obtain a fileid map for a particular tree.
485
 
 
486
 
        :param lookup_object: Function for looking up an object
487
 
        :param tree_sha: SHA of the root tree
488
 
        :return: GitFileIdMap instance
489
 
        """
490
 
        try:
491
 
            file_id_map_sha = lookup_object(
492
 
                tree_sha)[self.BZR_FILE_IDS_FILE][1]
493
 
        except KeyError:
494
 
            file_ids = {}
495
 
        else:
496
 
            file_ids = self.import_fileid_map(lookup_object(file_id_map_sha))
497
 
        return GitFileIdMap(file_ids, self)
498
 
 
499
476
 
500
477
class BzrGitMappingv1(BzrGitMapping):
501
478
    revid_prefix = b'git-v1'
508
485
class BzrGitMappingExperimental(BzrGitMappingv1):
509
486
    revid_prefix = b'git-experimental'
510
487
    experimental = True
511
 
    roundtripping = True
512
 
 
513
 
    BZR_FILE_IDS_FILE = '.bzrfileids'
 
488
    roundtripping = False
514
489
 
515
490
    BZR_DUMMY_FILE = '.bzrdummy'
516
491
 
528
503
        ret += self._generate_git_svn_metadata(rev, encoding)
529
504
        return ret
530
505
 
531
 
    def import_commit(self, commit, lookup_parent_revid):
 
506
    def import_commit(self, commit, lookup_parent_revid, strict=True):
532
507
        rev, roundtrip_revid, verifiers = super(
533
508
            BzrGitMappingExperimental, self).import_commit(
534
 
                commit, lookup_parent_revid)
 
509
                commit, lookup_parent_revid, strict)
535
510
        rev.properties[u'converted_revision'] = "git %s\n" % commit.id
536
511
        return rev, roundtrip_revid, verifiers
537
512
 
674
649
    return (full_url, int(rev), uuid)
675
650
 
676
651
 
677
 
class GitFileIdMap(object):
678
 
 
679
 
    def __init__(self, file_ids, mapping):
680
 
        self.file_ids = file_ids
681
 
        self.paths = None
682
 
        self.mapping = mapping
683
 
 
684
 
    def set_file_id(self, path, file_id):
685
 
        if type(path) is not str:
686
 
            raise TypeError(path)
687
 
        if not isinstance(file_id, bytes):
688
 
            raise TypeError(file_id)
689
 
        self.file_ids[path] = file_id
690
 
 
691
 
    def lookup_file_id(self, path):
692
 
        if not isinstance(path, text_type):
693
 
            raise TypeError(path)
694
 
        try:
695
 
            file_id = self.file_ids[path]
696
 
        except KeyError:
697
 
            file_id = self.mapping.generate_file_id(path)
698
 
        if not isinstance(file_id, bytes):
699
 
            raise TypeError(file_id)
700
 
        return file_id
701
 
 
702
 
    def lookup_path(self, file_id):
703
 
        if self.paths is None:
704
 
            self.paths = {}
705
 
            for k, v in viewitems(self.file_ids):
706
 
                self.paths[v] = k
707
 
        try:
708
 
            path = self.paths[file_id]
709
 
        except KeyError:
710
 
            return self.mapping.parse_file_id(file_id)
711
 
        else:
712
 
            if not isinstance(path, text_type):
713
 
                raise TypeError(path)
714
 
            return path
715
 
 
716
 
    def copy(self):
717
 
        return self.__class__(dict(self.file_ids), self.mapping)
718
 
 
719
 
 
720
652
def needs_roundtripping(repo, revid):
721
653
    try:
722
654
        mapping_registry.parse_revision_id(revid)