/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

  • Committer: Robert Collins
  • Date: 2010-05-06 07:48:22 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506074822-0bsgf2j4h8jx0xkk
Added ``bzrlib.tests.matchers`` as a place to put matchers, along with
our first in-tree matcher. See the module docstring for details.
(Robert Collins)

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)