Commit | Line | Data |
---|---|---|
048cdd46 JH |
1 | #!/bin/sh |
2 | ||
b0032d1e | 3 | test_description='Test that adding/removing many notes triggers automatic fanout restructuring' |
048cdd46 JH |
4 | |
5 | . ./test-lib.sh | |
6 | ||
e1c52539 JH |
7 | path_has_fanout() { |
8 | path=$1 && | |
9 | fanout=$2 && | |
10 | after_last_slash=$((40 - $fanout * 2)) && | |
11 | echo $path | grep -q "^\([0-9a-f]\{2\}/\)\{$fanout\}[0-9a-f]\{$after_last_slash\}$" | |
12 | } | |
13 | ||
14 | touched_one_note_with_fanout() { | |
15 | notes_commit=$1 && | |
16 | modification=$2 && # 'A' for addition, 'D' for deletion | |
17 | fanout=$3 && | |
18 | diff=$(git diff-tree --no-commit-id --name-status --root -r $notes_commit) && | |
19 | path=$(echo $diff | sed -e "s/^$modification[\t ]//") && | |
20 | path_has_fanout "$path" $fanout; | |
21 | } | |
22 | ||
23 | all_notes_have_fanout() { | |
24 | notes_commit=$1 && | |
25 | fanout=$2 && | |
26 | git ls-tree -r --name-only $notes_commit 2>/dev/null | | |
27 | while read path | |
28 | do | |
29 | path_has_fanout $path $fanout || return 1 | |
30 | done | |
31 | } | |
32 | ||
dbc27477 JH |
33 | test_expect_success 'tweak test environment' ' |
34 | git checkout -b nondeterminism && | |
35 | test_commit A && | |
36 | git checkout --orphan with_notes; | |
37 | ' | |
38 | ||
048cdd46 JH |
39 | test_expect_success 'creating many notes with git-notes' ' |
40 | num_notes=300 && | |
41 | i=0 && | |
42 | while test $i -lt $num_notes | |
43 | do | |
44 | i=$(($i + 1)) && | |
45 | test_tick && | |
46 | echo "file for commit #$i" > file && | |
47 | git add file && | |
48 | git commit -q -m "commit #$i" && | |
aaec9bcf | 49 | git notes add -m "note #$i" || return 1 |
048cdd46 JH |
50 | done |
51 | ' | |
52 | ||
53 | test_expect_success 'many notes created correctly with git-notes' ' | |
54 | git log | grep "^ " > output && | |
e1c52539 | 55 | i=$num_notes && |
048cdd46 JH |
56 | while test $i -gt 0 |
57 | do | |
58 | echo " commit #$i" && | |
59 | echo " note #$i" && | |
60 | i=$(($i - 1)); | |
61 | done > expect && | |
62 | test_cmp expect output | |
63 | ' | |
64 | ||
e1c52539 JH |
65 | test_expect_success 'stable fanout 0 is followed by stable fanout 1' ' |
66 | i=$num_notes && | |
67 | fanout=0 && | |
68 | while test $i -gt 0 | |
048cdd46 | 69 | do |
e1c52539 JH |
70 | i=$(($i - 1)) && |
71 | if touched_one_note_with_fanout refs/notes/commits~$i A $fanout | |
72 | then | |
73 | continue | |
74 | elif test $fanout -eq 0 | |
75 | then | |
76 | fanout=1 && | |
77 | if all_notes_have_fanout refs/notes/commits~$i $fanout | |
78 | then | |
79 | echo "Fanout 0 -> 1 at refs/notes/commits~$i" && | |
80 | continue | |
81 | fi | |
82 | fi && | |
83 | echo "Failed fanout=$fanout check at refs/notes/commits~$i" && | |
84 | git ls-tree -r --name-only refs/notes/commits~$i && | |
85 | return 1 | |
86 | done && | |
87 | all_notes_have_fanout refs/notes/commits 1 | |
048cdd46 JH |
88 | ' |
89 | ||
b0032d1e | 90 | test_expect_success 'deleting most notes with git-notes' ' |
e1c52539 | 91 | remove_notes=285 && |
b0032d1e JH |
92 | i=0 && |
93 | git rev-list HEAD | | |
e1c52539 | 94 | while test $i -lt $remove_notes && read sha1 |
b0032d1e JH |
95 | do |
96 | i=$(($i + 1)) && | |
b0032d1e | 97 | test_tick && |
e1c52539 | 98 | git notes remove "$sha1" 2>/dev/null || return 1 |
b0032d1e JH |
99 | done |
100 | ' | |
101 | ||
102 | test_expect_success 'most notes deleted correctly with git-notes' ' | |
e1c52539 JH |
103 | git log HEAD~$remove_notes | grep "^ " > output && |
104 | i=$(($num_notes - $remove_notes)) && | |
b0032d1e JH |
105 | while test $i -gt 0 |
106 | do | |
107 | echo " commit #$i" && | |
108 | echo " note #$i" && | |
109 | i=$(($i - 1)); | |
110 | done > expect && | |
111 | test_cmp expect output | |
112 | ' | |
113 | ||
e1c52539 JH |
114 | test_expect_success 'stable fanout 1 is followed by stable fanout 0' ' |
115 | i=$remove_notes && | |
116 | fanout=1 && | |
117 | while test $i -gt 0 | |
b0032d1e | 118 | do |
e1c52539 JH |
119 | i=$(($i - 1)) && |
120 | if touched_one_note_with_fanout refs/notes/commits~$i D $fanout | |
121 | then | |
122 | continue | |
123 | elif test $fanout -eq 1 | |
124 | then | |
125 | fanout=0 && | |
126 | if all_notes_have_fanout refs/notes/commits~$i $fanout | |
127 | then | |
128 | echo "Fanout 1 -> 0 at refs/notes/commits~$i" && | |
129 | continue | |
130 | fi | |
131 | fi && | |
132 | echo "Failed fanout=$fanout check at refs/notes/commits~$i" && | |
133 | git ls-tree -r --name-only refs/notes/commits~$i && | |
134 | return 1 | |
135 | done && | |
136 | all_notes_have_fanout refs/notes/commits 0 | |
b0032d1e JH |
137 | ' |
138 | ||
048cdd46 | 139 | test_done |