/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

Fix get_ancestry() contents.

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
        """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
        """
 
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
 
 
89
    def _get_tree(self, path, revid):
 
90
        raise NotImplementedError(self._get_tree)
 
91
 
 
92
    def _get_commit(self, revid, tree_sha):
 
93
        rev = self.repository.get_revision(revid)
 
94
        return revision_to_commit(rev, tree_sha, self._idmap._parent_lookup)
 
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
 
106
        if type == "commit":
 
107
            return self._get_commit(*type_data)
 
108
        elif type == "blob":
 
109
            return self._get_blob(*type_data)
 
110
        elif type == "tree":
 
111
            return self._get_tree(*type_data)
 
112
        else:
 
113
            raise AssertionError("Unknown object type '%s'" % type)