/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

Partially fix pull.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
21
from bzrlib import ui
 
22
 
 
23
from bzrlib.errors import NoSuchRevision
 
24
 
 
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
 
 
31
from dulwich.objects import (
 
32
    Blob,
 
33
    )
 
34
 
 
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):
 
47
        all_revids = self.repository.all_revision_ids()
 
48
        graph = self.repository.get_graph()
 
49
        present_revids = set(self._idmap.revids())
 
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()
 
59
 
 
60
    def _update_sha_map_revision(self, revid):
 
61
        inv = self.repository.get_inventory(revid)
 
62
        objects = inventory_to_tree_and_blobs(self.repository, self.mapping, revid)
 
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)
 
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))
 
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)
 
86
        return revision_to_commit(rev, tree_sha, self._idmap._parent_lookup)
 
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
 
98
        if type == "commit":
 
99
            return self._get_commit(*type_data)
 
100
        elif type == "blob":
 
101
            return self._get_blob(*type_data)
 
102
        elif type == "tree":
 
103
            return self._get_tree(*type_data)
 
104
        else:
 
105
            raise AssertionError("Unknown object type '%s'" % type)