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