/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 mapping.py

Try to import nothing other than __init__ when not opening git repositories.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 Canonical Ltd
2
 
# Copyright (C) 2008-2009 Jelmer Vernooij <jelmer@samba.org>
3
 
# Copyright (C) 2008 John Carr
 
1
# Copyright (C) 2007-2008 Canonical Ltd
4
2
#
5
3
# This program is free software; you can redistribute it and/or modify
6
4
# it under the terms of the GNU General Public License as published by
18
16
 
19
17
"""Converters, etc for going between Bazaar and Git ids."""
20
18
 
21
 
from bzrlib import (
22
 
    errors,
23
 
    foreign,
24
 
    urlutils,
25
 
    )
26
 
from bzrlib.inventory import (
27
 
    ROOT_ID,
28
 
    )
 
19
from bzrlib import errors, foreign
 
20
from bzrlib.inventory import ROOT_ID
29
21
from bzrlib.foreign import (
30
 
    ForeignVcs, 
31
 
    VcsMappingRegistry, 
32
 
    ForeignRevision,
33
 
    )
34
 
from bzrlib.plugins.git.foreign import (
35
 
    escape_commit_message,
36
 
    )
37
 
 
 
22
        ForeignVcs, 
 
23
        VcsMappingRegistry, 
 
24
        ForeignRevision,
 
25
        )
38
26
 
39
27
def escape_file_id(file_id):
40
28
    return file_id.replace('_', '__').replace(' ', '_s')
67
55
        return bzr_rev_id[len(cls.revid_prefix)+1:], cls()
68
56
 
69
57
    def generate_file_id(self, path):
70
 
        # Git paths are just bytestrings
71
 
        # We must just hope they are valid UTF-8..
72
 
        assert isinstance(path, str)
73
58
        if path == "":
74
59
            return ROOT_ID
75
 
        return escape_file_id(path)
76
 
 
77
 
    def parse_file_id(self, file_id):
78
 
        if file_id == ROOT_ID:
79
 
            return ""
80
 
        return unescape_file_id(file_id)
 
60
        return escape_file_id(path.encode('utf-8'))
81
61
 
82
62
    def import_commit(self, commit):
83
63
        """Convert a git commit to a bzr revision.
88
68
            raise AssertionError("Commit object can't be None")
89
69
        rev = ForeignRevision(commit.id, self, self.revision_id_foreign_to_bzr(commit.id))
90
70
        rev.parent_ids = tuple([self.revision_id_foreign_to_bzr(p) for p in commit.parents])
91
 
        rev.message = escape_commit_message(commit.message.decode("utf-8", "replace"))
92
 
        rev.committer = escape_commit_message(str(commit.committer).decode("utf-8", "replace"))
 
71
        rev.message = commit.message.decode("utf-8", "replace")
 
72
        rev.committer = str(commit.committer).decode("utf-8", "replace")
93
73
        if commit.committer != commit.author:
94
 
            rev.properties['author'] = escape_commit_message(str(commit.author).decode("utf-8", "replace"))
 
74
            rev.properties['author'] = str(commit.author).decode("utf-8", "replace")
95
75
        rev.timestamp = commit.commit_time
96
76
        rev.timezone = 0
97
77
        return rev
98
78
 
 
79
    def export_commit(self, rev, tree_sha):
 
80
        """Turn a Bazaar revision in to a Git commit
 
81
 
 
82
        :param tree_sha: HACK parameter (until we can retrieve this from the mapping)
 
83
        :return dulwich.objects.Commit represent the revision:
 
84
        """
 
85
        from dulwich.objects import Commit
 
86
        commit = Commit()
 
87
        commit._tree = tree_sha
 
88
        for p in rev.parent_ids:
 
89
            commit._parents.append(self.revision_id_bzr_to_foreign(p))
 
90
        commit._message = rev.message
 
91
        commit._committer = rev.committer
 
92
        if 'author' in rev.properties:
 
93
            commit._author = rev.properties['author']
 
94
        else:
 
95
            commit._author = rev.committer
 
96
        commit._commit_time = long(rev.timestamp)
 
97
        commit.serialize()
 
98
        return commit
 
99
 
99
100
 
100
101
class BzrGitMappingv1(BzrGitMapping):
101
102
    revid_prefix = 'git-v1'
139
140
 
140
141
foreign_git = ForeignGit()
141
142
default_mapping = BzrGitMappingv1()
142
 
 
143
 
 
144
 
def inventory_to_tree_and_blobs(repo, mapping, revision_id):
145
 
    from dulwich.objects import Tree, Blob
146
 
    from bzrlib.inventory import InventoryDirectory, InventoryFile
147
 
    import stat
148
 
    stack = []
149
 
    cur = ""
150
 
    tree = Tree()
151
 
 
152
 
    inv = repo.get_inventory(revision_id)
153
 
 
154
 
    # stack contains the set of trees that we haven't 
155
 
    # finished constructing
156
 
    for path, entry in inv.iter_entries():
157
 
        while stack and not path.startswith(cur):
158
 
            tree.serialize()
159
 
            sha = tree.id
160
 
            yield sha, tree, cur
161
 
            t = (stat.S_IFDIR, urlutils.basename(cur).encode('UTF-8'), sha)
162
 
            cur, tree = stack.pop()
163
 
            tree.add(*t)
164
 
 
165
 
        if type(entry) == InventoryDirectory:
166
 
            stack.append((cur, tree))
167
 
            cur = path
168
 
            tree = Tree()
169
 
 
170
 
        if type(entry) == InventoryFile:
171
 
            #FIXME: We can make potentially make this Lazy to avoid shaing lots of stuff
172
 
            # and having all these objects in memory at once
173
 
            blob = Blob()
174
 
            blob._text = repo.texts.get_record_stream([(entry.file_id, entry.revision)], 'unordered', True).next().get_bytes_as('fulltext')
175
 
            sha = blob.id
176
 
            yield sha, blob, path
177
 
 
178
 
            name = urlutils.basename(path).encode("utf-8")
179
 
            mode = stat.S_IFREG | 0644
180
 
            if entry.executable:
181
 
                mode |= 0111
182
 
            tree.add(mode, name, sha)
183
 
 
184
 
    while len(stack) > 1:
185
 
        tree.serialize()
186
 
        sha = tree.id
187
 
        yield sha, tree, cur
188
 
        t = (stat.S_IFDIR, urlutils.basename(cur).encode('UTF-8'), sha)
189
 
        cur, tree = stack.pop()
190
 
        tree.add(*t)
191
 
 
192
 
    tree.serialize()
193
 
    yield tree.id, tree, cur
194
 
 
195
 
 
196
 
def revision_to_commit(rev, tree_sha, parent_lookup):
197
 
    """Turn a Bazaar revision in to a Git commit
198
 
 
199
 
    :param tree_sha: Tree sha for the commit
200
 
    :param parent_lookup: Function for looking up the GIT sha equiv of a bzr revision
201
 
    :return dulwich.objects.Commit represent the revision:
202
 
    """
203
 
    from dulwich.objects import Commit
204
 
    commit = Commit()
205
 
    commit._tree = tree_sha
206
 
    for p in rev.parent_ids:
207
 
        git_p = parent_lookup(p)
208
 
        if git_p is not None:
209
 
            assert len(git_p) == 40, "unexpected length for %r" % git_p
210
 
            commit._parents.append(git_p)
211
 
    commit._message = rev.message.encode("utf-8")
212
 
    commit._committer = rev.committer.encode("utf-8")
213
 
    commit._author = rev.get_apparent_authors()[0].encode("utf-8")
214
 
    commit._commit_time = long(rev.timestamp)
215
 
    commit.serialize()
216
 
    return commit