/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 tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2009 Canonical Ltd
 
1
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
16
16
 
17
17
"""Map from Git sha's to Bazaar objects."""
18
18
 
 
19
import stat
 
20
 
19
21
import bzrlib
20
 
 
21
22
from bzrlib import ui
22
 
 
23
23
from bzrlib.errors import NoSuchRevision
24
24
 
25
25
from bzrlib.plugins.git.mapping import (
30
30
 
31
31
from dulwich.objects import (
32
32
    Blob,
 
33
    Tree,
33
34
    )
34
35
 
35
36
 
55
56
                pb.update("updating git map", i, len(all_revids))
56
57
                self._update_sha_map_revision(revid)
57
58
        finally:
 
59
            self._idmap.commit()
58
60
            pb.finished()
59
61
 
60
62
    def _update_sha_map_revision(self, revid):
66
68
            ie = inv[inv.path2id(path)]
67
69
            if ie.kind in ("file", "symlink"):
68
70
                self._idmap.add_entry(sha, "blob", (ie.file_id, ie.revision))
 
71
            elif ie.kind == "directory":
 
72
                self._idmap.add_entry(sha, "tree", (path, ie.revision))
69
73
            else:
70
 
                self._idmap.add_entry(sha, "tree", (ie.file_id, ie.revision))
 
74
                raise AssertionError()
71
75
        rev = self.repository.get_revision(revid)
72
76
        commit_obj = revision_to_commit(rev, tree_sha, self._idmap._parent_lookup)
73
77
        self._idmap.add_entry(commit_obj.sha().hexdigest(), "commit", (revid, tree_sha))
74
78
 
75
79
    def _get_blob(self, fileid, revision):
 
80
        """Return a Git Blob object from a fileid and revision stored in bzr.
 
81
        
 
82
        :param fileid: File id of the text
 
83
        :param revision: Revision of the text
 
84
        """
76
85
        text = self.repository.texts.get_record_stream([(fileid, revision)], "unordered", True).next().get_bytes_as("fulltext")
77
86
        blob = Blob()
78
87
        blob._text = text
79
88
        return blob
80
89
 
81
 
    def _get_tree(self, fileid, revid):
82
 
        raise NotImplementedError(self._get_tree)
 
90
    def _get_tree(self, path, revid, inv=None):
 
91
        """Return a Git Tree object from a path and a revision stored in bzr.
 
92
 
 
93
        :param path: path in the tree.
 
94
        :param revision: Revision of the tree.
 
95
        """
 
96
        if inv is None:
 
97
            inv = self.repository.get_inventory(revid)
 
98
        tree = Tree()
 
99
        fileid = inv.path2id(path)
 
100
        for name, ie in inv[fileid].children.iteritems():
 
101
            if ie.kind == "directory":
 
102
                subtree = self._get_tree(inv.id2path(ie.file_id), revid, inv)
 
103
                tree.add(stat.S_IFDIR, name.encode('UTF-8'), subtree.sha().hexdigest())
 
104
            elif ie.kind == "file":
 
105
                blob = self._get_blob(inv.path2id(ie.file_id), revid)
 
106
                mode = stat.S_IFREG | 0644
 
107
                if ie.executable:
 
108
                    mode |= 0111
 
109
                tree.add(mode, name.encode('UTF-8'), blob.sha().hexdigest())
 
110
            elif ie.kind == "symlink":
 
111
                raise AssertionError("Symlinks not yet supported")
 
112
        tree.serialize()
 
113
        return tree
83
114
 
84
115
    def _get_commit(self, revid, tree_sha):
85
116
        rev = self.repository.get_revision(revid)