t / t1450-fsck.shon commit Merge branch 'maint' (d0b16c8)
   1#!/bin/sh
   2
   3test_description='git fsck random collection of tests'
   4
   5. ./test-lib.sh
   6
   7test_expect_success setup '
   8        test_commit A fileA one &&
   9        git checkout HEAD^0 &&
  10        test_commit B fileB two &&
  11        git tag -d A B &&
  12        git reflog expire --expire=now --all
  13'
  14
  15test_expect_success 'HEAD is part of refs' '
  16        test 0 = $(git fsck | wc -l)
  17'
  18
  19test_expect_success 'loose objects borrowed from alternate are not missing' '
  20        mkdir another &&
  21        (
  22                cd another &&
  23                git init &&
  24                echo ../../../.git/objects >.git/objects/info/alternates &&
  25                test_commit C fileC one &&
  26                git fsck >out &&
  27                ! grep "missing blob" out
  28        )
  29'
  30
  31# Corruption tests follow.  Make sure to remove all traces of the
  32# specific corruption you test afterwards, lest a later test trip over
  33# it.
  34
  35test_expect_success 'object with bad sha1' '
  36        sha=$(echo blob | git hash-object -w --stdin) &&
  37        echo $sha &&
  38        old=$(echo $sha | sed "s+^..+&/+") &&
  39        new=$(dirname $old)/ffffffffffffffffffffffffffffffffffffff &&
  40        sha="$(dirname $new)$(basename $new)"
  41        mv .git/objects/$old .git/objects/$new &&
  42        git update-index --add --cacheinfo 100644 $sha foo &&
  43        tree=$(git write-tree) &&
  44        cmt=$(echo bogus | git commit-tree $tree) &&
  45        git update-ref refs/heads/bogus $cmt &&
  46        (git fsck 2>out; true) &&
  47        grep "$sha.*corrupt" out &&
  48        rm -f .git/objects/$new &&
  49        git update-ref -d refs/heads/bogus &&
  50        git read-tree -u --reset HEAD
  51'
  52
  53test_expect_success 'branch pointing to non-commit' '
  54        git rev-parse HEAD^{tree} > .git/refs/heads/invalid &&
  55        git fsck 2>out &&
  56        grep "not a commit" out &&
  57        git update-ref -d refs/heads/invalid
  58'
  59
  60new=nothing
  61test_expect_success 'email without @ is okay' '
  62        git cat-file commit HEAD >basis &&
  63        sed "s/@/AT/" basis >okay &&
  64        new=$(git hash-object -t commit -w --stdin <okay) &&
  65        echo "$new" &&
  66        git update-ref refs/heads/bogus "$new" &&
  67        git fsck 2>out &&
  68        cat out &&
  69        ! grep "error in commit $new" out
  70'
  71git update-ref -d refs/heads/bogus
  72rm -f ".git/objects/$new"
  73
  74new=nothing
  75test_expect_success 'email with embedded > is not okay' '
  76        git cat-file commit HEAD >basis &&
  77        sed "s/@[a-z]/&>/" basis >bad-email &&
  78        new=$(git hash-object -t commit -w --stdin <bad-email) &&
  79        echo "$new" &&
  80        git update-ref refs/heads/bogus "$new" &&
  81        git fsck 2>out &&
  82        cat out &&
  83        grep "error in commit $new" out
  84'
  85git update-ref -d refs/heads/bogus
  86rm -f ".git/objects/$new"
  87
  88cat > invalid-tag <<EOF
  89object ffffffffffffffffffffffffffffffffffffffff
  90type commit
  91tag invalid
  92tagger T A Gger <tagger@example.com> 1234567890 -0000
  93
  94This is an invalid tag.
  95EOF
  96
  97test_expect_success 'tag pointing to nonexistent' '
  98        tag=$(git hash-object -t tag -w --stdin < invalid-tag) &&
  99        echo $tag > .git/refs/tags/invalid &&
 100        test_must_fail git fsck --tags >out &&
 101        cat out &&
 102        grep "broken link" out &&
 103        rm .git/refs/tags/invalid
 104'
 105
 106cat > wrong-tag <<EOF
 107object $(echo blob | git hash-object -w --stdin)
 108type commit
 109tag wrong
 110tagger T A Gger <tagger@example.com> 1234567890 -0000
 111
 112This is an invalid tag.
 113EOF
 114
 115test_expect_success 'tag pointing to something else than its type' '
 116        tag=$(git hash-object -t tag -w --stdin < wrong-tag) &&
 117        echo $tag > .git/refs/tags/wrong &&
 118        test_must_fail git fsck --tags 2>out &&
 119        cat out &&
 120        grep "error in tag.*broken links" out &&
 121        rm .git/refs/tags/wrong
 122'
 123
 124
 125
 126test_done