529
529
(type_name, hexsha) = obj
530
530
sha = hex_to_sha(hexsha)
532
type_name = obj.type_name
532
type_name = obj.type_name.decode('ascii')
533
533
sha = obj.sha().digest()
534
534
if type_name == "commit":
535
self.db["commit\0" + self.revid] = "\0".join((sha, obj.tree))
535
self.db[b"commit\0" + self.revid] = b"\0".join((sha, obj.tree))
536
536
if type(bzr_key_data) is not dict:
537
537
raise TypeError(bzr_key_data)
538
538
type_data = (self.revid, obj.tree)
544
544
elif type_name == "blob":
545
545
if bzr_key_data is None:
547
self.db["\0".join(("blob", bzr_key_data[0], bzr_key_data[1]))] = sha
547
self.db[b"\0".join((b"blob", bzr_key_data[0], bzr_key_data[1]))] = sha
548
548
type_data = bzr_key_data
549
549
elif type_name == "tree":
550
550
if bzr_key_data is None:
552
552
type_data = bzr_key_data
554
554
raise AssertionError
555
entry = "\0".join((type_name, ) + type_data) + "\n"
555
entry = b"\0".join((type_name.encode('ascii'), ) + type_data) + b"\n"
558
558
oldval = self.db[key]
560
560
self.db[key] = entry
562
if oldval[-1] != "\n":
563
self.db[key] = "".join([oldval, "\n", entry])
562
if not oldval.endswith(b'\n'):
563
self.db[key] = b"".join([oldval, b"\n", entry])
565
self.db[key] = "".join([oldval, entry])
565
self.db[key] = b"".join([oldval, entry])
567
567
def finish(self):
568
568
if self._commit is None:
619
619
os.O_RDWR|os.O_CREAT)
620
620
self.db = mapdbs()[path]
622
if int(self.db["version"]) not in (2, 3):
622
if int(self.db[b"version"]) not in (2, 3):
623
623
trace.warning("SHA Map is incompatible (%s -> %d), rebuilding database.",
624
self.db["version"], self.TDB_MAP_VERSION)
624
self.db[b"version"], self.TDB_MAP_VERSION)
628
self.db["version"] = str(self.TDB_MAP_VERSION)
628
self.db[b"version"] = b'%d' % self.TDB_MAP_VERSION
630
630
def start_write_group(self):
631
631
"""Start writing changes."""
645
645
def lookup_commit(self, revid):
647
return sha_to_hex(self.db["commit\0" + revid][:20])
647
return sha_to_hex(self.db[b"commit\0" + revid][:20])
649
649
raise KeyError("No cache entry for %r" % revid)
651
651
def lookup_blob_id(self, fileid, revision):
652
return sha_to_hex(self.db["\0".join(("blob", fileid, revision))])
652
return sha_to_hex(self.db[b"\0".join(("blob", fileid, revision))])
654
654
def lookup_git_sha(self, sha):
655
655
"""Lookup a Git sha in the database.
663
663
if len(sha) == 40:
664
664
sha = hex_to_sha(sha)
665
value = self.db["git\0" + sha]
665
value = self.db[b"git\0" + sha]
666
666
for data in value.splitlines():
667
data = data.split("\0")
668
if data[0] == "commit":
667
data = data.split(b"\0")
668
type_name = data[0].decode('ascii')
669
if type_name == "commit":
669
670
if len(data) == 3:
670
yield (data[0], (data[1], data[2], {}))
671
yield (type_name, (data[1], data[2], {}))
672
yield (data[0], (data[1], data[2], {"testament3-sha1": data[3]}))
673
elif data[0] in ("tree", "blob"):
674
yield (data[0], tuple(data[1:]))
673
yield (type_name, (data[1], data[2], {"testament3-sha1": data[3]}))
674
elif type_name in ("tree", "blob"):
675
yield (type_name, tuple(data[1:]))
676
raise AssertionError("unknown type %r" % data[0])
677
raise AssertionError("unknown type %r" % type_name)
678
679
def missing_revisions(self, revids):
680
681
for revid in revids:
681
if self.db.get("commit\0" + revid) is None:
682
if self.db.get(b"commit\0" + revid) is None:
685
686
def revids(self):
686
687
"""List the revision ids known."""
687
688
for key in self.db.iterkeys():
688
if key.startswith("commit\0"):
689
if key.startswith(b"commit\0"):
692
693
"""List the SHA1s."""
693
694
for key in self.db.iterkeys():
694
if key.startswith("git\0"):
695
if key.startswith(b"git\0"):
695
696
yield sha_to_hex(key[4:])