|  | 
| 8 | 8 | from git.objects import Tree, Blob | 
| 9 | 9 | from test.lib import TestBase | 
| 10 | 10 | 
 | 
|  | 11 | +import os | 
| 11 | 12 | import os.path as osp | 
|  | 13 | +import subprocess | 
| 12 | 14 | 
 | 
| 13 | 15 | 
 | 
| 14 | 16 | class TestTree(TestBase): | 
| @@ -40,6 +42,62 @@ def test_serializable(self): | 
| 40 | 42 |             testtree._deserialize(stream) | 
| 41 | 43 |         # END for each item in tree | 
| 42 | 44 | 
 | 
|  | 45 | +    def test_tree_modifier_ordering(self): | 
|  | 46 | +        def setup_git_repository_and_get_ordered_files(): | 
|  | 47 | +            os.mkdir("tmp") | 
|  | 48 | +            os.chdir("tmp") | 
|  | 49 | +            subprocess.run(["git", "init", "-q"], check=True) | 
|  | 50 | +            os.mkdir("file") | 
|  | 51 | +            for filename in [ | 
|  | 52 | +                "bin", | 
|  | 53 | +                "bin.d", | 
|  | 54 | +                "file.to", | 
|  | 55 | +                "file.toml", | 
|  | 56 | +                "file.toml.bin", | 
|  | 57 | +                "file0", | 
|  | 58 | +                "file/a", | 
|  | 59 | +            ]: | 
|  | 60 | +                open(filename, "a").close() | 
|  | 61 | + | 
|  | 62 | +            subprocess.run(["git", "add", "."], check=True) | 
|  | 63 | +            subprocess.run(["git", "commit", "-m", "c1"], check=True) | 
|  | 64 | +            tree_hash = subprocess.check_output(["git", "rev-parse", "HEAD^{tree}"]).decode().strip() | 
|  | 65 | +            cat_file_output = subprocess.check_output(["git", "cat-file", "-p", tree_hash]).decode() | 
|  | 66 | +            return [line.split()[-1] for line in cat_file_output.split("\n") if line] | 
|  | 67 | + | 
|  | 68 | +        hexsha = "6c1faef799095f3990e9970bc2cb10aa0221cf9c" | 
|  | 69 | +        roottree = self.rorepo.tree(hexsha) | 
|  | 70 | +        blob_mode = Tree.blob_id << 12 | 
|  | 71 | +        tree_mode = Tree.tree_id << 12 | 
|  | 72 | + | 
|  | 73 | +        files_in_desired_order = [ | 
|  | 74 | +            (blob_mode, "bin"), | 
|  | 75 | +            (blob_mode, "bin.d"), | 
|  | 76 | +            (blob_mode, "file.to"), | 
|  | 77 | +            (blob_mode, "file.toml"), | 
|  | 78 | +            (blob_mode, "file.toml.bin"), | 
|  | 79 | +            (blob_mode, "file0"), | 
|  | 80 | +            (tree_mode, "file"), | 
|  | 81 | +        ] | 
|  | 82 | +        mod = roottree.cache | 
|  | 83 | +        for file_mode, file_name in files_in_desired_order: | 
|  | 84 | +            mod.add(hexsha, file_mode, file_name) | 
|  | 85 | +        # end for each file | 
|  | 86 | + | 
|  | 87 | +        def file_names_in_order(): | 
|  | 88 | +            return [t[1] for t in files_in_desired_order] | 
|  | 89 | + | 
|  | 90 | +        def names_in_mod_cache(): | 
|  | 91 | +            a = [t[2] for t in mod._cache] | 
|  | 92 | +            here = file_names_in_order() | 
|  | 93 | +            return [e for e in a if e in here] | 
|  | 94 | + | 
|  | 95 | +        git_file_names_in_order = setup_git_repository_and_get_ordered_files() | 
|  | 96 | +        os.chdir("..") | 
|  | 97 | + | 
|  | 98 | +        mod.set_done() | 
|  | 99 | +        assert names_in_mod_cache() == git_file_names_in_order, "set_done() performs git-sorting" | 
|  | 100 | + | 
| 43 | 101 |     def test_traverse(self): | 
| 44 | 102 |         root = self.rorepo.tree("0.1.6") | 
| 45 | 103 |         num_recursive = 0 | 
|  | 
0 commit comments