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

Support converting git objects to bzr objects.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
 
17
from bzrlib import osutils
17
18
from bzrlib.errors import InvalidRevisionId
 
19
from bzrlib.inventory import Inventory
18
20
from bzrlib.repository import InterRepository
19
21
from bzrlib.trace import info
20
22
 
 
23
from bzrlib.plugins.git import git
21
24
from bzrlib.plugins.git.repository import LocalGitRepository, GitRepository, GitFormat
22
25
from bzrlib.plugins.git.remote import RemoteGitRepository
23
26
 
 
27
from dulwich.objects import Commit
 
28
 
24
29
from cStringIO import StringIO
25
30
 
26
31
 
59
64
        return None
60
65
 
61
66
 
62
 
def import_git_object(repo, object):
63
 
    raise NotImplementedError(import_git_object)
 
67
def import_git_blob(repo, mapping, path, blob):
 
68
    """Import a git blob object into a bzr repository.
 
69
 
 
70
    :param repo: bzr repository
 
71
    :param path: Path in the tree
 
72
    :param blob: A git blob
 
73
    """
 
74
    file_id = mapping.generate_file_id(path)
 
75
    repo.texts.add_lines((file_id, blob.id),
 
76
        [], #FIXME 
 
77
        osutils.split_lines(blob.data))
 
78
    inv.add_path(path, "file", file_id)
 
79
 
 
80
 
 
81
def import_git_tree(repo, mapping, path, tree, inv, lookup_object):
 
82
    """Import a git tree object into a bzr repository.
 
83
 
 
84
    :param repo: A Bzr repository object
 
85
    :param path: Path in the tree
 
86
    :param tree: A git tree object
 
87
    :param inv: Inventory object
 
88
    """
 
89
    file_id = mapping.generate_file_id(path)
 
90
    repo.texts.add_lines((file_id, tree.id),
 
91
        [], #FIXME 
 
92
        [])
 
93
    inv.add_path(path, "directory", file_id)
 
94
    for mode, name, hexsha in tree.entries():
 
95
        entry_kind = (mode & 0700000) / 0100000
 
96
        basename = name.decode("utf-8")
 
97
        if path == "":
 
98
            child_path = name
 
99
        else:
 
100
            child_path = urlutils.join(path, name)
 
101
        if entry_kind == 0:
 
102
            import_git_tree(repo, mapping, child_path, lookup_object, inv)
 
103
        elif entry_kind == 1:
 
104
            import_git_blob(repo, mapping, child_path, lookup_object, inv)
 
105
        else:
 
106
            raise AssertionError("Unknown blob kind, perms=%r." % (mode,))
 
107
 
 
108
 
 
109
def import_git_objects(repo, mapping, object_iter):
 
110
    """Import a set of git objects into a bzr repository.
 
111
 
 
112
    :param repo: Bazaar repository
 
113
    :param mapping: Mapping to use
 
114
    :param object_iter: Iterator over Git objects.
 
115
    """
 
116
    # TODO: a more (memory-)efficient implementation of this
 
117
    objects = {}
 
118
    for o in object_iter:
 
119
        objects[o.id] = o
 
120
    root_trees = {}
 
121
    # Find and convert commit objects
 
122
    for o in objects.iterkeys():
 
123
        if isinstance(o, Commit):
 
124
            rev = mapping.import_commit(o)
 
125
            root_trees[rev] = objects[o.tree_sha]
 
126
    # Create the inventory objects
 
127
    for rev, root_tree in root_trees.iteritems():
 
128
        # We have to do this here, since we have to walk the tree and 
 
129
        # we need to make sure to import the blobs / trees with the riht 
 
130
        # path; this may involve adding them more than once.
 
131
        inv = Inventory()
 
132
        def lookup_object(sha):
 
133
            # TODO: need to lookup bzr objects as sha..
 
134
            return objects[sha]
 
135
        import_git_tree(repo, mapping, "", tree, inv, lookup_object)
 
136
        repo.add_revision(rev.revision_id, rev, inv)
64
137
 
65
138
 
66
139
class InterGitRepository(InterRepository):
93
166
        graph_walker = BzrFetchGraphWalker(self.target, mapping)
94
167
        self.target.lock_write()
95
168
        try:
96
 
            for o in self.source.fetch_objects(determine_wants, graph_walker, progress):
97
 
                import_git_object(o)
 
169
            import_git_objects(self.target, mapping,
 
170
                self.source.fetch_objects(determine_wants, graph_walker, 
 
171
                    progress))
98
172
        finally:
99
173
            self.target.unlock()
100
174
 
102
176
    def is_compatible(source, target):
103
177
        """Be compatible with GitRepository."""
104
178
        # FIXME: Also check target uses VersionedFile
105
 
        return isinstance(source, LocalGitRepository) and target.supports_rich_root()
 
179
        return (isinstance(source, LocalGitRepository) and 
 
180
                target.supports_rich_root())