t / t0002-gitfile.shon commit tree-walk: be more specific about corrupt tree errors (2edffef)
   1#!/bin/sh
   2
   3test_description='.git file
   4
   5Verify that plumbing commands work when .git is a file
   6'
   7. ./test-lib.sh
   8
   9objpath() {
  10        echo "$1" | sed -e 's|\(..\)|\1/|'
  11}
  12
  13objck() {
  14        p=$(objpath "$1")
  15        if test ! -f "$REAL/objects/$p"
  16        then
  17                echo "Object not found: $REAL/objects/$p"
  18                false
  19        fi
  20}
  21
  22test_expect_success 'initial setup' '
  23        REAL="$(pwd)/.real" &&
  24        mv .git "$REAL"
  25'
  26
  27test_expect_success 'bad setup: invalid .git file format' '
  28        echo "gitdir $REAL" >.git &&
  29        if git rev-parse 2>.err
  30        then
  31                echo "git rev-parse accepted an invalid .git file"
  32                false
  33        fi &&
  34        if ! grep "Invalid gitfile format" .err
  35        then
  36                echo "git rev-parse returned wrong error"
  37                false
  38        fi
  39'
  40
  41test_expect_success 'bad setup: invalid .git file path' '
  42        echo "gitdir: $REAL.not" >.git &&
  43        if git rev-parse 2>.err
  44        then
  45                echo "git rev-parse accepted an invalid .git file path"
  46                false
  47        fi &&
  48        if ! grep "Not a git repository" .err
  49        then
  50                echo "git rev-parse returned wrong error"
  51                false
  52        fi
  53'
  54
  55test_expect_success 'final setup + check rev-parse --git-dir' '
  56        echo "gitdir: $REAL" >.git &&
  57        test "$REAL" = "$(git rev-parse --git-dir)"
  58'
  59
  60test_expect_success 'check hash-object' '
  61        echo "foo" >bar &&
  62        SHA=$(cat bar | git hash-object -w --stdin) &&
  63        objck $SHA
  64'
  65
  66test_expect_success 'check cat-file' '
  67        git cat-file blob $SHA >actual &&
  68        test_cmp bar actual
  69'
  70
  71test_expect_success 'check update-index' '
  72        if test -f "$REAL/index"
  73        then
  74                echo "Hmm, $REAL/index exists?"
  75                false
  76        fi &&
  77        rm -f "$REAL/objects/$(objpath $SHA)" &&
  78        git update-index --add bar &&
  79        if ! test -f "$REAL/index"
  80        then
  81                echo "$REAL/index not found"
  82                false
  83        fi &&
  84        objck $SHA
  85'
  86
  87test_expect_success 'check write-tree' '
  88        SHA=$(git write-tree) &&
  89        objck $SHA
  90'
  91
  92test_expect_success 'check commit-tree' '
  93        SHA=$(echo "commit bar" | git commit-tree $SHA) &&
  94        objck $SHA
  95'
  96
  97test_expect_success 'check rev-list' '
  98        echo $SHA >"$REAL/HEAD" &&
  99        test "$SHA" = "$(git rev-list HEAD)"
 100'
 101
 102test_expect_success 'setup_git_dir twice in subdir' '
 103        git init sgd &&
 104        (
 105                cd sgd &&
 106                git config alias.lsfi ls-files &&
 107                mv .git .realgit &&
 108                echo "gitdir: .realgit" >.git &&
 109                mkdir subdir &&
 110                cd subdir &&
 111                >foo &&
 112                git add foo &&
 113                git lsfi >actual &&
 114                echo foo >expected &&
 115                test_cmp expected actual
 116        )
 117'
 118
 119test_expect_success 'enter_repo non-strict mode' '
 120        test_create_repo enter_repo &&
 121        (
 122                cd enter_repo &&
 123                test_tick &&
 124                test_commit foo &&
 125                mv .git .realgit &&
 126                echo "gitdir: .realgit" >.git
 127        ) &&
 128        git ls-remote enter_repo >actual &&
 129        cat >expected <<-\EOF &&
 130        946e985ab20de757ca5b872b16d64e92ff3803a9        HEAD
 131        946e985ab20de757ca5b872b16d64e92ff3803a9        refs/heads/master
 132        946e985ab20de757ca5b872b16d64e92ff3803a9        refs/tags/foo
 133        EOF
 134        test_cmp expected actual
 135'
 136
 137test_expect_success 'enter_repo linked checkout' '
 138        (
 139                cd enter_repo &&
 140                git worktree add  ../foo refs/tags/foo
 141        ) &&
 142        git ls-remote foo >actual &&
 143        cat >expected <<-\EOF &&
 144        946e985ab20de757ca5b872b16d64e92ff3803a9        HEAD
 145        946e985ab20de757ca5b872b16d64e92ff3803a9        refs/heads/master
 146        946e985ab20de757ca5b872b16d64e92ff3803a9        refs/tags/foo
 147        EOF
 148        test_cmp expected actual
 149'
 150
 151test_expect_success 'enter_repo strict mode' '
 152        git ls-remote --upload-pack="git upload-pack --strict" foo/.git >actual &&
 153        cat >expected <<-\EOF &&
 154        946e985ab20de757ca5b872b16d64e92ff3803a9        HEAD
 155        946e985ab20de757ca5b872b16d64e92ff3803a9        refs/heads/master
 156        946e985ab20de757ca5b872b16d64e92ff3803a9        refs/tags/foo
 157        EOF
 158        test_cmp expected actual
 159'
 160
 161test_done