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