/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.228 by Jelmer Vernooij
Split out map.
1
# Copyright (C) 2009 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""Map from Git sha's to Bazaar objects."""
18
19
import bzrlib
20
0.200.231 by Jelmer Vernooij
Partially fix pull.
21
from bzrlib import ui
22
0.200.228 by Jelmer Vernooij
Split out map.
23
from bzrlib.errors import NoSuchRevision
24
0.200.229 by Jelmer Vernooij
More work on converter.
25
from bzrlib.plugins.git.mapping import (
26
    inventory_to_tree_and_blobs,
27
    revision_to_commit,
28
    )
29
from bzrlib.plugins.git.shamap import GitShaMap
30
0.200.231 by Jelmer Vernooij
Partially fix pull.
31
from dulwich.objects import (
32
    Blob,
33
    )
34
0.200.228 by Jelmer Vernooij
Split out map.
35
36
class GitObjectConverter(object):
37
38
    def __init__(self, repository, mapping=None):
39
        self.repository = repository
40
        if mapping is None:
41
            self.mapping = self.repository.get_mapping()
42
        else:
43
            self.mapping = mapping
44
        self._idmap = GitShaMap(self.repository._transport)
45
46
    def _update_sha_map(self):
0.200.231 by Jelmer Vernooij
Partially fix pull.
47
        all_revids = self.repository.all_revision_ids()
48
        graph = self.repository.get_graph()
0.200.230 by Jelmer Vernooij
Implement sha cache.
49
        present_revids = set(self._idmap.revids())
0.200.231 by Jelmer Vernooij
Partially fix pull.
50
        pb = ui.ui_factory.nested_progress_bar()
51
        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))
56
                self._update_sha_map_revision(revid)
57
        finally:
58
            pb.finished()
0.200.229 by Jelmer Vernooij
More work on converter.
59
60
    def _update_sha_map_revision(self, revid):
61
        inv = self.repository.get_inventory(revid)
0.200.230 by Jelmer Vernooij
Implement sha cache.
62
        objects = inventory_to_tree_and_blobs(self.repository, self.mapping, revid)
0.200.229 by Jelmer Vernooij
More work on converter.
63
        for sha, o, path in objects:
64
            if path == "":
65
                tree_sha = sha
66
            ie = inv[inv.path2id(path)]
67
            if ie.kind in ("file", "symlink"):
68
                self._idmap.add_entry(sha, "blob", (ie.file_id, ie.revision))
69
            else:
70
                self._idmap.add_entry(sha, "tree", (ie.file_id, ie.revision))
71
        rev = self.repository.get_revision(revid)
0.200.231 by Jelmer Vernooij
Partially fix pull.
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))
0.200.229 by Jelmer Vernooij
More work on converter.
74
75
    def _get_blob(self, fileid, revision):
76
        text = self.repository.texts.get_record_stream([(fileid, revision)], "unordered", True).next().get_bytes_as("fulltext")
77
        blob = Blob()
78
        blob._text = text
79
        return blob
80
81
    def _get_tree(self, fileid, revid):
82
        raise NotImplementedError(self._get_tree)
83
84
    def _get_commit(self, revid, tree_sha):
85
        rev = self.repository.get_revision(revid)
0.200.231 by Jelmer Vernooij
Partially fix pull.
86
        return revision_to_commit(rev, tree_sha, self._idmap._parent_lookup)
0.200.228 by Jelmer Vernooij
Split out map.
87
88
    def __getitem__(self, sha):
89
        # See if sha is in map
90
        try:
91
            (type, type_data) = self._idmap.lookup_git_sha(sha)
92
        except KeyError:
93
            # if not, see if there are any unconverted revisions and add them 
94
            # to the map, search for sha in map again
95
            self._update_sha_map()
96
            (type, type_data) = self._idmap.lookup_git_sha(sha)
97
        # convert object to git object
0.200.229 by Jelmer Vernooij
More work on converter.
98
        if type == "commit":
0.200.228 by Jelmer Vernooij
Split out map.
99
            return self._get_commit(*type_data)
0.200.229 by Jelmer Vernooij
More work on converter.
100
        elif type == "blob":
101
            return self._get_blob(*type_data)
102
        elif type == "tree":
103
            return self._get_tree(*type_data)
0.200.228 by Jelmer Vernooij
Split out map.
104
        else:
105
            raise AssertionError("Unknown object type '%s'" % type)