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