/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:
0.200.232 by Jelmer Vernooij
Fix pull from remote branches.
58
            self._idmap.commit()
0.200.231 by Jelmer Vernooij
Partially fix pull.
59
            pb.finished()
0.200.229 by Jelmer Vernooij
More work on converter.
60
61
    def _update_sha_map_revision(self, revid):
62
        inv = self.repository.get_inventory(revid)
0.200.230 by Jelmer Vernooij
Implement sha cache.
63
        objects = inventory_to_tree_and_blobs(self.repository, self.mapping, revid)
0.200.229 by Jelmer Vernooij
More work on converter.
64
        for sha, o, path in objects:
65
            if path == "":
66
                tree_sha = sha
67
            ie = inv[inv.path2id(path)]
68
            if ie.kind in ("file", "symlink"):
69
                self._idmap.add_entry(sha, "blob", (ie.file_id, ie.revision))
0.200.232 by Jelmer Vernooij
Fix pull from remote branches.
70
            elif ie.kind == "directory":
71
                self._idmap.add_entry(sha, "tree", (path, ie.revision))
0.200.229 by Jelmer Vernooij
More work on converter.
72
            else:
0.200.232 by Jelmer Vernooij
Fix pull from remote branches.
73
                raise AssertionError()
0.200.229 by Jelmer Vernooij
More work on converter.
74
        rev = self.repository.get_revision(revid)
0.200.231 by Jelmer Vernooij
Partially fix pull.
75
        commit_obj = revision_to_commit(rev, tree_sha, self._idmap._parent_lookup)
76
        self._idmap.add_entry(commit_obj.sha().hexdigest(), "commit", (revid, tree_sha))
0.200.229 by Jelmer Vernooij
More work on converter.
77
78
    def _get_blob(self, fileid, revision):
0.200.236 by Jelmer Vernooij
require bzr 1.13.
79
        """Return a Git Blob object from a fileid and revision stored in bzr.
80
        
81
        :param fileid: File id of the text
82
        :param revision: Revision of the text
83
        """
0.200.229 by Jelmer Vernooij
More work on converter.
84
        text = self.repository.texts.get_record_stream([(fileid, revision)], "unordered", True).next().get_bytes_as("fulltext")
85
        blob = Blob()
86
        blob._text = text
87
        return blob
88
0.200.232 by Jelmer Vernooij
Fix pull from remote branches.
89
    def _get_tree(self, path, revid):
0.200.229 by Jelmer Vernooij
More work on converter.
90
        raise NotImplementedError(self._get_tree)
91
92
    def _get_commit(self, revid, tree_sha):
93
        rev = self.repository.get_revision(revid)
0.200.231 by Jelmer Vernooij
Partially fix pull.
94
        return revision_to_commit(rev, tree_sha, self._idmap._parent_lookup)
0.200.228 by Jelmer Vernooij
Split out map.
95
96
    def __getitem__(self, sha):
97
        # See if sha is in map
98
        try:
99
            (type, type_data) = self._idmap.lookup_git_sha(sha)
100
        except KeyError:
101
            # if not, see if there are any unconverted revisions and add them 
102
            # to the map, search for sha in map again
103
            self._update_sha_map()
104
            (type, type_data) = self._idmap.lookup_git_sha(sha)
105
        # convert object to git object
0.200.229 by Jelmer Vernooij
More work on converter.
106
        if type == "commit":
0.200.228 by Jelmer Vernooij
Split out map.
107
            return self._get_commit(*type_data)
0.200.229 by Jelmer Vernooij
More work on converter.
108
        elif type == "blob":
109
            return self._get_blob(*type_data)
110
        elif type == "tree":
111
            return self._get_tree(*type_data)
0.200.228 by Jelmer Vernooij
Split out map.
112
        else:
113
            raise AssertionError("Unknown object type '%s'" % type)