浏览代码

fix writing of legacy objects.

Jelmer Vernooij 16 年之前
父节点
当前提交
bb270f6cff
共有 3 个文件被更改,包括 26 次插入7 次删除
  1. 12 1
      dulwich/index.py
  2. 9 4
      dulwich/object_store.py
  3. 5 2
      dulwich/objects.py

+ 12 - 1
dulwich/index.py

@@ -59,7 +59,7 @@ def write_cache_entry(f, entry):
     f.write(struct.pack(">LLLLLL20sH", ino, dev, mode, uid, gid, size, sha, flags))
     f.write(struct.pack(">LLLLLL20sH", ino, dev, mode, uid, gid, size, sha, flags))
     f.write(name)
     f.write(name)
     f.write(chr(0))
     f.write(chr(0))
-    real_size = ((f.tell() - beginoffset + 8) & ~7)
+    real_size = ((f.tell() - beginoffset + 7) & ~7)
     f.write(chr(0) * (f.tell() - (beginoffset + real_size)))
     f.write(chr(0) * (f.tell() - (beginoffset + real_size)))
     return 
     return 
 
 
@@ -142,6 +142,13 @@ class Index(object):
     def __getitem__(self, name):
     def __getitem__(self, name):
         return self._byname[name]
         return self._byname[name]
 
 
+    def get_sha1(self, path):
+        return self[path][-2]
+
+    def clear(self):
+        self._byname = {}
+        self._entries = []
+
     def __setitem__(self, name, x):
     def __setitem__(self, name, x):
         # Remove the old entry if any
         # Remove the old entry if any
         old_entry = self._byname.get(x[0])
         old_entry = self._byname.get(x[0])
@@ -149,3 +156,7 @@ class Index(object):
             self._entries.remove(old_entry)
             self._entries.remove(old_entry)
         self._entries.append(x)
         self._entries.append(x)
         self._byname[x[0]] = x
         self._byname[x[0]] = x
+
+    def update(self, entries):
+        for name, value in entries.iteritems():
+            self[name] = value

+ 9 - 4
dulwich/object_store.py

@@ -100,11 +100,13 @@ class ObjectStore(object):
         return None
         return None
 
 
     def _add_shafile(self, sha, o):
     def _add_shafile(self, sha, o):
-        path = self._get_shafile_path(sha)
-        f = os.path.open(path, 'w')
+        dir = os.path.join(self.path, sha[:2])
+        if not os.path.isdir(dir):
+            os.mkdir(dir)
+        path = os.path.join(dir, sha[2:])
+        f = open(path, 'w+')
         try:
         try:
-            f.write(o._header())
-            f.write(o._text)
+            f.write(o.as_legacy_object())
         finally:
         finally:
             f.close()
             f.close()
 
 
@@ -211,6 +213,9 @@ class ObjectStore(object):
                 self.move_in_pack(path)
                 self.move_in_pack(path)
         return f, commit
         return f, commit
 
 
+    def add_object(self, obj):
+        self._add_shafile(obj.id, obj)
+
     def add_objects(self, objects):
     def add_objects(self, objects):
         """Add a set of objects to this object store.
         """Add a set of objects to this object store.
 
 

+ 5 - 2
dulwich/objects.py

@@ -92,6 +92,9 @@ class ShaFile(object):
         text = text[1:]
         text = text[1:]
         object._text = text
         object._text = text
         return object
         return object
+
+    def as_legacy_object(self):
+        return zlib.compress("%s %d\0%s" % (self._type, len(self._text), self._text))
   
   
     def as_raw_string(self):
     def as_raw_string(self):
         return self._num_type, self._text
         return self._num_type, self._text
@@ -106,8 +109,8 @@ class ShaFile(object):
         try:
         try:
             object = num_type_map[num_type]()
             object = num_type_map[num_type]()
         except KeyError:
         except KeyError:
-            assert False, "Not a known type: %d" % num_type
-        while((byte & 0x80) != 0):
+            raise AssertionError("Not a known type: %d" % num_type)
+        while (byte & 0x80) != 0:
             byte = ord(map[used])
             byte = ord(map[used])
             used += 1
             used += 1
         raw = map[used:]
         raw = map[used:]