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

Specify inventory and texts to inventory_to_tree_and_blobs rather than full repository.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2009 Canonical Ltd
 
1
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
16
16
 
17
17
"""Map from Git sha's to Bazaar objects."""
18
18
 
19
 
import bzrlib
20
 
 
21
 
from bzrlib import ui
22
 
 
23
 
from bzrlib.errors import NoSuchRevision
 
19
from dulwich.objects import (
 
20
    Blob,
 
21
    Tree,
 
22
    )
 
23
import stat
 
24
 
 
25
from bzrlib import (
 
26
    errors,
 
27
    ui,
 
28
    )
24
29
 
25
30
from bzrlib.plugins.git.mapping import (
26
31
    inventory_to_tree_and_blobs,
 
32
    mapping_registry,
27
33
    revision_to_commit,
28
34
    )
29
 
from bzrlib.plugins.git.shamap import GitShaMap
30
 
 
31
 
from dulwich.objects import (
32
 
    Blob,
 
35
from bzrlib.plugins.git.shamap import (
 
36
    SqliteGitShaMap,
33
37
    )
34
38
 
35
39
 
36
 
class GitObjectConverter(object):
 
40
class BazaarObjectStore(object):
 
41
    """A Git-style object store backed onto a Bazaar repository."""
37
42
 
38
43
    def __init__(self, repository, mapping=None):
39
44
        self.repository = repository
41
46
            self.mapping = self.repository.get_mapping()
42
47
        else:
43
48
            self.mapping = mapping
44
 
        self._idmap = GitShaMap(self.repository._transport)
 
49
        self._idmap = SqliteGitShaMap(self.repository._transport)
45
50
 
46
51
    def _update_sha_map(self):
47
52
        all_revids = self.repository.all_revision_ids()
48
53
        graph = self.repository.get_graph()
49
54
        present_revids = set(self._idmap.revids())
 
55
        missing_revids = [revid for revid in graph.iter_topo_order(all_revids) if revid not in present_revids]
50
56
        pb = ui.ui_factory.nested_progress_bar()
51
57
        try:
52
 
            for i, revid in enumerate(graph.iter_topo_order(all_revids)):
53
 
                if revid in present_revids:
54
 
                    continue
55
 
                pb.update("updating git map", i, len(all_revids))
 
58
            for i, revid in enumerate(missing_revids):
 
59
                pb.update("updating git map", i, len(missing_revids))
56
60
                self._update_sha_map_revision(revid)
57
61
        finally:
 
62
            self._idmap.commit()
58
63
            pb.finished()
59
64
 
60
65
    def _update_sha_map_revision(self, revid):
61
66
        inv = self.repository.get_inventory(revid)
62
 
        objects = inventory_to_tree_and_blobs(self.repository, self.mapping, revid)
 
67
        objects = inventory_to_tree_and_blobs(inv, self.repository.texts, self.mapping)
63
68
        for sha, o, path in objects:
64
69
            if path == "":
65
70
                tree_sha = sha
66
71
            ie = inv[inv.path2id(path)]
67
72
            if ie.kind in ("file", "symlink"):
68
 
                self._idmap.add_entry(sha, "blob", (ie.file_id, ie.revision))
 
73
                git_kind = "blob"
 
74
            elif ie.kind == "directory":
 
75
                git_kind = "tree"
69
76
            else:
70
 
                self._idmap.add_entry(sha, "tree", (ie.file_id, ie.revision))
 
77
                raise AssertionError()
 
78
            self._idmap.add_entry(sha, git_kind, (ie.file_id, ie.revision))
71
79
        rev = self.repository.get_revision(revid)
72
 
        commit_obj = revision_to_commit(rev, tree_sha, self._idmap._parent_lookup)
73
 
        self._idmap.add_entry(commit_obj.sha().hexdigest(), "commit", (revid, tree_sha))
 
80
        commit_obj = revision_to_commit(rev, tree_sha,
 
81
            self._idmap._parent_lookup)
 
82
        try:
 
83
            foreign_revid, mapping = mapping_registry.parse_revision_id(revid)
 
84
        except errors.InvalidRevisionId:
 
85
            pass
 
86
        else:
 
87
            if foreign_revid != commit_obj.id:
 
88
                raise AssertionError("recreated git commit had different sha1: expected %s, got %s" % (foreign_revid, commit_obj.id))
 
89
        self._idmap.add_entry(commit_obj.id, "commit", (revid, tree_sha))
74
90
 
75
91
    def _get_blob(self, fileid, revision):
76
 
        text = self.repository.texts.get_record_stream([(fileid, revision)], "unordered", True).next().get_bytes_as("fulltext")
 
92
        """Return a Git Blob object from a fileid and revision stored in bzr.
 
93
        
 
94
        :param fileid: File id of the text
 
95
        :param revision: Revision of the text
 
96
        """
 
97
        text = self.repository.texts.get_record_stream([(fileid, revision)],
 
98
            "unordered", True).next().get_bytes_as("fulltext")
77
99
        blob = Blob()
78
100
        blob._text = text
79
101
        return blob
80
102
 
81
 
    def _get_tree(self, fileid, revid):
82
 
        raise NotImplementedError(self._get_tree)
 
103
    def _get_tree(self, fileid, revid, inv=None):
 
104
        """Return a Git Tree object from a file id and a revision stored in bzr.
 
105
 
 
106
        :param fileid: fileid in the tree.
 
107
        :param revision: Revision of the tree.
 
108
        """
 
109
        if inv is None:
 
110
            inv = self.repository.get_inventory(revid)
 
111
        tree = Tree()
 
112
        for name, ie in inv[fileid].children.iteritems():
 
113
            if ie.kind == "directory":
 
114
                subtree = self._get_tree(ie.file_id, revid, inv)
 
115
                tree.add(stat.S_IFDIR, name.encode('UTF-8'), subtree.id)
 
116
            elif ie.kind == "file":
 
117
                blob = self._get_blob(ie.file_id, ie.revision)
 
118
                mode = stat.S_IFREG | 0644
 
119
                if ie.executable:
 
120
                    mode |= 0111
 
121
                tree.add(mode, name.encode('UTF-8'), blob.id)
 
122
            elif ie.kind == "symlink":
 
123
                raise AssertionError("Symlinks not yet supported")
 
124
        tree.serialize()
 
125
        return tree
83
126
 
84
127
    def _get_commit(self, revid, tree_sha):
85
128
        rev = self.repository.get_revision(revid)
86
129
        return revision_to_commit(rev, tree_sha, self._idmap._parent_lookup)
87
130
 
 
131
    def get_raw(self, sha):
 
132
        obj = self[sha]
 
133
        assert obj.id == sha
 
134
        return obj._text
 
135
 
88
136
    def __getitem__(self, sha):
89
137
        # See if sha is in map
90
138
        try: