Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 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 () { |
Nguyễn Thái Ngọc Duy | 06ccb29 | 2018-03-24 08:44:39 +0100 | [diff] [blame] | 11 | test-tool dump-cache-tree | sed -e '/#(ref)/d' >actual && |
brian m. carlson | 2ece6ad | 2018-05-13 02:24:15 +0000 | [diff] [blame] | 12 | sed "s/$OID_REGEX/SHA/" <actual >filtered && |
Ævar Arnfjörð Bjarmason | 3f96d75 | 2021-01-23 14:00:37 +0100 | [diff] [blame] | 13 | test_cmp "$1" filtered && |
| 14 | rm filtered |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 15 | } |
| 16 | |
| 17 | # We don't bother with actually checking the SHA1: |
Nguyễn Thái Ngọc Duy | 06ccb29 | 2018-03-24 08:44:39 +0100 | [diff] [blame] | 18 | # test-tool dump-cache-tree already verifies that all existing data is |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 19 | # correct. |
Ævar Arnfjörð Bjarmason | fa6edee | 2021-01-23 14:00:39 +0100 | [diff] [blame] | 20 | generate_expected_cache_tree () { |
Ævar Arnfjörð Bjarmason | ef83970 | 2021-01-23 14:00:40 +0100 | [diff] [blame] | 21 | pathspec="$1" && |
| 22 | dir="$2${2:+/}" && |
| 23 | git ls-tree --name-only HEAD -- "$pathspec" >files && |
| 24 | git ls-tree --name-only -d HEAD -- "$pathspec" >subtrees && |
| 25 | printf "SHA %s (%d entries, %d subtrees)\n" "$dir" $(wc -l <files) $(wc -l <subtrees) && |
| 26 | while read subtree |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 27 | do |
Ævar Arnfjörð Bjarmason | ef83970 | 2021-01-23 14:00:40 +0100 | [diff] [blame] | 28 | generate_expected_cache_tree "$pathspec/$subtree/" "$subtree" || return 1 |
| 29 | done <subtrees |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 30 | } |
| 31 | |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 32 | test_cache_tree () { |
Ævar Arnfjörð Bjarmason | ef83970 | 2021-01-23 14:00:40 +0100 | [diff] [blame] | 33 | generate_expected_cache_tree "." >expect && |
| 34 | cmp_cache_tree expect && |
| 35 | rm expect actual files subtrees && |
| 36 | git status --porcelain -- ':!status' ':!expected.status' >status && |
| 37 | if test -n "$1" |
| 38 | then |
| 39 | test_cmp "$1" status |
| 40 | else |
| 41 | test_must_be_empty status |
| 42 | fi |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 43 | } |
| 44 | |
| 45 | test_invalid_cache_tree () { |
David Turner | 59a8adb | 2014-07-10 17:31:25 -0700 | [diff] [blame] | 46 | printf "invalid %s ()\n" "" "$@" >expect && |
Nguyễn Thái Ngọc Duy | 06ccb29 | 2018-03-24 08:44:39 +0100 | [diff] [blame] | 47 | test-tool dump-cache-tree | |
David Turner | 59a8adb | 2014-07-10 17:31:25 -0700 | [diff] [blame] | 48 | sed -n -e "s/[0-9]* subtrees//" -e '/#(ref)/d' -e '/^invalid /p' >actual && |
| 49 | test_cmp expect actual |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 50 | } |
| 51 | |
| 52 | test_no_cache_tree () { |
Ævar Arnfjörð Bjarmason | 3f96d75 | 2021-01-23 14:00:37 +0100 | [diff] [blame] | 53 | >expect && |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 54 | cmp_cache_tree expect |
| 55 | } |
| 56 | |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 57 | test_expect_success 'initial commit has cache-tree' ' |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 58 | test_commit foo && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 59 | test_cache_tree |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 60 | ' |
| 61 | |
| 62 | test_expect_success 'read-tree HEAD establishes cache-tree' ' |
| 63 | git read-tree HEAD && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 64 | test_cache_tree |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 65 | ' |
| 66 | |
| 67 | test_expect_success 'git-add invalidates cache-tree' ' |
| 68 | test_when_finished "git reset --hard; git read-tree HEAD" && |
David Turner | aecf567 | 2014-07-05 21:06:56 -0700 | [diff] [blame] | 69 | echo "I changed this file" >foo && |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 70 | git add foo && |
| 71 | test_invalid_cache_tree |
| 72 | ' |
| 73 | |
David Turner | 59a8adb | 2014-07-10 17:31:25 -0700 | [diff] [blame] | 74 | test_expect_success 'git-add in subdir invalidates cache-tree' ' |
| 75 | test_when_finished "git reset --hard; git read-tree HEAD" && |
| 76 | mkdir dirx && |
| 77 | echo "I changed this file" >dirx/foo && |
| 78 | git add dirx/foo && |
| 79 | test_invalid_cache_tree |
| 80 | ' |
| 81 | |
| 82 | test_expect_success 'git-add in subdir does not invalidate sibling cache-tree' ' |
| 83 | git tag no-children && |
| 84 | test_when_finished "git reset --hard no-children; git read-tree HEAD" && |
| 85 | mkdir dir1 dir2 && |
| 86 | test_commit dir1/a && |
| 87 | test_commit dir2/b && |
| 88 | echo "I changed this file" >dir1/a && |
Ævar Arnfjörð Bjarmason | 3f96d75 | 2021-01-23 14:00:37 +0100 | [diff] [blame] | 89 | test_when_finished "rm before" && |
| 90 | cat >before <<-\EOF && |
| 91 | SHA (3 entries, 2 subtrees) |
| 92 | SHA dir1/ (1 entries, 0 subtrees) |
| 93 | SHA dir2/ (1 entries, 0 subtrees) |
| 94 | EOF |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 95 | cmp_cache_tree before && |
| 96 | echo "I changed this file" >dir1/a && |
David Turner | 59a8adb | 2014-07-10 17:31:25 -0700 | [diff] [blame] | 97 | git add dir1/a && |
Ævar Arnfjörð Bjarmason | 3f96d75 | 2021-01-23 14:00:37 +0100 | [diff] [blame] | 98 | cat >expect <<-\EOF && |
| 99 | invalid (2 subtrees) |
| 100 | invalid dir1/ (0 subtrees) |
| 101 | SHA dir2/ (1 entries, 0 subtrees) |
| 102 | EOF |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 103 | cmp_cache_tree expect |
David Turner | 59a8adb | 2014-07-10 17:31:25 -0700 | [diff] [blame] | 104 | ' |
| 105 | |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 106 | test_expect_success 'update-index invalidates cache-tree' ' |
| 107 | test_when_finished "git reset --hard; git read-tree HEAD" && |
David Turner | aecf567 | 2014-07-05 21:06:56 -0700 | [diff] [blame] | 108 | echo "I changed this file" >foo && |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 109 | git update-index --add foo && |
| 110 | test_invalid_cache_tree |
| 111 | ' |
| 112 | |
| 113 | test_expect_success 'write-tree establishes cache-tree' ' |
Nguyễn Thái Ngọc Duy | ff5fb8b | 2018-03-24 08:44:56 +0100 | [diff] [blame] | 114 | test-tool scrap-cache-tree && |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 115 | git write-tree && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 116 | test_cache_tree |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 117 | ' |
| 118 | |
Nguyễn Thái Ngọc Duy | ff5fb8b | 2018-03-24 08:44:56 +0100 | [diff] [blame] | 119 | test_expect_success 'test-tool scrap-cache-tree works' ' |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 120 | git read-tree HEAD && |
Nguyễn Thái Ngọc Duy | ff5fb8b | 2018-03-24 08:44:56 +0100 | [diff] [blame] | 121 | test-tool scrap-cache-tree && |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 122 | test_no_cache_tree |
| 123 | ' |
| 124 | |
Thomas Rast | 11c8a74 | 2011-12-06 18:43:38 +0100 | [diff] [blame] | 125 | test_expect_success 'second commit has cache-tree' ' |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 126 | test_commit bar && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 127 | test_cache_tree |
| 128 | ' |
| 129 | |
Jeff King | 5a97639 | 2014-11-18 12:22:31 -0500 | [diff] [blame] | 130 | test_expect_success PERL 'commit --interactive gives cache-tree on partial commit' ' |
Ævar Arnfjörð Bjarmason | ef83970 | 2021-01-23 14:00:40 +0100 | [diff] [blame] | 131 | test_when_finished "git reset --hard" && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 132 | cat <<-\EOT >foo.c && |
| 133 | int foo() |
| 134 | { |
| 135 | return 42; |
| 136 | } |
| 137 | int bar() |
| 138 | { |
| 139 | return 42; |
| 140 | } |
| 141 | EOT |
| 142 | git add foo.c && |
| 143 | test_invalid_cache_tree && |
| 144 | git commit -m "add a file" && |
| 145 | test_cache_tree && |
| 146 | cat <<-\EOT >foo.c && |
| 147 | int foo() |
| 148 | { |
| 149 | return 43; |
| 150 | } |
| 151 | int bar() |
| 152 | { |
| 153 | return 44; |
| 154 | } |
| 155 | EOT |
Eric Sunshine | 0590ff2 | 2018-07-01 20:23:42 -0400 | [diff] [blame] | 156 | test_write_lines p 1 "" s n y q | |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 157 | git commit --interactive -m foo && |
Ævar Arnfjörð Bjarmason | ef83970 | 2021-01-23 14:00:40 +0100 | [diff] [blame] | 158 | cat <<-\EOF >expected.status && |
| 159 | M foo.c |
| 160 | EOF |
| 161 | test_cache_tree expected.status |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 162 | ' |
| 163 | |
Jeff King | 6c003d6 | 2018-09-04 19:36:43 -0400 | [diff] [blame] | 164 | test_expect_success PERL 'commit -p with shrinking cache-tree' ' |
brian m. carlson | b0d3c42 | 2019-06-28 22:59:25 +0000 | [diff] [blame] | 165 | mkdir -p deep/very-long-subdir && |
| 166 | echo content >deep/very-long-subdir/file && |
Jeff King | 6c003d6 | 2018-09-04 19:36:43 -0400 | [diff] [blame] | 167 | git add deep && |
| 168 | git commit -m add && |
| 169 | git rm -r deep && |
| 170 | |
| 171 | before=$(wc -c <.git/index) && |
| 172 | git commit -m delete -p && |
| 173 | after=$(wc -c <.git/index) && |
| 174 | |
| 175 | # double check that the index shrank |
| 176 | test $before -gt $after && |
| 177 | |
| 178 | # and that our index was not corrupted |
| 179 | git fsck |
| 180 | ' |
| 181 | |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 182 | test_expect_success 'commit in child dir has cache-tree' ' |
| 183 | mkdir dir && |
| 184 | >dir/child.t && |
| 185 | git add dir/child.t && |
| 186 | git commit -m dir/child.t && |
| 187 | test_cache_tree |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 188 | ' |
| 189 | |
Thomas Rast | 6c52ec8 | 2011-12-06 18:43:39 +0100 | [diff] [blame] | 190 | test_expect_success 'reset --hard gives cache-tree' ' |
Nguyễn Thái Ngọc Duy | ff5fb8b | 2018-03-24 08:44:56 +0100 | [diff] [blame] | 191 | test-tool scrap-cache-tree && |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 192 | git reset --hard && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 193 | test_cache_tree |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 194 | ' |
| 195 | |
Thomas Rast | 6c52ec8 | 2011-12-06 18:43:39 +0100 | [diff] [blame] | 196 | test_expect_success 'reset --hard without index gives cache-tree' ' |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 197 | rm -f .git/index && |
Elijah Newren | f222bd3 | 2021-09-11 17:08:42 +0000 | [diff] [blame] | 198 | git clean -fd && |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 199 | git reset --hard && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 200 | test_cache_tree |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 201 | ' |
| 202 | |
David Turner | aecf567 | 2014-07-05 21:06:56 -0700 | [diff] [blame] | 203 | test_expect_success 'checkout gives cache-tree' ' |
| 204 | git tag current && |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 205 | git checkout HEAD^ && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 206 | test_cache_tree |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 207 | ' |
| 208 | |
David Turner | aecf567 | 2014-07-05 21:06:56 -0700 | [diff] [blame] | 209 | test_expect_success 'checkout -b gives cache-tree' ' |
| 210 | git checkout current && |
| 211 | git checkout -b prev HEAD^ && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 212 | test_cache_tree |
David Turner | aecf567 | 2014-07-05 21:06:56 -0700 | [diff] [blame] | 213 | ' |
| 214 | |
| 215 | test_expect_success 'checkout -B gives cache-tree' ' |
| 216 | git checkout current && |
| 217 | git checkout -B prev HEAD^ && |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 218 | test_cache_tree |
| 219 | ' |
| 220 | |
Brian Degenhardt | 52fca21 | 2015-07-28 15:30:40 -0400 | [diff] [blame] | 221 | test_expect_success 'merge --ff-only maintains cache-tree' ' |
| 222 | git checkout current && |
| 223 | git checkout -b changes && |
| 224 | test_commit llamas && |
| 225 | test_commit pachyderm && |
| 226 | test_cache_tree && |
| 227 | git checkout current && |
| 228 | test_cache_tree && |
| 229 | git merge --ff-only changes && |
| 230 | test_cache_tree |
| 231 | ' |
| 232 | |
| 233 | test_expect_success 'merge maintains cache-tree' ' |
| 234 | git checkout current && |
| 235 | git checkout -b changes2 && |
| 236 | test_commit alpacas && |
| 237 | test_cache_tree && |
| 238 | git checkout current && |
| 239 | test_commit struthio && |
| 240 | test_cache_tree && |
| 241 | git merge changes2 && |
| 242 | test_cache_tree |
| 243 | ' |
| 244 | |
David Turner | 9c4d6c0 | 2014-07-13 13:28:19 -0700 | [diff] [blame] | 245 | test_expect_success 'partial commit gives cache-tree' ' |
| 246 | git checkout -b partial no-children && |
| 247 | test_commit one && |
| 248 | test_commit two && |
| 249 | echo "some change" >one.t && |
| 250 | git add one.t && |
| 251 | echo "some other change" >two.t && |
| 252 | git commit two.t -m partial && |
Ævar Arnfjörð Bjarmason | ef83970 | 2021-01-23 14:00:40 +0100 | [diff] [blame] | 253 | cat <<-\EOF >expected.status && |
| 254 | M one.t |
| 255 | EOF |
| 256 | test_cache_tree expected.status |
David Turner | aecf567 | 2014-07-05 21:06:56 -0700 | [diff] [blame] | 257 | ' |
| 258 | |
Junio C Hamano | 4ed115e | 2014-09-02 14:16:20 -0700 | [diff] [blame] | 259 | test_expect_success 'no phantom error when switching trees' ' |
| 260 | mkdir newdir && |
| 261 | >newdir/one && |
| 262 | git add newdir/one && |
| 263 | git checkout 2>errors && |
SZEDER Gábor | ec10b01 | 2018-08-19 23:57:22 +0200 | [diff] [blame] | 264 | test_must_be_empty errors |
Junio C Hamano | 4ed115e | 2014-09-02 14:16:20 -0700 | [diff] [blame] | 265 | ' |
| 266 | |
David Turner | 475a344 | 2015-08-27 13:07:54 -0400 | [diff] [blame] | 267 | test_expect_success 'switching trees does not invalidate shared index' ' |
SZEDER Gábor | 456d7cd | 2018-09-06 04:48:07 +0200 | [diff] [blame] | 268 | ( |
| 269 | sane_unset GIT_TEST_SPLIT_INDEX && |
| 270 | git update-index --split-index && |
| 271 | >split && |
| 272 | git add split && |
| 273 | test-tool dump-split-index .git/index | grep -v ^own >before && |
| 274 | git commit -m "as-is" && |
| 275 | test-tool dump-split-index .git/index | grep -v ^own >after && |
| 276 | test_cmp before after |
| 277 | ) |
David Turner | 475a344 | 2015-08-27 13:07:54 -0400 | [diff] [blame] | 278 | ' |
| 279 | |
Thomas Rast | 4eb0346 | 2011-12-06 18:43:36 +0100 | [diff] [blame] | 280 | test_done |