|
@@ -23,6 +23,8 @@ import struct
|
|
|
def read_cache_time(f):
|
|
|
return struct.unpack(">LL", f.read(8))
|
|
|
|
|
|
+def write_cache_time(f, t):
|
|
|
+ f.write(struct.pack(">LL", *t))
|
|
|
|
|
|
def read_cache_entry(f):
|
|
|
beginoffset = f.tell()
|
|
@@ -40,25 +42,55 @@ def read_cache_entry(f):
|
|
|
f.seek(beginoffset + real_size)
|
|
|
return (name, ctime, mtime, ino, dev, mode, uid, gid, size, sha, flags)
|
|
|
|
|
|
+
|
|
|
+def write_cache_entry(f, entry):
|
|
|
+ beginoffset = f.tell()
|
|
|
+ (name, ctime, mtime, ino, dev, mode, uid, gid, size, sha, flags) = entry
|
|
|
+ write_cache_time(f, ctime)
|
|
|
+ write_cache_time(f, mtime)
|
|
|
+ f.write(struct.pack(">LLLLLL20sH", ino, dev, mode, uid, gid, size, sha, flags))
|
|
|
+ f.write(name)
|
|
|
+ f.write(chr(0))
|
|
|
+ real_size = ((f.tell() - beginoffset + 8) & ~7)
|
|
|
+ f.write(chr(0) * (f.tell() - (beginoffset + real_size)))
|
|
|
+ return
|
|
|
+
|
|
|
+def read_index(f):
|
|
|
+ assert f.read(4) == "DIRC"
|
|
|
+ (version, num_entries) = struct.unpack(">LL", f.read(4 * 2))
|
|
|
+ assert version in (1, 2)
|
|
|
+ for i in range(num_entries):
|
|
|
+ yield read_cache_entry(f)
|
|
|
+
|
|
|
+
|
|
|
+def write_index(f, entries):
|
|
|
+ f.write("DIRC")
|
|
|
+ f.write(struct.pack(">LL", 2, len(entries)))
|
|
|
+ for x in entries:
|
|
|
+ write_cache_entry(f, x)
|
|
|
+
|
|
|
+
|
|
|
class Index(object):
|
|
|
|
|
|
def __init__(self, filename):
|
|
|
+ self._entries = []
|
|
|
f = open(filename, 'r')
|
|
|
+ self._byname = {}
|
|
|
try:
|
|
|
- assert f.read(4) == "DIRC"
|
|
|
- (version, self._num_entries) = struct.unpack(">LL", f.read(4 * 2))
|
|
|
- assert version in (1, 2)
|
|
|
- self._entries = []
|
|
|
- for i in range(len(self)):
|
|
|
- self._entries.append(read_cache_entry(f))
|
|
|
+ for x in read_index(f):
|
|
|
+ self._entries.append(x)
|
|
|
+ self._byname[x[0]] = x
|
|
|
finally:
|
|
|
f.close()
|
|
|
|
|
|
def __len__(self):
|
|
|
- return self._num_entries
|
|
|
+ return len(self._entries)
|
|
|
|
|
|
def items(self):
|
|
|
return list(self._entries)
|
|
|
|
|
|
def __iter__(self):
|
|
|
return iter(self._entries)
|
|
|
+
|
|
|
+ def __getitem__(self, name):
|
|
|
+ return self._byname[name]
|