t / t0090-cache-tree.shon commit Merge branch 'ak/commit-only-allow-empty' into maint (9d2a248)
   1#!/bin/sh
   2
   3test_description="Test whether cache-tree is properly updated
   4
   5Tests whether various commands properly update and/or rewrite the
   6cache-tree extension.
   7"
   8 . ./test-lib.sh
   9
  10cmp_cache_tree () {
  11        test-dump-cache-tree | sed -e '/#(ref)/d' >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.
  19generate_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 -v c=0 '$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
  37generate_expected_cache_tree () {
  38        (
  39                generate_expected_cache_tree_rec
  40        )
  41}
  42
  43test_cache_tree () {
  44        generate_expected_cache_tree >expect &&
  45        cmp_cache_tree expect
  46}
  47
  48test_invalid_cache_tree () {
  49        printf "invalid                                  %s ()\n" "" "$@" >expect &&
  50        test-dump-cache-tree |
  51        sed -n -e "s/[0-9]* subtrees//" -e '/#(ref)/d' -e '/^invalid /p' >actual &&
  52        test_cmp expect actual
  53}
  54
  55test_no_cache_tree () {
  56        : >expect &&
  57        cmp_cache_tree expect
  58}
  59
  60test_expect_success 'initial commit has cache-tree' '
  61        test_commit foo &&
  62        test_cache_tree
  63'
  64
  65test_expect_success 'read-tree HEAD establishes cache-tree' '
  66        git read-tree HEAD &&
  67        test_cache_tree
  68'
  69
  70test_expect_success 'git-add invalidates cache-tree' '
  71        test_when_finished "git reset --hard; git read-tree HEAD" &&
  72        echo "I changed this file" >foo &&
  73        git add foo &&
  74        test_invalid_cache_tree
  75'
  76
  77test_expect_success 'git-add in subdir invalidates cache-tree' '
  78        test_when_finished "git reset --hard; git read-tree HEAD" &&
  79        mkdir dirx &&
  80        echo "I changed this file" >dirx/foo &&
  81        git add dirx/foo &&
  82        test_invalid_cache_tree
  83'
  84
  85cat >before <<\EOF
  86SHA  (3 entries, 2 subtrees)
  87SHA dir1/ (1 entries, 0 subtrees)
  88SHA dir2/ (1 entries, 0 subtrees)
  89EOF
  90
  91cat >expect <<\EOF
  92invalid                                   (2 subtrees)
  93invalid                                  dir1/ (0 subtrees)
  94SHA dir2/ (1 entries, 0 subtrees)
  95EOF
  96
  97test_expect_success 'git-add in subdir does not invalidate sibling cache-tree' '
  98        git tag no-children &&
  99        test_when_finished "git reset --hard no-children; git read-tree HEAD" &&
 100        mkdir dir1 dir2 &&
 101        test_commit dir1/a &&
 102        test_commit dir2/b &&
 103        echo "I changed this file" >dir1/a &&
 104        cmp_cache_tree before &&
 105        echo "I changed this file" >dir1/a &&
 106        git add dir1/a &&
 107        cmp_cache_tree expect
 108'
 109
 110test_expect_success 'update-index invalidates cache-tree' '
 111        test_when_finished "git reset --hard; git read-tree HEAD" &&
 112        echo "I changed this file" >foo &&
 113        git update-index --add foo &&
 114        test_invalid_cache_tree
 115'
 116
 117test_expect_success 'write-tree establishes cache-tree' '
 118        test-scrap-cache-tree &&
 119        git write-tree &&
 120        test_cache_tree
 121'
 122
 123test_expect_success 'test-scrap-cache-tree works' '
 124        git read-tree HEAD &&
 125        test-scrap-cache-tree &&
 126        test_no_cache_tree
 127'
 128
 129test_expect_success 'second commit has cache-tree' '
 130        test_commit bar &&
 131        test_cache_tree
 132'
 133
 134test_expect_success PERL '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
 164test_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
 170'
 171
 172test_expect_success 'reset --hard gives cache-tree' '
 173        test-scrap-cache-tree &&
 174        git reset --hard &&
 175        test_cache_tree
 176'
 177
 178test_expect_success 'reset --hard without index gives cache-tree' '
 179        rm -f .git/index &&
 180        git reset --hard &&
 181        test_cache_tree
 182'
 183
 184test_expect_success 'checkout gives cache-tree' '
 185        git tag current &&
 186        git checkout HEAD^ &&
 187        test_cache_tree
 188'
 189
 190test_expect_success 'checkout -b gives cache-tree' '
 191        git checkout current &&
 192        git checkout -b prev HEAD^ &&
 193        test_cache_tree
 194'
 195
 196test_expect_success 'checkout -B gives cache-tree' '
 197        git checkout current &&
 198        git checkout -B prev HEAD^ &&
 199        test_cache_tree
 200'
 201
 202test_expect_success 'merge --ff-only maintains cache-tree' '
 203        git checkout current &&
 204        git checkout -b changes &&
 205        test_commit llamas &&
 206        test_commit pachyderm &&
 207        test_cache_tree &&
 208        git checkout current &&
 209        test_cache_tree &&
 210        git merge --ff-only changes &&
 211        test_cache_tree
 212'
 213
 214test_expect_success 'merge maintains cache-tree' '
 215        git checkout current &&
 216        git checkout -b changes2 &&
 217        test_commit alpacas &&
 218        test_cache_tree &&
 219        git checkout current &&
 220        test_commit struthio &&
 221        test_cache_tree &&
 222        git merge changes2 &&
 223        test_cache_tree
 224'
 225
 226test_expect_success 'partial commit gives cache-tree' '
 227        git checkout -b partial no-children &&
 228        test_commit one &&
 229        test_commit two &&
 230        echo "some change" >one.t &&
 231        git add one.t &&
 232        echo "some other change" >two.t &&
 233        git commit two.t -m partial &&
 234        test_cache_tree
 235'
 236
 237test_expect_success 'no phantom error when switching trees' '
 238        mkdir newdir &&
 239        >newdir/one &&
 240        git add newdir/one &&
 241        git checkout 2>errors &&
 242        ! test -s errors
 243'
 244
 245test_expect_success 'switching trees does not invalidate shared index' '
 246        git update-index --split-index &&
 247        >split &&
 248        git add split &&
 249        test-dump-split-index .git/index | grep -v ^own >before &&
 250        git commit -m "as-is" &&
 251        test-dump-split-index .git/index | grep -v ^own >after &&
 252        test_cmp before after
 253'
 254
 255test_done