1
1
#! /bin/sh
2
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
+ '
4
8
5
9
. ./test-lib.sh
6
10
7
11
test_expect_success setup '
12
+ git config gc.auto 0 &&
8
13
git config i18n.commitencoding ISO-8859-1 &&
9
14
test_commit A fileA one &&
10
15
git config --unset i18n.commitencoding &&
11
16
git checkout HEAD^0 &&
12
17
test_commit B fileB two &&
13
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
19
21
'
20
22
21
23
test_expect_success ' loose objects borrowed from alternate are not missing' '
@@ -25,110 +27,132 @@ test_expect_success 'loose objects borrowed from alternate are not missing' '
25
27
git init &&
26
28
echo ../../../.git/objects >.git/objects/info/alternates &&
27
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
31
37
'
32
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
37
42
'
38
43
39
44
# Corruption tests follow. Make sure to remove all traces of the
40
45
# specific corruption you test afterwards, lest a later test trip over
41
46
# it.
42
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
+
43
60
test_expect_success ' object with bad sha1' '
44
61
sha=$(echo blob | git hash-object -w --stdin) &&
45
- echo $sha &&
46
62
old=$(echo $sha | sed "s+^..+&/+") &&
47
63
new=$(dirname $old)/ffffffffffffffffffffffffffffffffffffff &&
48
64
sha="$(dirname $new)$(basename $new)"
49
65
mv .git/objects/$old .git/objects/$new &&
66
+ test_when_finished "remove_object $sha" &&
50
67
git update-index --add --cacheinfo 100644 $sha foo &&
68
+ test_when_finished "git read-tree -u --reset HEAD" &&
51
69
tree=$(git write-tree) &&
70
+ test_when_finished "remove_object $tree" &&
52
71
cmt=$(echo bogus | git commit-tree $tree) &&
72
+ test_when_finished "remove_object $cmt" &&
53
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
59
79
'
60
80
61
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" &&
63
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
66
87
'
67
88
68
- new=nothing
69
89
test_expect_success ' email without @ is okay' '
70
90
git cat-file commit HEAD >basis &&
71
91
sed "s/@/AT/" basis >okay &&
72
92
new=$(git hash-object -t commit -w --stdin <okay) &&
73
- echo " $new" &&
93
+ test_when_finished "remove_object $new" &&
74
94
git update-ref refs/heads/bogus "$new" &&
95
+ test_when_finished "git update-ref -d refs/heads/bogus" &&
75
96
git fsck 2>out &&
76
97
cat out &&
77
- ! grep "error in commit $new" out
98
+ ! grep "commit $new" out
78
99
'
79
- git update-ref -d refs/heads/bogus
80
- rm -f " .git/objects/$new "
81
100
82
- new=nothing
83
101
test_expect_success ' email with embedded > is not okay' '
84
102
git cat-file commit HEAD >basis &&
85
103
sed "s/@[a-z]/&>/" basis >bad-email &&
86
104
new=$(git hash-object -t commit -w --stdin <bad-email) &&
87
- echo " $new" &&
105
+ test_when_finished "remove_object $new" &&
88
106
git update-ref refs/heads/bogus "$new" &&
107
+ test_when_finished "git update-ref -d refs/heads/bogus" &&
89
108
git fsck 2>out &&
90
109
cat out &&
91
110
grep "error in commit $new" out
92
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 <[email protected] > 1234567890 -0000
101
-
102
- This is an invalid tag.
103
- EOF
104
112
105
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 <[email protected] > 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" &&
108
127
test_must_fail git fsck --tags >out &&
109
128
cat out &&
110
- grep "broken link" out &&
111
- rm .git/refs/tags/invalid
129
+ grep "broken link" out
112
130
'
113
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 <[email protected] > 1234567890 -0000
119
-
120
- This is an invalid tag.
121
- EOF
122
-
123
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 <[email protected] > 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" &&
126
148
test_must_fail git fsck --tags 2>out &&
127
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
130
151
'
131
152
132
-
153
+ test_expect_success ' cleaned up' '
154
+ git fsck >actual 2>&1 &&
155
+ test_cmp empty actual
156
+ '
133
157
134
158
test_done
0 commit comments