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()
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]