377
387
for key in self.db.iterkeys():
378
388
if key.startswith("git\0"):
379
389
yield sha_to_hex(key[4:])
391
INDEX_FORMAT = 'bzr-git sha map version 1'
394
class IndexGitShaMap(GitShaMap):
395
"""SHA Map that uses the Bazaar Index API.
399
"git <sha1>" -> "<type> <type-data1> <type-data2>"
400
"commit revid" -> "<sha1> <tree-id>"
401
"tree fileid revid" -> "<sha1>"
402
"blob fileid revid" -> "<sha1>"
405
def __init__(self, transport=None):
406
if transport is None:
407
self._transport = None
409
self._transport = transport
411
format = self._transport.get_bytes('format')
412
except bzrlib.errors.NoSuchFile:
413
self._transport.put_bytes('format', INDEX_FORMAT)
415
if format != INDEX_FORMAT:
416
trace.warning("SHA Map is incompatible (%s -> %s), rebuilding database.",
417
format, INDEX_FORMAT)
419
self._index = _mod_index.CombinedGraphIndex([])
422
def from_repository(cls, repository):
423
transport = getattr(repository, "_transport", None)
424
if transport is not None:
425
return cls(transport.clone('git'))
426
from bzrlib.transport import get_transport
427
return cls(get_transport(get_cache_dir()))
429
def start_write_group(self):
430
self._builder = _mod_index.GraphIndexBuilder(0, key_elements=3)
431
self._name = osutils.sha()
433
def commit_write_group(self):
434
stream = self._builder.finish()
435
name = self._name.hexdigest()
436
size = self._transport.put_file(name, stream)
437
index = _mod_index.GraphIndex(self._transport, name, size)
438
self._index.insert_index(0, index)
442
def abort_write_group(self):
446
def lookup_commit(self, revid):
447
entries = self._index.iter_entries([("commit", revid, None)])
449
return entries.next()[2][:20]
450
except StopIteration:
453
def add_entry(self, hexsha, type, type_data):
454
"""Add a new entry to the database.
456
self._name.update(hexsha)
460
self._builder.add_node(("git", hexsha, "X"), " ".join((type, type_data[0], type_data[1])))
462
self._builder.add_node(("commit", type_data[0], "X"), " ".join((hexsha, type_data[1])))
464
self._builder.add_node((type, type_data[0], type_data[1]), hexsha)
466
def lookup_tree(self, fileid, revid):
467
entries = self._index.iter_entries([("tree", fileid, revid)])
469
sha = entries.next()[2]
470
except StopIteration:
478
def lookup_blob(self, fileid, revid):
479
entries = self._index.iter_entries([("blob", fileid, revid)])
481
return entries.next()[2]
482
except StopIteration:
485
def lookup_git_sha(self, sha):
487
sha = sha_to_hex(sha)
488
entries = self._index.iter_entries([("git", sha, "X")])
490
data = entries.next()[2].split(" ", 2)
491
except StopIteration:
494
return (data[0], (data[1], data[2]))
497
"""List the revision ids known."""
498
for entry in self._index.iter_entries_prefix([("commit", None, None)]):
502
"""List the SHA1s."""
503
for entry in self._index.iter_entries_prefix([("git", None, None)]):