78
78
class InventorySHAMap(object):
79
79
"""Maps inventory file ids to Git SHAs."""
82
class GitShaMap(object):
83
"""Git<->Bzr revision id mapping database."""
85
def _add_entry(self, sha, type, type_data):
86
"""Add a new entry to the database.
88
raise NotImplementedError(self._add_entry)
90
def add_entries(self, revid, parent_revids, commit_sha, root_tree_sha,
92
"""Add multiple new entries to the database.
94
for (fileid, kind, hexsha, revision) in entries:
95
self._add_entry(hexsha, kind, (fileid, revision))
96
self._add_entry(commit_sha, "commit", (revid, root_tree_sha))
98
def lookup_git_sha(self, sha):
99
"""Lookup a Git sha in the database.
100
:param sha: Git object sha
101
:return: (type, type_data) with type_data:
102
revision: revid, tree sha
104
raise NotImplementedError(self.lookup_git_sha)
81
106
def lookup_blob_id(self, file_id, revision):
82
107
"""Retrieve a Git blob SHA by file id.
87
112
raise NotImplementedError(self.lookup_blob_id)
89
def lookup_tree_id(self, file_id):
114
def lookup_tree_id(self, file_id, revision):
90
115
"""Retrieve a Git tree SHA by file id.
92
117
raise NotImplementedError(self.lookup_tree_id)
95
class GitShaMap(object):
96
"""Git<->Bzr revision id mapping database."""
98
def _add_entry(self, sha, type, type_data):
99
"""Add a new entry to the database.
101
raise NotImplementedError(self._add_entry)
103
def add_entries(self, revid, parent_revids, commit_sha, root_tree_sha,
105
"""Add multiple new entries to the database.
107
for (fileid, kind, hexsha, revision) in entries:
108
self._add_entry(hexsha, kind, (fileid, revision))
109
self._add_entry(commit_sha, "commit", (revid, root_tree_sha))
111
def get_inventory_sha_map(self, revid):
112
"""Return the inventory SHA map for a revision.
114
:param revid: Revision to fetch the map for
115
:return: A `InventorySHAMap`
117
raise NotImplementedError(self.get_inventory_sha_map)
119
def lookup_git_sha(self, sha):
120
"""Lookup a Git sha in the database.
121
:param sha: Git object sha
122
:return: (type, type_data) with type_data:
123
revision: revid, tree sha
125
raise NotImplementedError(self.lookup_git_sha)
127
119
def revids(self):
128
120
"""List the revision ids known."""
129
121
raise NotImplementedError(self.revids)
160
152
if type in ("blob", "tree"):
161
153
self._by_fileid.setdefault(type_data[1], {})[type_data[0]] = sha
163
def get_inventory_sha_map(self, revid):
165
class DictInventorySHAMap(InventorySHAMap):
167
def __init__(self, base, revid):
171
def lookup_blob_id(self, fileid, revision):
172
return self._base._by_fileid[revision][fileid]
174
def lookup_tree_id(self, fileid):
175
return self._base._by_fileid[self.revid][fileid]
177
return DictInventorySHAMap(self, revid)
155
def lookup_blob_id(self, fileid, revision):
156
return self._by_fileid[revision][fileid]
179
158
def lookup_git_sha(self, sha):
180
159
return self._by_sha[sha]
161
def lookup_tree_id(self, fileid, revision):
162
return self._base._by_fileid[revision][fileid]
182
164
def revids(self):
183
165
for key, (type, type_data) in self._by_sha.iteritems():
184
166
if type == "commit":
279
261
raise AssertionError("Unknown type %s" % type)
281
def get_inventory_sha_map(self, revid):
282
class SqliteInventorySHAMap(InventorySHAMap):
284
def __init__(self, db, revid):
288
def lookup_blob_id(self, fileid, revision):
289
row = self.db.execute("select sha1 from blobs where fileid = ? and revid = ?", (fileid, revision)).fetchone()
292
raise KeyError(fileid)
294
def lookup_tree_id(self, fileid):
295
row = self.db.execute("select sha1 from trees where fileid = ? and revid = ?", (fileid, self.revid)).fetchone()
298
raise KeyError(fileid)
300
return SqliteInventorySHAMap(self.db, revid)
263
def lookup_blob_id(self, fileid, revision):
264
row = self.db.execute("select sha1 from blobs where fileid = ? and revid = ?", (fileid, revision)).fetchone()
267
raise KeyError(fileid)
269
def lookup_tree_id(self, fileid, revision):
270
row = self.db.execute("select sha1 from trees where fileid = ? and revid = ?", (fileid, self.revid)).fetchone()
273
raise KeyError(fileid)
302
275
def lookup_git_sha(self, sha):
303
276
"""Lookup a Git sha in the database.
406
379
elif type == "blob":
407
380
self.db["\0".join(("blob", type_data[0], type_data[1]))] = sha
409
def get_inventory_sha_map(self, revid):
411
class TdbInventorySHAMap(InventorySHAMap):
413
def __init__(self, db, revid):
417
def lookup_blob_id(self, fileid, revision):
418
return sha_to_hex(self.db["\0".join(("blob", fileid, revision))])
382
def lookup_blob_id(self, fileid, revision):
383
return sha_to_hex(self.db["\0".join(("blob", fileid, revision))])
420
return TdbInventorySHAMap(self.db, revid)
422
385
def lookup_git_sha(self, sha):
423
386
"""Lookup a Git sha in the database.