/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

Derive to_location from from_location, simialr to bzr branch.

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
            self._idmap.commit()
 
59
            pb.finished()
 
60
 
 
61
    def _update_sha_map_revision(self, revid):
 
62
        inv = self.repository.get_inventory(revid)
 
63
        objects = inventory_to_tree_and_blobs(self.repository, self.mapping, revid)
 
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))
 
70
            elif ie.kind == "directory":
 
71
                self._idmap.add_entry(sha, "tree", (path, ie.revision))
 
72
            else:
 
73
                raise AssertionError()
 
74
        rev = self.repository.get_revision(revid)
 
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))
 
77
 
 
78
    def _get_blob(self, fileid, revision):
 
79
        text = self.repository.texts.get_record_stream([(fileid, revision)], "unordered", True).next().get_bytes_as("fulltext")
 
80
        blob = Blob()
 
81
        blob._text = text
 
82
        return blob
 
83
 
 
84
    def _get_tree(self, path, revid):
 
85
        raise NotImplementedError(self._get_tree)
 
86
 
 
87
    def _get_commit(self, revid, tree_sha):
 
88
        rev = self.repository.get_revision(revid)
 
89
        return revision_to_commit(rev, tree_sha, self._idmap._parent_lookup)
 
90
 
 
91
    def __getitem__(self, sha):
 
92
        # See if sha is in map
 
93
        try:
 
94
            (type, type_data) = self._idmap.lookup_git_sha(sha)
 
95
        except KeyError:
 
96
            # if not, see if there are any unconverted revisions and add them 
 
97
            # to the map, search for sha in map again
 
98
            self._update_sha_map()
 
99
            (type, type_data) = self._idmap.lookup_git_sha(sha)
 
100
        # convert object to git object
 
101
        if type == "commit":
 
102
            return self._get_commit(*type_data)
 
103
        elif type == "blob":
 
104
            return self._get_blob(*type_data)
 
105
        elif type == "tree":
 
106
            return self._get_tree(*type_data)
 
107
        else:
 
108
            raise AssertionError("Unknown object type '%s'" % type)