520
520
def __contains__(self, sha):
521
521
# See if sha is in map
523
(type, type_data) = self.lookup_git_sha(sha)
525
return self.repository.has_revision(type_data[0])
527
return self.repository.texts.has_key(type_data)
529
return self.repository.has_revision(type_data[1])
523
for (type, type_data) in self.lookup_git_sha(sha):
525
if self.repository.has_revision(type_data[0]):
528
if self.repository.texts.has_key(type_data):
531
if self.repository.has_revision(type_data[1]):
534
raise AssertionError("Unknown object type '%s'" % type)
531
raise AssertionError("Unknown object type '%s'" % type)
535
540
def lookup_git_shas(self, shas, update_map=True):
536
from dulwich.protocol import ZERO_SHA
539
543
if sha == ZERO_SHA:
540
ret[sha] = ("commit", (NULL_REVISION, None, {}))
544
ret[sha] = [("commit", (NULL_REVISION, None, {}))]
543
ret[sha] = self._cache.idmap.lookup_git_sha(sha)
547
ret[sha] = list(self._cache.idmap.lookup_git_sha(sha))
546
550
# if not, see if there are any unconverted revisions and add
562
566
return self._cache.content_cache[sha]
565
(type, type_data) = self.lookup_git_sha(sha)
566
# convert object to git object
568
(revid, tree_sha, verifiers) = type_data
570
rev = self.repository.get_revision(revid)
571
except errors.NoSuchRevision:
572
trace.mutter('entry for %s %s in shamap: %r, but not found in '
573
'repository', type, sha, type_data)
575
commit = self._reconstruct_commit(rev, tree_sha, roundtrip=True,
577
_check_expected_sha(sha, commit)
580
(fileid, revision) = type_data
581
return self._reconstruct_blobs([(fileid, revision, sha)]).next()
583
(fileid, revid) = type_data
585
tree = self.tree_cache.revision_tree(revid)
586
rev = self.repository.get_revision(revid)
587
except errors.NoSuchRevision:
588
trace.mutter('entry for %s %s in shamap: %r, but not found in repository', type, sha, type_data)
590
unusual_modes = extract_unusual_modes(rev)
592
return self._reconstruct_tree(fileid, revid, tree.inventory,
593
unusual_modes, expected_sha=sha)
594
except errors.NoSuchRevision:
569
for (kind, type_data) in self.lookup_git_sha(sha):
570
# convert object to git object
572
(revid, tree_sha, verifiers) = type_data
574
rev = self.repository.get_revision(revid)
575
except errors.NoSuchRevision:
576
trace.mutter('entry for %s %s in shamap: %r, but not '
577
'found in repository', kind, sha, type_data)
579
commit = self._reconstruct_commit(rev, tree_sha, roundtrip=True,
581
_check_expected_sha(sha, commit)
584
(fileid, revision) = type_data
585
return self._reconstruct_blobs([(fileid, revision, sha)]).next()
587
(fileid, revid) = type_data
589
tree = self.tree_cache.revision_tree(revid)
590
rev = self.repository.get_revision(revid)
591
except errors.NoSuchRevision:
592
trace.mutter('entry for %s %s in shamap: %r, but not found in repository', kind, sha, type_data)
594
unusual_modes = extract_unusual_modes(rev)
596
return self._reconstruct_tree(fileid, revid,
597
tree.inventory, unusual_modes, expected_sha=sha)
598
except errors.NoSuchRevision:
601
raise AssertionError("Unknown object type '%s'" % kind)
597
raise AssertionError("Unknown object type '%s'" % type)
599
605
def generate_lossy_pack_contents(self, have, want, progress=None,
600
606
get_tagged=None):
612
618
ret = self.lookup_git_shas(have + want)
613
619
for commit_sha in have:
615
(type, (revid, tree_sha, verifiers)) = ret[commit_sha]
621
for (type, type_data) in ret[commit_sha]:
622
assert type == "commit"
623
processed.add(type_data[0])
619
assert type == "commit"
622
627
for commit_sha in want:
623
628
if commit_sha in have:
626
(type, (revid, tree_sha, verifiers)) = ret[commit_sha]
631
for (type, type_data) in ret[commit_sha]:
632
assert type == "commit"
633
pending.add(type_data[0])
630
assert type == "commit"
633
637
graph = self.repository.get_graph()
634
638
todo = _find_missing_bzr_revids(graph, pending, processed)