Browse Source

Some refactoring of rust extension tests

Jelmer Vernooij 5 months ago
parent
commit
eedce6a44f
2 changed files with 45 additions and 21 deletions
  1. 8 5
      dulwich/objects.py
  2. 37 16
      tests/test_objects.py

+ 8 - 5
dulwich/objects.py

@@ -1027,19 +1027,19 @@ def sorted_tree_items(entries, name_order: bool):
         yield TreeEntry(name, mode, hexsha)
 
 
-def key_entry(entry) -> bytes:
+def key_entry(entry: Tuple[bytes, Tuple[int, ObjectID]]) -> bytes:
     """Sort key for tree entry.
 
     Args:
       entry: (name, value) tuple
     """
-    (name, value) = entry
-    if stat.S_ISDIR(value[0]):
+    (name, (mode, _sha)) = entry
+    if stat.S_ISDIR(mode):
         name += b"/"
     return name
 
 
-def key_entry_name_order(entry):
+def key_entry_name_order(entry: Tuple[bytes, Tuple[int, ObjectID]]) -> bytes:
     """Sort key for tree entry in name order."""
     return entry[0]
 
@@ -1667,6 +1667,9 @@ _parse_tree_py = parse_tree
 _sorted_tree_items_py = sorted_tree_items
 try:
     # Try to import Rust versions
-    from dulwich._objects import parse_tree, sorted_tree_items  # type: ignore
+    from dulwich._objects import parse_tree as _parse_tree_rs, sorted_tree_items as _sorted_tree_items_rs
 except ImportError:
     pass
+else:
+    parse_tree = _parse_tree_rs
+    sorted_tree_items = _sorted_tree_items_rs

+ 37 - 16
tests/test_objects.py

@@ -47,11 +47,14 @@ from dulwich.objects import (
     hex_to_sha,
     object_class,
     parse_timezone,
-    parse_tree,
     pretty_format_tree_entry,
     sha_to_hex,
-    sorted_tree_items,
 )
+
+try:
+    from dulwich.objects import _parse_tree_rs, _sorted_tree_items_rs
+except ImportError:
+    _sorted_tree_items_rs = _parse_tree_rs = None
 from dulwich.tests.utils import (
     ext_functest_builder,
     functest_builder,
@@ -825,6 +828,18 @@ _SORTED_TREE_ITEMS = [
 ]
 
 
+_TREE_ITEMS_BUG_1325 = {
+    b'gamma': (0o100755, b'5944b31ff85b415573d1a43eb942e2dea30ab8be'),
+    b'gamma-new': (0o100644, b'cf7a729ca69bfabd0995fc9b083e86a18215bd91'),
+}
+
+
+_SORTED_TREE_ITEMS_BUG_1325 = [
+    TreeEntry(path=b'gamma', mode=0o100755, sha=b'5944b31ff85b415573d1a43eb942e2dea30ab8be'),
+    TreeEntry(path=b'gamma-new', mode=0o100644, sha=b'cf7a729ca69bfabd0995fc9b083e86a18215bd91'),
+]
+
+
 class TreeTests(ShaFileCheckTests):
     def test_add(self):
         myhexsha = b"d80c186a03f423a81b39df39dc87fd269736ca86"
@@ -878,35 +893,40 @@ class TreeTests(ShaFileCheckTests):
         )
 
     test_parse_tree = functest_builder(_do_test_parse_tree, _parse_tree_py)
-    test_parse_tree_extension = ext_functest_builder(_do_test_parse_tree, parse_tree)
+    test_parse_tree_extension = ext_functest_builder(_do_test_parse_tree, _parse_tree_rs)
 
     def _do_test_sorted_tree_items(self, sorted_tree_items):
-        def do_sort(entries):
-            return list(sorted_tree_items(entries, False))
+        def do_sort(entries, name_order):
+            return list(sorted_tree_items(entries, name_order))
 
-        actual = do_sort(_TREE_ITEMS)
+        actual = do_sort(_TREE_ITEMS, False)
         self.assertEqual(_SORTED_TREE_ITEMS, actual)
         self.assertIsInstance(actual[0], TreeEntry)
 
+        actual = do_sort(_TREE_ITEMS_BUG_1325, True)
+        self.assertEqual(_SORTED_TREE_ITEMS_BUG_1325, actual)
+        self.assertIsInstance(actual[0], TreeEntry)
+
         # C/Python implementations may differ in specific error types, but
         # should all error on invalid inputs.
         # For example, the Rust implementation has stricter type checks, so may
         # raise TypeError where the Python implementation raises
         # AttributeError.
         errors = (TypeError, ValueError, AttributeError)
-        self.assertRaises(errors, do_sort, b"foo")
-        self.assertRaises(errors, do_sort, {b"foo": (1, 2, 3)})
+        self.assertRaises(errors, do_sort, b"foo", False)
+        self.assertRaises(errors, do_sort, {b"foo": (1, 2, 3)},  False)
 
         myhexsha = b"d80c186a03f423a81b39df39dc87fd269736ca86"
-        self.assertRaises(errors, do_sort, {b"foo": (b"xxx", myhexsha)})
-        self.assertRaises(errors, do_sort, {b"foo": (0o100755, 12345)})
+        self.assertRaises(errors, do_sort, {b"foo": (b"xxx", myhexsha)}, False)
+        self.assertRaises(errors, do_sort, {b"foo": (0o100755, 12345)}, False)
 
     test_sorted_tree_items = functest_builder(
         _do_test_sorted_tree_items, _sorted_tree_items_py
     )
-    test_sorted_tree_items_extension = ext_functest_builder(
-        _do_test_sorted_tree_items, sorted_tree_items
-    )
+    if _sorted_tree_items_rs is not None:
+        test_sorted_tree_items_extension = ext_functest_builder(
+            _do_test_sorted_tree_items, _sorted_tree_items_rs
+        )
 
     def _do_test_sorted_tree_items_name_order(self, sorted_tree_items):
         self.assertEqual(
@@ -933,9 +953,10 @@ class TreeTests(ShaFileCheckTests):
     test_sorted_tree_items_name_order = functest_builder(
         _do_test_sorted_tree_items_name_order, _sorted_tree_items_py
     )
-    test_sorted_tree_items_name_order_extension = ext_functest_builder(
-        _do_test_sorted_tree_items_name_order, sorted_tree_items
-    )
+    if _sorted_tree_items_rs is not None:
+        test_sorted_tree_items_name_order_extension = ext_functest_builder(
+            _do_test_sorted_tree_items_name_order, _sorted_tree_items_rs
+        )
 
     def test_check(self):
         t = Tree