t / t1302-repo-version.shon commit Merge branch 'jk/pack-idx-corruption-safety' into maint (80047fa)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Nguyễn Thái Ngọc Duy
   4#
   5
   6test_description='Test repository version check'
   7
   8. ./test-lib.sh
   9
  10test_expect_success 'setup' '
  11        cat >test.patch <<-\EOF &&
  12        diff --git a/test.txt b/test.txt
  13        new file mode 100644
  14        --- /dev/null
  15        +++ b/test.txt
  16        @@ -0,0 +1 @@
  17        +123
  18        EOF
  19
  20        test_create_repo "test" &&
  21        test_create_repo "test2" &&
  22        git config --file=test2/.git/config core.repositoryformatversion 99
  23'
  24
  25test_expect_success 'gitdir selection on normal repos' '
  26        echo 0 >expect &&
  27        git config core.repositoryformatversion >actual &&
  28        (
  29                cd test &&
  30                git config core.repositoryformatversion >../actual2
  31        ) &&
  32        test_cmp expect actual &&
  33        test_cmp expect actual2
  34'
  35
  36test_expect_success 'gitdir selection on unsupported repo' '
  37        # Make sure it would stop at test2, not trash
  38        echo 99 >expect &&
  39        (
  40                cd test2 &&
  41                git config core.repositoryformatversion >../actual
  42        ) &&
  43        test_cmp expect actual
  44'
  45
  46test_expect_success 'gitdir not required mode' '
  47        git apply --stat test.patch &&
  48        (
  49                cd test &&
  50                git apply --stat ../test.patch
  51        ) &&
  52        (
  53                cd test2 &&
  54                git apply --stat ../test.patch
  55        )
  56'
  57
  58test_expect_success 'gitdir required mode' '
  59        git apply --check --index test.patch &&
  60        (
  61                cd test &&
  62                git apply --check --index ../test.patch
  63        ) &&
  64        (
  65                cd test2 &&
  66                test_must_fail git apply --check --index ../test.patch
  67        )
  68'
  69
  70check_allow () {
  71        git rev-parse --git-dir >actual &&
  72        echo .git >expect &&
  73        test_cmp expect actual
  74}
  75
  76check_abort () {
  77        test_must_fail git rev-parse --git-dir
  78}
  79
  80# avoid git-config, since it cannot be trusted to run
  81# in a repository with a broken version
  82mkconfig () {
  83        echo '[core]' &&
  84        echo "repositoryformatversion = $1" &&
  85        shift &&
  86
  87        if test $# -gt 0; then
  88                echo '[extensions]' &&
  89                for i in "$@"; do
  90                        echo "$i"
  91                done
  92        fi
  93}
  94
  95while read outcome version extensions; do
  96        test_expect_success "$outcome version=$version $extensions" "
  97                mkconfig $version $extensions >.git/config &&
  98                check_${outcome}
  99        "
 100done <<\EOF
 101allow 0
 102allow 1
 103allow 1 noop
 104abort 1 no-such-extension
 105allow 0 no-such-extension
 106EOF
 107
 108test_expect_success 'precious-objects allowed' '
 109        mkconfig 1 preciousObjects >.git/config &&
 110        check_allow
 111'
 112
 113test_expect_success 'precious-objects blocks destructive repack' '
 114        test_must_fail git repack -ad
 115'
 116
 117test_expect_success 'other repacks are OK' '
 118        test_commit foo &&
 119        git repack
 120'
 121
 122test_expect_success 'precious-objects blocks prune' '
 123        test_must_fail git prune
 124'
 125
 126test_expect_success 'gc runs without complaint' '
 127        git gc
 128'
 129
 130test_done