|
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