|
@@ -46,6 +46,8 @@ from dulwich.objects import (
|
|
|
parse_timezone,
|
|
|
parse_tree,
|
|
|
_parse_tree_py,
|
|
|
+ sorted_tree_items,
|
|
|
+ _sorted_tree_items_py,
|
|
|
)
|
|
|
from dulwich.tests import (
|
|
|
TestSkipped,
|
|
@@ -404,6 +406,19 @@ class CommitParseTests(ShaFileCheckTests):
|
|
|
self.assertCheckFails(Commit, text)
|
|
|
|
|
|
|
|
|
+_TREE_ITEMS = {
|
|
|
+ 'a.c': (0100755, 'd80c186a03f423a81b39df39dc87fd269736ca86'),
|
|
|
+ 'a': (stat.S_IFDIR, 'd80c186a03f423a81b39df39dc87fd269736ca86'),
|
|
|
+ 'a/c': (stat.S_IFDIR, 'd80c186a03f423a81b39df39dc87fd269736ca86'),
|
|
|
+ }
|
|
|
+
|
|
|
+_SORTED_TREE_ITEMS = [
|
|
|
+ ('a.c', 0100755, 'd80c186a03f423a81b39df39dc87fd269736ca86'),
|
|
|
+ ('a', stat.S_IFDIR, 'd80c186a03f423a81b39df39dc87fd269736ca86'),
|
|
|
+ ('a/c', stat.S_IFDIR, 'd80c186a03f423a81b39df39dc87fd269736ca86'),
|
|
|
+ ]
|
|
|
+
|
|
|
+
|
|
|
class TreeTests(ShaFileCheckTests):
|
|
|
|
|
|
def test_simple(self):
|
|
@@ -422,10 +437,9 @@ class TreeTests(ShaFileCheckTests):
|
|
|
|
|
|
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()])
|
|
|
+ for name, item in _TREE_ITEMS.iteritems():
|
|
|
+ x[name] = item
|
|
|
+ self.assertEquals(_SORTED_TREE_ITEMS, list(x.iteritems()))
|
|
|
|
|
|
def _do_test_parse_tree(self, parse_tree):
|
|
|
dir = os.path.join(os.path.dirname(__file__), 'data', 'trees')
|
|
@@ -441,6 +455,32 @@ class TreeTests(ShaFileCheckTests):
|
|
|
raise TestSkipped('parse_tree extension not found')
|
|
|
self._do_test_parse_tree(parse_tree)
|
|
|
|
|
|
+ def _do_test_sorted_tree_items(self, sorted_tree_items):
|
|
|
+ def do_sort(entries):
|
|
|
+ return list(sorted_tree_items(entries))
|
|
|
+
|
|
|
+ self.assertEqual(_SORTED_TREE_ITEMS, do_sort(_TREE_ITEMS))
|
|
|
+
|
|
|
+ # C/Python implementations may differ in specific error types, but
|
|
|
+ # should all error on invalid inputs.
|
|
|
+ # For example, the C implementation has stricter type checks, so may
|
|
|
+ # raise TypeError where the Python implementation raises AttributeError.
|
|
|
+ errors = (TypeError, ValueError, AttributeError)
|
|
|
+ self.assertRaises(errors, do_sort, 'foo')
|
|
|
+ self.assertRaises(errors, do_sort, {'foo': (1, 2, 3)})
|
|
|
+
|
|
|
+ myhexsha = 'd80c186a03f423a81b39df39dc87fd269736ca86'
|
|
|
+ self.assertRaises(errors, do_sort, {'foo': ('xxx', myhexsha)})
|
|
|
+ self.assertRaises(errors, do_sort, {'foo': (0100755, 12345)})
|
|
|
+
|
|
|
+ def test_sorted_tree_items(self):
|
|
|
+ self._do_test_sorted_tree_items(_sorted_tree_items_py)
|
|
|
+
|
|
|
+ def test_sorted_tree_items_extension(self):
|
|
|
+ if sorted_tree_items is _sorted_tree_items_py:
|
|
|
+ raise TestSkipped('sorted_tree_items extension not found')
|
|
|
+ self._do_test_sorted_tree_items(sorted_tree_items)
|
|
|
+
|
|
|
def test_check(self):
|
|
|
t = Tree
|
|
|
sha = hex_to_sha(a_sha)
|