Browse Source

Fix padding in index.

Jelmer Vernooij 16 years ago
parent
commit
4c9095c4c9
1 changed files with 22 additions and 21 deletions
  1. 22 21
      dulwich/index.py

+ 22 - 21
dulwich/index.py

@@ -25,10 +25,17 @@ def read_cache_time(f):
 
 
 def write_cache_time(f, t):
+    if isinstance(t, int):
+        t = (t, 0)
     f.write(struct.pack(">LL", *t))
 
 
 def read_cache_entry(f):
+    """Read an entry from a cache file.
+
+    :param f: File-like object to read from
+    :return: tuple with: inode, device, mode, uid, gid, size, sha, flags
+    """
     beginoffset = f.tell()
     ctime = read_cache_time(f)
     mtime = read_cache_time(f)
@@ -60,8 +67,8 @@ def write_cache_entry(f, entry):
     f.write(name)
     f.write(chr(0))
     real_size = ((f.tell() - beginoffset + 7) & ~7)
-    f.write(chr(0) * (f.tell() - (beginoffset + real_size)))
-    return 
+    f.write("\0" * ((beginoffset + real_size) - f.tell()))
+
 
 def read_index(f):
     """Read an index file, yielding the individual entries."""
@@ -80,8 +87,8 @@ def read_index_dict(f):
     :param f: File object to read from
     """
     ret = {}
-    for (name, ctime, mtime, ino, dev, mode, uid, gid, size, sha, flags) in read_index(f):
-        ret[name] = (ctime, mtime, ino, dev, mode, uid, gid, size, sha, flags)
+    for x in read_index(f):
+        ret[x[0]] = tuple(x[1:])
     return ret
 
 
@@ -110,15 +117,14 @@ def write_index_dict(f, entries):
 class Index(object):
 
     def __init__(self, filename):
-        self._entries = []
         self._filename = filename
-        self._byname = {}
+        self.clear()
         self.read()
 
     def write(self):
         f = open(self._filename, 'w')
         try:
-            write_index(f, self._entries)
+            write_index_dict(f, self._byname)
         finally:
             f.close()
 
@@ -126,18 +132,13 @@ class Index(object):
         f = open(self._filename, 'r')
         try:
             for x in read_index(f):
-                self[x[0]] = x
+
+                self[x[0]] = tuple(x[1:])
         finally:
             f.close()
 
     def __len__(self):
-        return len(self._entries)
-
-    def items(self):
-        return list(self._entries)
-
-    def __iter__(self):
-        return iter(self._entries)
+        return len(self._byname)
 
     def __getitem__(self, name):
         return self._byname[name]
@@ -147,15 +148,15 @@ class Index(object):
 
     def clear(self):
         self._byname = {}
-        self._entries = []
 
     def __setitem__(self, name, x):
+        assert isinstance(name, str)
+        assert len(x) == 10
         # Remove the old entry if any
-        old_entry = self._byname.get(x[0])
-        if old_entry is not None:
-            self._entries.remove(old_entry)
-        self._entries.append(x)
-        self._byname[x[0]] = x
+        self._byname[name] = x
+
+    def iteritems(self):
+        return self._byname.iteritems()
 
     def update(self, entries):
         for name, value in entries.iteritems():