/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
1
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
0.200.228 by Jelmer Vernooij
Split out map.
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
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
19
from dulwich.objects import (
20
    Blob,
0.200.586 by Jelmer Vernooij
Fix issues pointed out by pyflakes.
21
    sha_to_hex,
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
22
    )
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
23
from dulwich.object_store import (
0.200.457 by Jelmer Vernooij
Use BaseObjectStore.
24
    BaseObjectStore,
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
25
    )
0.200.249 by Jelmer Vernooij
Implement Tree.
26
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
27
from bzrlib import (
0.200.440 by Jelmer Vernooij
Remove silly mapping of timezones; dulwich uses offsets now as well.
28
    debug,
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
29
    errors,
0.200.478 by Jelmer Vernooij
Cope with disappeared revisions.
30
    trace,
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
31
    ui,
32
    )
0.200.541 by Jelmer Vernooij
Cope with NULL_REVISION.
33
from bzrlib.revision import (
34
    NULL_REVISION,
35
    )
0.200.228 by Jelmer Vernooij
Split out map.
36
0.200.229 by Jelmer Vernooij
More work on converter.
37
from bzrlib.plugins.git.mapping import (
0.200.463 by Jelmer Vernooij
Support remote dpush (except for references).
38
    default_mapping,
0.200.359 by Jelmer Vernooij
Simplify file mode handling, avoid inventory_to_tree_and_blobs as it is expensive if trees/blobs have already been converted.
39
    directory_to_tree,
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
40
    extract_unusual_modes,
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
41
    mapping_registry,
0.200.229 by Jelmer Vernooij
More work on converter.
42
    )
0.200.260 by Jelmer Vernooij
Add DictGitShaMap, useful for testing.
43
from bzrlib.plugins.git.shamap import (
44
    SqliteGitShaMap,
0.200.476 by Jelmer Vernooij
Fix Tdb backend, use tdb if possible by default.
45
    TdbGitShaMap,
0.200.231 by Jelmer Vernooij
Partially fix pull.
46
    )
47
0.200.228 by Jelmer Vernooij
Split out map.
48
0.200.452 by Jelmer Vernooij
Rename converter -> object_store, provide utility function for getting ObjectStore's.
49
def get_object_store(repo, mapping=None):
50
    git = getattr(repo, "_git", None)
51
    if git is not None:
52
        return git.object_store
53
    return BazaarObjectStore(repo, mapping)
54
55
0.200.457 by Jelmer Vernooij
Use BaseObjectStore.
56
class BazaarObjectStore(BaseObjectStore):
0.200.320 by Jelmer Vernooij
Handle lightweight checkouts.
57
    """A Git-style object store backed onto a Bazaar repository."""
0.200.228 by Jelmer Vernooij
Split out map.
58
59
    def __init__(self, repository, mapping=None):
60
        self.repository = repository
61
        if mapping is None:
0.200.463 by Jelmer Vernooij
Support remote dpush (except for references).
62
            self.mapping = default_mapping
0.200.228 by Jelmer Vernooij
Split out map.
63
        else:
64
            self.mapping = mapping
0.200.696 by Jelmer Vernooij
Release 0.4.3.
65
        self._idmap = SqliteGitShaMap.from_repository(repository)
0.200.735 by Jelmer Vernooij
Use convenience functions for start/stop write groups.
66
        self.start_write_group = self._idmap.start_write_group
67
        self.abort_write_group = self._idmap.abort_write_group
68
        self.commit_write_group = self._idmap.commit_write_group
0.200.228 by Jelmer Vernooij
Split out map.
69
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
70
    def _update_sha_map(self, stop_revision=None):
0.200.683 by Jelmer Vernooij
Lazier checking of which revisions need to be fetched.
71
        graph = self.repository.get_graph()
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
72
        if stop_revision is None:
0.200.683 by Jelmer Vernooij
Lazier checking of which revisions need to be fetched.
73
            heads = graph.heads(self.repository.all_revision_ids())
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
74
        else:
0.200.683 by Jelmer Vernooij
Lazier checking of which revisions need to be fetched.
75
            heads = set([stop_revision])
0.200.689 by Jelmer Vernooij
Also consider todo heads.
76
        missing_revids = self._idmap.missing_revisions(heads)
0.200.683 by Jelmer Vernooij
Lazier checking of which revisions need to be fetched.
77
        while heads:
78
            parents = graph.get_parent_map(heads)
79
            todo = set()
80
            for p in parents.values():
0.200.684 by Jelmer Vernooij
Properly close write groups.
81
                todo.update([x for x in p if x not in missing_revids])
0.200.683 by Jelmer Vernooij
Lazier checking of which revisions need to be fetched.
82
            heads = self._idmap.missing_revisions(todo)
0.200.684 by Jelmer Vernooij
Properly close write groups.
83
            missing_revids.update(heads)
0.200.694 by Jelmer Vernooij
Avoid processing NULL_REVISION.
84
        if NULL_REVISION in missing_revids:
85
            missing_revids.remove(NULL_REVISION)
0.200.735 by Jelmer Vernooij
Use convenience functions for start/stop write groups.
86
        self.start_write_group()
0.200.231 by Jelmer Vernooij
Partially fix pull.
87
        try:
0.200.733 by Jelmer Vernooij
Use start/stop commit write group.
88
            pb = ui.ui_factory.nested_progress_bar()
89
            try:
90
                for i, revid in enumerate(graph.iter_topo_order(missing_revids)):
91
                    pb.update("updating git map", i, len(missing_revids))
92
                    self._update_sha_map_revision(revid)
93
            finally:
94
                pb.finished()
0.200.735 by Jelmer Vernooij
Use convenience functions for start/stop write groups.
95
        except:
96
            self.abort_write_group()
97
            raise
98
        else:
99
            self.commit_write_group()
0.200.229 by Jelmer Vernooij
More work on converter.
100
0.200.422 by Jelmer Vernooij
'bzr git-object' without arguments now prints the available git objects.
101
    def __iter__(self):
102
        self._update_sha_map()
103
        return iter(self._idmap.sha1s())
104
0.238.7 by Jelmer Vernooij
Cope with ghosts a bit better.
105
    def _revision_to_commit(self, rev, tree_sha):
106
        def parent_lookup(revid):
107
            try:
108
                return self._lookup_revision_sha1(revid)
109
            except errors.NoSuchRevision:
110
                trace.warning("Ignoring ghost parent %s", revid)
111
                return None
0.242.1 by Jelmer Vernooij
Add support for parsing hg-git metadata in the experimental mappings.
112
        return self.mapping.export_commit(rev, tree_sha, parent_lookup)
0.238.7 by Jelmer Vernooij
Cope with ghosts a bit better.
113
0.200.229 by Jelmer Vernooij
More work on converter.
114
    def _update_sha_map_revision(self, revid):
115
        inv = self.repository.get_inventory(revid)
116
        rev = self.repository.get_revision(revid)
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
117
        unusual_modes = extract_unusual_modes(rev)
118
        tree_sha = self._get_ie_sha1(inv.root, inv, unusual_modes)
0.238.7 by Jelmer Vernooij
Cope with ghosts a bit better.
119
        commit_obj = self._revision_to_commit(rev, tree_sha)
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
120
        try:
121
            foreign_revid, mapping = mapping_registry.parse_revision_id(revid)
122
        except errors.InvalidRevisionId:
123
            pass
124
        else:
125
            if foreign_revid != commit_obj.id:
0.200.440 by Jelmer Vernooij
Remove silly mapping of timezones; dulwich uses offsets now as well.
126
                if not "fix-shamap" in debug.debug_flags:
127
                    raise AssertionError("recreated git commit had different sha1: expected %s, got %s" % (foreign_revid, commit_obj.id))
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
128
        self._idmap.add_entry(commit_obj.id, "commit", (revid, tree_sha))
0.200.229 by Jelmer Vernooij
More work on converter.
129
0.200.353 by Jelmer Vernooij
fileids/revids are plain strings, not unicode
130
    def _check_expected_sha(self, expected_sha, object):
131
        if expected_sha is None:
132
            return
0.200.565 by Jelmer Vernooij
Cope with 'binary' shas.
133
        if len(expected_sha) == 40:
134
            if expected_sha != object.sha().hexdigest():
135
                raise AssertionError("Invalid sha for %r: %s" % (object, expected_sha))
136
        elif len(expected_sha) == 20:
137
            if expected_sha != object.sha().digest():
138
                raise AssertionError("Invalid sha for %r: %s" % (object, sha_to_hex(expected_sha)))
139
        else:
140
            raise AssertionError("Unknown length %d for %r" % (len(expected_sha), expected_sha))
0.200.353 by Jelmer Vernooij
fileids/revids are plain strings, not unicode
141
0.200.664 by Jelmer Vernooij
Support submodules during fetch.
142
    def _get_ie_object(self, entry, inv, unusual_modes):
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
143
        if entry.kind == "directory":
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
144
            return self._get_tree(entry.file_id, inv.revision_id, inv, unusual_modes)
0.244.1 by INADA Naoki
Fix sha1s for symlinks.
145
        elif entry.kind == "symlink":
146
            return self._get_blob_for_symlink(entry.symlink_target)
147
        elif entry.kind == "file":
0.200.698 by Jelmer Vernooij
Merge fixes for SHA1s of symlinks.
148
            return self._get_blob_for_file(entry.file_id, entry.revision)
0.200.664 by Jelmer Vernooij
Support submodules during fetch.
149
        else:
150
            raise AssertionError("unknown entry kind '%s'" % entry.kind)
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
151
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
152
    def _get_ie_object_or_sha1(self, entry, inv, unusual_modes):
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
153
        if entry.kind == "directory":
0.200.749 by Jelmer Vernooij
Avoid storing entries for trees in the cache, use blobs instead
154
            ret = self._get_ie_object(entry, inv, unusual_modes)
155
            if ret is None:
156
                # Empty directory
157
                hexsha = None
158
            else:
159
                hexsha = ret.id
160
            self._idmap.add_entry(hexsha, "tree",
161
                (entry.file_id, inv.revision_id))
162
            return hexsha, ret
0.200.670 by Jelmer Vernooij
Fix symlinks.
163
        elif entry.kind in ("file", "symlink"):
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
164
            try:
165
                return self._idmap.lookup_blob(entry.file_id, entry.revision), None
166
            except KeyError:
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
167
                ret = self._get_ie_object(entry, inv, unusual_modes)
0.200.749 by Jelmer Vernooij
Avoid storing entries for trees in the cache, use blobs instead
168
                self._idmap.add_entry(ret.id, "blob", (entry.file_id,
169
                    entry.revision))
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
170
                return ret.id, ret
0.200.664 by Jelmer Vernooij
Support submodules during fetch.
171
        else:
172
            raise AssertionError("unknown entry kind '%s'" % entry.kind)
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
173
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
174
    def _get_ie_sha1(self, entry, inv, unusual_modes):
175
        return self._get_ie_object_or_sha1(entry, inv, unusual_modes)[0]
0.200.359 by Jelmer Vernooij
Simplify file mode handling, avoid inventory_to_tree_and_blobs as it is expensive if trees/blobs have already been converted.
176
0.244.1 by INADA Naoki
Fix sha1s for symlinks.
177
    def _get_blob_for_symlink(self, symlink_target, expected_sha=None):
178
        """Return a Git Blob object for symlink.
179
180
        :param symlink_target: target of symlink.
181
        """
0.200.698 by Jelmer Vernooij
Merge fixes for SHA1s of symlinks.
182
        if type(symlink_target) == unicode:
0.244.1 by INADA Naoki
Fix sha1s for symlinks.
183
            symlink_target = symlink_target.encode('utf-8')
184
        blob = Blob()
185
        blob._text = symlink_target
186
        self._check_expected_sha(expected_sha, blob)
187
        return blob
188
0.200.698 by Jelmer Vernooij
Merge fixes for SHA1s of symlinks.
189
    def _get_blob_for_file(self, fileid, revision, expected_sha=None):
190
        """Return a Git Blob object from a fileid and revision stored in bzr.
191
192
        :param fileid: File id of the text
193
        :param revision: Revision of the text
194
        """
195
        blob = Blob()
196
        chunks = self.repository.iter_files_bytes([(fileid, revision, None)]).next()[1]
197
        blob._text = "".join(chunks)
198
        self._check_expected_sha(expected_sha, blob)
199
        return blob
200
0.200.353 by Jelmer Vernooij
fileids/revids are plain strings, not unicode
201
    def _get_blob(self, fileid, revision, expected_sha=None):
0.200.236 by Jelmer Vernooij
require bzr 1.13.
202
        """Return a Git Blob object from a fileid and revision stored in bzr.
0.200.670 by Jelmer Vernooij
Fix symlinks.
203
0.200.236 by Jelmer Vernooij
require bzr 1.13.
204
        :param fileid: File id of the text
205
        :param revision: Revision of the text
206
        """
0.200.698 by Jelmer Vernooij
Merge fixes for SHA1s of symlinks.
207
        inv = self.repository.get_inventory(revision)
208
        entry = inv[fileid]
0.244.1 by INADA Naoki
Fix sha1s for symlinks.
209
210
        if entry.kind == 'file':
0.200.698 by Jelmer Vernooij
Merge fixes for SHA1s of symlinks.
211
            return self._get_blob_for_file(entry.file_id, entry.revision,
212
                                           expected_sha=expected_sha)
0.244.1 by INADA Naoki
Fix sha1s for symlinks.
213
        elif entry.kind == 'symlink':
0.200.698 by Jelmer Vernooij
Merge fixes for SHA1s of symlinks.
214
            return self._get_blob_for_symlink(entry.symlink_target,
215
                                              expected_sha=expected_sha)
216
        else:
217
            raise AssertionError
0.200.229 by Jelmer Vernooij
More work on converter.
218
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
219
    def _get_tree(self, fileid, revid, inv, unusual_modes, expected_sha=None):
0.200.343 by Jelmer Vernooij
Use file ids consistently in map.
220
        """Return a Git Tree object from a file id and a revision stored in bzr.
0.200.249 by Jelmer Vernooij
Implement Tree.
221
0.200.343 by Jelmer Vernooij
Use file ids consistently in map.
222
        :param fileid: fileid in the tree.
0.200.249 by Jelmer Vernooij
Implement Tree.
223
        :param revision: Revision of the tree.
224
        """
0.200.665 by Jelmer Vernooij
Add more checks for submodules.
225
        tree = directory_to_tree(inv[fileid],
0.200.549 by Jelmer Vernooij
Fix storing of unusual file modes.
226
            lambda ie: self._get_ie_sha1(ie, inv, unusual_modes),
227
            unusual_modes)
0.200.353 by Jelmer Vernooij
fileids/revids are plain strings, not unicode
228
        self._check_expected_sha(expected_sha, tree)
0.200.249 by Jelmer Vernooij
Implement Tree.
229
        return tree
0.200.229 by Jelmer Vernooij
More work on converter.
230
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
231
    def _get_commit(self, rev, tree_sha, expected_sha=None):
0.238.7 by Jelmer Vernooij
Cope with ghosts a bit better.
232
        commit = self._revision_to_commit(rev, tree_sha)
0.200.353 by Jelmer Vernooij
fileids/revids are plain strings, not unicode
233
        self._check_expected_sha(expected_sha, commit)
234
        return commit
0.200.228 by Jelmer Vernooij
Split out map.
235
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
236
    def get_parents(self, sha):
0.200.454 by Jelmer Vernooij
Use ObjectStore.find_missing_objects in server.
237
        """Retrieve the parents of a Git commit by SHA1.
238
239
        :param sha: SHA1 of the commit
240
        :raises: KeyError, NotCommitError
241
        """
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
242
        return self[sha].parents
243
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
244
    def _lookup_revision_sha1(self, revid):
0.200.449 by Jelmer Vernooij
Use BazaarObjectStore to find matching SHA1s for bzr revisions.
245
        """Return the SHA1 matching a Bazaar revision."""
0.200.541 by Jelmer Vernooij
Cope with NULL_REVISION.
246
        if revid == NULL_REVISION:
247
            return "0" * 40
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
248
        try:
0.200.487 by Jelmer Vernooij
Prevent deep recursion if the shamap is out of date.
249
            return self._idmap.lookup_commit(revid)
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
250
        except KeyError:
0.200.682 by Jelmer Vernooij
Avoid doing a full sha map update if we already know the SHA1.
251
            try:
252
                return mapping_registry.parse_revision_id(revid)[0]
253
            except errors.InvalidRevisionId:
254
                self._update_sha_map(revid)
255
                return self._idmap.lookup_commit(revid)
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
256
0.200.310 by Jelmer Vernooij
Fix pull from remote branches.
257
    def get_raw(self, sha):
0.200.454 by Jelmer Vernooij
Use ObjectStore.find_missing_objects in server.
258
        """Get the raw representation of a Git object by SHA1.
259
260
        :param sha: SHA1 of the git object
261
        """
0.200.566 by Jelmer Vernooij
Fix ObjectStore.get_raw() .
262
        obj = self[sha]
263
        return (obj.type, obj.as_raw_string())
0.200.310 by Jelmer Vernooij
Fix pull from remote branches.
264
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
265
    def __contains__(self, sha):
266
        # See if sha is in map
267
        try:
0.200.568 by Jelmer Vernooij
Properly check that matching bzr objects exist.
268
            (type, type_data) = self._lookup_git_sha(sha)
269
            if type == "commit":
270
                return self.repository.has_revision(type_data[0])
271
            elif type == "blob":
272
                return self.repository.texts.has_version(type_data)
273
            elif type == "tree":
274
                return self.repository.has_revision(type_data[1])
275
            else:
276
                raise AssertionError("Unknown object type '%s'" % type)
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
277
        except KeyError:
278
            return False
279
        else:
280
            return True
281
282
    def _lookup_git_sha(self, sha):
283
        # See if sha is in map
284
        try:
285
            return self._idmap.lookup_git_sha(sha)
0.200.228 by Jelmer Vernooij
Split out map.
286
        except KeyError:
0.200.670 by Jelmer Vernooij
Fix symlinks.
287
            # if not, see if there are any unconverted revisions and add them
0.200.228 by Jelmer Vernooij
Split out map.
288
            # to the map, search for sha in map again
289
            self._update_sha_map()
0.200.437 by Jelmer Vernooij
Implement BazaarObjectStore.__contains__, BazaarObjectStore.iter_shas, BazaarObjectStore.get_parents.
290
            return self._idmap.lookup_git_sha(sha)
291
292
    def __getitem__(self, sha):
293
        (type, type_data) = self._lookup_git_sha(sha)
0.200.228 by Jelmer Vernooij
Split out map.
294
        # convert object to git object
0.200.229 by Jelmer Vernooij
More work on converter.
295
        if type == "commit":
0.200.478 by Jelmer Vernooij
Cope with disappeared revisions.
296
            try:
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
297
                rev = self.repository.get_revision(type_data[0])
0.200.478 by Jelmer Vernooij
Cope with disappeared revisions.
298
            except errors.NoSuchRevision:
299
                trace.mutter('entry for %s %s in shamap: %r, but not found in repository', type, sha, type_data)
300
                raise KeyError(sha)
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
301
            return self._get_commit(rev, type_data[1], expected_sha=sha)
0.200.229 by Jelmer Vernooij
More work on converter.
302
        elif type == "blob":
0.200.353 by Jelmer Vernooij
fileids/revids are plain strings, not unicode
303
            return self._get_blob(type_data[0], type_data[1], expected_sha=sha)
0.200.229 by Jelmer Vernooij
More work on converter.
304
        elif type == "tree":
0.200.561 by Jelmer Vernooij
Cope with revisions pointed to by trees in the shamap disappearing.
305
            try:
306
                inv = self.repository.get_inventory(type_data[1])
307
                rev = self.repository.get_revision(type_data[1])
308
            except errors.NoSuchRevision:
309
                trace.mutter('entry for %s %s in shamap: %r, but not found in repository', type, sha, type_data)
310
                raise KeyError(sha)
0.200.556 by Jelmer Vernooij
Fix syntax error.
311
            unusual_modes = extract_unusual_modes(rev)
0.200.491 by Jelmer Vernooij
Cope with map for Tree objects becoming invalid.
312
            try:
0.200.749 by Jelmer Vernooij
Avoid storing entries for trees in the cache, use blobs instead
313
                return self._get_tree(type_data[0], type_data[1], inv,
314
                    unusual_modes, expected_sha=sha)
0.200.491 by Jelmer Vernooij
Cope with map for Tree objects becoming invalid.
315
            except errors.NoSuchRevision:
316
                raise KeyError(sha)
0.200.228 by Jelmer Vernooij
Split out map.
317
        else:
318
            raise AssertionError("Unknown object type '%s'" % type)