瀏覽代碼

Fix sorting in trees.

Jelmer Vernooij 16 年之前
父節點
當前提交
27e09f418a
共有 2 個文件被更改,包括 16 次插入2 次删除
  1. 8 2
      dulwich/objects.py
  2. 8 0
      dulwich/tests/test_objects.py

+ 8 - 2
dulwich/objects.py

@@ -438,9 +438,15 @@ class Tree(ShaFile):
         return [(mode, name, hexsha) for (name, mode, hexsha) in self.iteritems()]
 
     def iteritems(self):
+        def cmp_entry((name1, value1), (name2, value2)):
+            if stat.S_ISDIR(value1[0]):
+                name1 += "/"
+            if stat.S_ISDIR(value2[0]):
+                name2 += "/"
+            return cmp(name1, name2)
         self._ensure_parsed()
-        for name in sorted(self._entries.keys()):
-            yield name, self._entries[name][0], self._entries[name][1]
+        for name, entry in sorted(self._entries.iteritems(), cmp=cmp_entry):
+            yield name, entry[0], entry[1]
 
     def _parse_text(self):
         """Grab the entries in the tree"""

+ 8 - 0
dulwich/tests/test_objects.py

@@ -18,6 +18,7 @@
 # MA  02110-1301, USA.
 
 import os
+import stat
 import unittest
 
 from dulwich.objects import (
@@ -188,3 +189,10 @@ class TreeSerializationTests(unittest.TestCase):
         x["myname"] = (0100755, myhexsha)
         self.assertEquals('100755 myname\0' + hex_to_sha(myhexsha),
                 x.as_raw_string())
+
+    def test_tree_dir_sort(self):
+        x = Tree()
+        x["a.c"] = (0100755, "d80c186a03f423a81b39df39dc87fd269736ca86")
+        x["a"] = (stat.S_IFDIR, "d80c186a03f423a81b39df39dc87fd269736ca86")
+        x["a/c"] = (stat.S_IFDIR, "d80c186a03f423a81b39df39dc87fd269736ca86")
+        self.assertEquals(["a.c", "a", "a/c"], [p[0] for p in x.iteritems()])