Test the current state of the cache-tree optimization
The cache-tree optimization originally helped speed up write-tree operation. However, many commands no longer properly maintain -- or use an opportunity to cheaply generate -- the cache-tree data. In particular, this affects commit, checkout and reset. The notable examples that *do* write cache-tree data are read-tree and write-tree. This sadly means most people no longer benefit from the optimization, as they would not normally use the plumbing commands. Document the current state of affairs in a test file, in preparation for improvements in the area. Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Thomas Rast committed
Dec 6, 2011 at 18:43 UTC
4eb0346fb8f8a59a1fb7a6bd01154655a7020087
1 file changed
+95
t/t0090-cache-tree.sh
new
+95
@@ -0,0 +1,95 @@
1
+#!/bin/sh
2
+
3
+test_description="Test whether cache-tree is properly updated
4
+
5
+Tests whether various commands properly update and/or rewrite the
6
+cache-tree extension.
7
+"
8
+ . ./test-lib.sh
9
+
10
+cmp_cache_tree () {
11
+ test-dump-cache-tree >actual &&
12
+ sed "s/$_x40/SHA/" <actual >filtered &&
13
+ test_cmp "$1" filtered
14
+}
15
+
16
+# We don't bother with actually checking the SHA1:
17
+# test-dump-cache-tree already verifies that all existing data is
18
+# correct.
19
+test_shallow_cache_tree () {
20
+ echo "SHA " \
21
+ "($(git ls-files|wc -l) entries, 0 subtrees)" >expect &&
22
+ cmp_cache_tree expect
23
+}
24
+
25
+test_invalid_cache_tree () {
26
+ echo "invalid (0 subtrees)" >expect &&
27
+ echo "SHA #(ref) " \
28
+ "($(git ls-files|wc -l) entries, 0 subtrees)" >>expect &&
29
+ cmp_cache_tree expect
30
+}
31
+
32
+test_no_cache_tree () {
33
+ : >expect &&
34
+ cmp_cache_tree expect
35
+}
36
+
37
+test_expect_failure 'initial commit has cache-tree' '
38
+ test_commit foo &&
39
+ test_shallow_cache_tree
40
+'
41
+
42
+test_expect_success 'read-tree HEAD establishes cache-tree' '
43
+ git read-tree HEAD &&
44
+ test_shallow_cache_tree
45
+'
46
+
47
+test_expect_success 'git-add invalidates cache-tree' '
48
+ test_when_finished "git reset --hard; git read-tree HEAD" &&
49
+ echo "I changed this file" > foo &&
50
+ git add foo &&
51
+ test_invalid_cache_tree
52
+'
53
+
54
+test_expect_success 'update-index invalidates cache-tree' '
55
+ test_when_finished "git reset --hard; git read-tree HEAD" &&
56
+ echo "I changed this file" > foo &&
57
+ git update-index --add foo &&
58
+ test_invalid_cache_tree
59
+'
60
+
61
+test_expect_success 'write-tree establishes cache-tree' '
62
+ test-scrap-cache-tree &&
63
+ git write-tree &&
64
+ test_shallow_cache_tree
65
+'
66
+
67
+test_expect_success 'test-scrap-cache-tree works' '
68
+ git read-tree HEAD &&
69
+ test-scrap-cache-tree &&
70
+ test_no_cache_tree
71
+'
72
+
73
+test_expect_failure 'second commit has cache-tree' '
74
+ test_commit bar &&
75
+ test_shallow_cache_tree
76
+'
77
+
78
+test_expect_failure 'reset --hard gives cache-tree' '
79
+ test-scrap-cache-tree &&
80
+ git reset --hard &&
81
+ test_shallow_cache_tree
82
+'
83
+
84
+test_expect_failure 'reset --hard without index gives cache-tree' '
85
+ rm -f .git/index &&
86
+ git reset --hard &&
87
+ test_shallow_cache_tree
88
+'
89
+
90
+test_expect_failure 'checkout gives cache-tree' '
91
+ git checkout HEAD^ &&
92
+ test_shallow_cache_tree
93
+'
94
+
95
+test_done