@@ -8,22 +8,46 @@ cache-tree extension.
8
8
. ./test-lib.sh
9
9
10
10
cmp_cache_tree () {
11
- test-dump-cache-tree > actual &&
11
+ test-dump-cache-tree | sed -e ' /#(ref)/d ' > actual &&
12
12
sed " s/$_x40 /SHA/" < actual > filtered &&
13
13
test_cmp " $1 " filtered
14
14
}
15
15
16
16
# We don't bother with actually checking the SHA1:
17
17
# test-dump-cache-tree already verifies that all existing data is
18
18
# correct.
19
- test_shallow_cache_tree () {
20
- printf " SHA (%d entries, 0 subtrees)\n" $( git ls-files| wc -l) > expect &&
19
+ generate_expected_cache_tree_rec () {
20
+ dir=" $1 ${1: +/ } " &&
21
+ parent=" $2 " &&
22
+ # ls-files might have foo/bar, foo/bar/baz, and foo/bar/quux
23
+ # We want to count only foo because it's the only direct child
24
+ subtrees=$( git ls-files| grep /| cut -d / -f 1| uniq) &&
25
+ subtree_count=$( echo " $subtrees " | awk ' $1 {++c} END {print c}' ) &&
26
+ entries=$( git ls-files| wc -l) &&
27
+ printf " SHA $dir (%d entries, %d subtrees)\n" " $entries " " $subtree_count " &&
28
+ for subtree in $subtrees
29
+ do
30
+ cd " $subtree "
31
+ generate_expected_cache_tree_rec " $dir$subtree " " $dir " || return 1
32
+ cd ..
33
+ done &&
34
+ dir=$parent
35
+ }
36
+
37
+ generate_expected_cache_tree () {
38
+ (
39
+ generate_expected_cache_tree_rec
40
+ )
41
+ }
42
+
43
+ test_cache_tree () {
44
+ generate_expected_cache_tree > expect &&
21
45
cmp_cache_tree expect
22
46
}
23
47
24
48
test_invalid_cache_tree () {
25
49
printf " invalid %s ()\n" " " " $@ " > expect &&
26
- test-dump-cache-tree | \
50
+ test-dump-cache-tree |
27
51
sed -n -e " s/[0-9]* subtrees//" -e ' /#(ref)/d' -e ' /^invalid /p' > actual &&
28
52
test_cmp expect actual
29
53
}
@@ -33,14 +57,14 @@ test_no_cache_tree () {
33
57
cmp_cache_tree expect
34
58
}
35
59
36
- test_expect_failure ' initial commit has cache-tree' '
60
+ test_expect_success ' initial commit has cache-tree' '
37
61
test_commit foo &&
38
- test_shallow_cache_tree
62
+ test_cache_tree
39
63
'
40
64
41
65
test_expect_success ' read-tree HEAD establishes cache-tree' '
42
66
git read-tree HEAD &&
43
- test_shallow_cache_tree
67
+ test_cache_tree
44
68
'
45
69
46
70
test_expect_success ' git-add invalidates cache-tree' '
@@ -58,15 +82,29 @@ test_expect_success 'git-add in subdir invalidates cache-tree' '
58
82
test_invalid_cache_tree
59
83
'
60
84
85
+ cat > before << \EOF
86
+ SHA (3 entries, 2 subtrees)
87
+ SHA dir1/ (1 entries, 0 subtrees)
88
+ SHA dir2/ (1 entries, 0 subtrees)
89
+ EOF
90
+
91
+ cat > expect << \EOF
92
+ invalid (2 subtrees)
93
+ invalid dir1/ (0 subtrees)
94
+ SHA dir2/ (1 entries, 0 subtrees)
95
+ EOF
96
+
61
97
test_expect_success ' git-add in subdir does not invalidate sibling cache-tree' '
62
98
git tag no-children &&
63
99
test_when_finished "git reset --hard no-children; git read-tree HEAD" &&
64
100
mkdir dir1 dir2 &&
65
101
test_commit dir1/a &&
66
102
test_commit dir2/b &&
67
103
echo "I changed this file" >dir1/a &&
104
+ cmp_cache_tree before &&
105
+ echo "I changed this file" >dir1/a &&
68
106
git add dir1/a &&
69
- test_invalid_cache_tree dir1/
107
+ cmp_cache_tree expect
70
108
'
71
109
72
110
test_expect_success ' update-index invalidates cache-tree' '
@@ -79,7 +117,7 @@ test_expect_success 'update-index invalidates cache-tree' '
79
117
test_expect_success ' write-tree establishes cache-tree' '
80
118
test-scrap-cache-tree &&
81
119
git write-tree &&
82
- test_shallow_cache_tree
120
+ test_cache_tree
83
121
'
84
122
85
123
test_expect_success ' test-scrap-cache-tree works' '
@@ -90,37 +128,86 @@ test_expect_success 'test-scrap-cache-tree works' '
90
128
91
129
test_expect_success ' second commit has cache-tree' '
92
130
test_commit bar &&
93
- test_shallow_cache_tree
131
+ test_cache_tree
132
+ '
133
+
134
+ test_expect_success ' commit --interactive gives cache-tree on partial commit' '
135
+ cat <<-\EOT >foo.c &&
136
+ int foo()
137
+ {
138
+ return 42;
139
+ }
140
+ int bar()
141
+ {
142
+ return 42;
143
+ }
144
+ EOT
145
+ git add foo.c &&
146
+ test_invalid_cache_tree &&
147
+ git commit -m "add a file" &&
148
+ test_cache_tree &&
149
+ cat <<-\EOT >foo.c &&
150
+ int foo()
151
+ {
152
+ return 43;
153
+ }
154
+ int bar()
155
+ {
156
+ return 44;
157
+ }
158
+ EOT
159
+ (echo p; echo 1; echo; echo s; echo n; echo y; echo q) |
160
+ git commit --interactive -m foo &&
161
+ test_cache_tree
162
+ '
163
+
164
+ test_expect_success ' commit in child dir has cache-tree' '
165
+ mkdir dir &&
166
+ >dir/child.t &&
167
+ git add dir/child.t &&
168
+ git commit -m dir/child.t &&
169
+ test_cache_tree
94
170
'
95
171
96
172
test_expect_success ' reset --hard gives cache-tree' '
97
173
test-scrap-cache-tree &&
98
174
git reset --hard &&
99
- test_shallow_cache_tree
175
+ test_cache_tree
100
176
'
101
177
102
178
test_expect_success ' reset --hard without index gives cache-tree' '
103
179
rm -f .git/index &&
104
180
git reset --hard &&
105
- test_shallow_cache_tree
181
+ test_cache_tree
106
182
'
107
183
108
184
test_expect_success ' checkout gives cache-tree' '
109
185
git tag current &&
110
186
git checkout HEAD^ &&
111
- test_shallow_cache_tree
187
+ test_cache_tree
112
188
'
113
189
114
190
test_expect_success ' checkout -b gives cache-tree' '
115
191
git checkout current &&
116
192
git checkout -b prev HEAD^ &&
117
- test_shallow_cache_tree
193
+ test_cache_tree
118
194
'
119
195
120
196
test_expect_success ' checkout -B gives cache-tree' '
121
197
git checkout current &&
122
198
git checkout -B prev HEAD^ &&
123
- test_shallow_cache_tree
199
+ test_cache_tree
200
+ '
201
+
202
+ test_expect_success ' partial commit gives cache-tree' '
203
+ git checkout -b partial no-children &&
204
+ test_commit one &&
205
+ test_commit two &&
206
+ echo "some change" >one.t &&
207
+ git add one.t &&
208
+ echo "some other change" >two.t &&
209
+ git commit two.t -m partial &&
210
+ test_cache_tree
124
211
'
125
212
126
213
test_done
0 commit comments