541cad12a412e7daba1b3eae4366fc5fda7bb1bd
   1#!/bin/sh
   2
   3test_description='Test git update-ref error handling'
   4. ./test-lib.sh
   5
   6test_update_rejected () {
   7        before="$1" &&
   8        pack="$2" &&
   9        create="$3" &&
  10        error="$4" &&
  11        printf "create $prefix/%s $C\n" $before |
  12        git update-ref --stdin &&
  13        git for-each-ref $prefix >unchanged &&
  14        if $pack
  15        then
  16                git pack-refs --all
  17        fi &&
  18        printf "create $prefix/%s $C\n" $create >input &&
  19        test_must_fail git update-ref --stdin <input 2>output.err &&
  20        grep -F "$error" output.err &&
  21        git for-each-ref $prefix >actual &&
  22        test_cmp unchanged actual
  23}
  24
  25Q="'"
  26
  27test_expect_success 'setup' '
  28
  29        git commit --allow-empty -m Initial &&
  30        C=$(git rev-parse HEAD) &&
  31        git commit --allow-empty -m Second &&
  32        D=$(git rev-parse HEAD)
  33
  34'
  35
  36test_expect_success 'existing loose ref is a simple prefix of new' '
  37
  38        prefix=refs/1l &&
  39        test_update_rejected "a c e" false "b c/x d" \
  40                "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x$Q"
  41
  42'
  43
  44test_expect_success 'existing packed ref is a simple prefix of new' '
  45
  46        prefix=refs/1p &&
  47        test_update_rejected "a c e" true "b c/x d" \
  48                "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x$Q"
  49
  50'
  51
  52test_expect_success 'existing loose ref is a deeper prefix of new' '
  53
  54        prefix=refs/2l &&
  55        test_update_rejected "a c e" false "b c/x/y d" \
  56                "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x/y$Q"
  57
  58'
  59
  60test_expect_success 'existing packed ref is a deeper prefix of new' '
  61
  62        prefix=refs/2p &&
  63        test_update_rejected "a c e" true "b c/x/y d" \
  64                "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x/y$Q"
  65
  66'
  67
  68test_expect_success 'new ref is a simple prefix of existing loose' '
  69
  70        prefix=refs/3l &&
  71        test_update_rejected "a c/x e" false "b c d" \
  72                "$Q$prefix/c/x$Q exists; cannot create $Q$prefix/c$Q"
  73
  74'
  75
  76test_expect_success 'new ref is a simple prefix of existing packed' '
  77
  78        prefix=refs/3p &&
  79        test_update_rejected "a c/x e" true "b c d" \
  80                "$Q$prefix/c/x$Q exists; cannot create $Q$prefix/c$Q"
  81
  82'
  83
  84test_expect_success 'new ref is a deeper prefix of existing loose' '
  85
  86        prefix=refs/4l &&
  87        test_update_rejected "a c/x/y e" false "b c d" \
  88                "$Q$prefix/c/x/y$Q exists; cannot create $Q$prefix/c$Q"
  89
  90'
  91
  92test_expect_success 'new ref is a deeper prefix of existing packed' '
  93
  94        prefix=refs/4p &&
  95        test_update_rejected "a c/x/y e" true "b c d" \
  96                "$Q$prefix/c/x/y$Q exists; cannot create $Q$prefix/c$Q"
  97
  98'
  99
 100test_expect_success 'one new ref is a simple prefix of another' '
 101
 102        prefix=refs/5 &&
 103        test_update_rejected "a e" false "b c c/x d" \
 104                "cannot process $Q$prefix/c$Q and $Q$prefix/c/x$Q at the same time"
 105
 106'
 107
 108test_expect_success 'empty directory should not fool rev-parse' '
 109        prefix=refs/e-rev-parse &&
 110        git update-ref $prefix/foo $C &&
 111        git pack-refs --all &&
 112        mkdir -p .git/$prefix/foo/bar/baz &&
 113        echo "$C" >expected &&
 114        git rev-parse $prefix/foo >actual &&
 115        test_cmp expected actual
 116'
 117
 118test_expect_success 'empty directory should not fool for-each-ref' '
 119        prefix=refs/e-for-each-ref &&
 120        git update-ref $prefix/foo $C &&
 121        git for-each-ref $prefix >expected &&
 122        git pack-refs --all &&
 123        mkdir -p .git/$prefix/foo/bar/baz &&
 124        git for-each-ref $prefix >actual &&
 125        test_cmp expected actual
 126'
 127
 128test_expect_success 'empty directory should not fool create' '
 129        prefix=refs/e-create &&
 130        mkdir -p .git/$prefix/foo/bar/baz &&
 131        printf "create %s $C\n" $prefix/foo |
 132        git update-ref --stdin
 133'
 134
 135test_expect_success 'empty directory should not fool verify' '
 136        prefix=refs/e-verify &&
 137        git update-ref $prefix/foo $C &&
 138        git pack-refs --all &&
 139        mkdir -p .git/$prefix/foo/bar/baz &&
 140        printf "verify %s $C\n" $prefix/foo |
 141        git update-ref --stdin
 142'
 143
 144test_expect_success 'empty directory should not fool 1-arg update' '
 145        prefix=refs/e-update-1 &&
 146        git update-ref $prefix/foo $C &&
 147        git pack-refs --all &&
 148        mkdir -p .git/$prefix/foo/bar/baz &&
 149        printf "update %s $D\n" $prefix/foo |
 150        git update-ref --stdin
 151'
 152
 153test_expect_success 'empty directory should not fool 2-arg update' '
 154        prefix=refs/e-update-2 &&
 155        git update-ref $prefix/foo $C &&
 156        git pack-refs --all &&
 157        mkdir -p .git/$prefix/foo/bar/baz &&
 158        printf "update %s $D $C\n" $prefix/foo |
 159        git update-ref --stdin
 160'
 161
 162test_expect_success 'empty directory should not fool 0-arg delete' '
 163        prefix=refs/e-delete-0 &&
 164        git update-ref $prefix/foo $C &&
 165        git pack-refs --all &&
 166        mkdir -p .git/$prefix/foo/bar/baz &&
 167        printf "delete %s\n" $prefix/foo |
 168        git update-ref --stdin
 169'
 170
 171test_expect_success 'empty directory should not fool 1-arg delete' '
 172        prefix=refs/e-delete-1 &&
 173        git update-ref $prefix/foo $C &&
 174        git pack-refs --all &&
 175        mkdir -p .git/$prefix/foo/bar/baz &&
 176        printf "delete %s $C\n" $prefix/foo |
 177        git update-ref --stdin
 178'
 179
 180test_done