fix hang in git fetch if pointed at a 0 length bundle
[git] / t / t1006-cat-file.sh
1 #!/bin/sh
2
3 test_description='git cat-file'
4
5 . ./test-lib.sh
6
7 echo_without_newline () {
8     printf '%s' "$*"
9 }
10
11 strlen () {
12     echo_without_newline "$1" | wc -c | sed -e 's/^ *//'
13 }
14
15 maybe_remove_timestamp () {
16     if test -z "$2"; then
17         echo_without_newline "$1"
18     else
19         echo_without_newline "$(printf '%s\n' "$1" | sed -e 's/ [0-9][0-9]* [-+][0-9][0-9][0-9][0-9]$//')"
20     fi
21 }
22
23 run_tests () {
24     type=$1
25     sha1=$2
26     size=$3
27     content=$4
28     pretty_content=$5
29     no_ts=$6
30
31     batch_output="$sha1 $type $size
32 $content"
33
34     test_expect_success "$type exists" '
35         git cat-file -e $sha1
36     '
37
38     test_expect_success "Type of $type is correct" '
39         test $type = "$(git cat-file -t $sha1)"
40     '
41
42     test_expect_success "Size of $type is correct" '
43         test $size = "$(git cat-file -s $sha1)"
44     '
45
46     test -z "$content" ||
47     test_expect_success "Content of $type is correct" '
48         expect="$(maybe_remove_timestamp "$content" $no_ts)"
49         actual="$(maybe_remove_timestamp "$(git cat-file $type $sha1)" $no_ts)"
50
51         if test "z$expect" = "z$actual"
52         then
53                 : happy
54         else
55                 echo "Oops: expected $expect"
56                 echo "but got $actual"
57                 false
58         fi
59     '
60
61     test_expect_success "Pretty content of $type is correct" '
62         expect="$(maybe_remove_timestamp "$pretty_content" $no_ts)"
63         actual="$(maybe_remove_timestamp "$(git cat-file -p $sha1)" $no_ts)"
64         if test "z$expect" = "z$actual"
65         then
66                 : happy
67         else
68                 echo "Oops: expected $expect"
69                 echo "but got $actual"
70                 false
71         fi
72     '
73
74     test -z "$content" ||
75     test_expect_success "--batch output of $type is correct" '
76         expect="$(maybe_remove_timestamp "$batch_output" $no_ts)"
77         actual="$(maybe_remove_timestamp "$(echo $sha1 | git cat-file --batch)" $no_ts)"
78         if test "z$expect" = "z$actual"
79         then
80                 : happy
81         else
82                 echo "Oops: expected $expect"
83                 echo "but got $actual"
84                 false
85         fi
86     '
87
88     test_expect_success "--batch-check output of $type is correct" '
89         expect="$sha1 $type $size"
90         actual="$(echo_without_newline $sha1 | git cat-file --batch-check)"
91         if test "z$expect" = "z$actual"
92         then
93                 : happy
94         else
95                 echo "Oops: expected $expect"
96                 echo "but got $actual"
97                 false
98         fi
99     '
100 }
101
102 hello_content="Hello World"
103 hello_size=$(strlen "$hello_content")
104 hello_sha1=$(echo_without_newline "$hello_content" | git hash-object --stdin)
105
106 test_expect_success "setup" '
107         echo_without_newline "$hello_content" > hello &&
108         git update-index --add hello
109 '
110
111 run_tests 'blob' $hello_sha1 $hello_size "$hello_content" "$hello_content"
112
113 tree_sha1=$(git write-tree)
114 tree_size=33
115 tree_pretty_content="100644 blob $hello_sha1    hello"
116
117 run_tests 'tree' $tree_sha1 $tree_size "" "$tree_pretty_content"
118
119 commit_message="Intial commit"
120 commit_sha1=$(echo_without_newline "$commit_message" | git commit-tree $tree_sha1)
121 commit_size=176
122 commit_content="tree $tree_sha1
123 author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> 0000000000 +0000
124 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 0000000000 +0000
125
126 $commit_message"
127
128 run_tests 'commit' $commit_sha1 $commit_size "$commit_content" "$commit_content" 1
129
130 tag_header_without_timestamp="object $hello_sha1
131 type blob
132 tag hellotag
133 tagger $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
134 tag_description="This is a tag"
135 tag_content="$tag_header_without_timestamp 0000000000 +0000
136
137 $tag_description"
138 tag_pretty_content="$tag_header_without_timestamp Thu Jan 1 00:00:00 1970 +0000
139
140 $tag_description"
141
142 tag_sha1=$(echo_without_newline "$tag_content" | git mktag)
143 tag_size=$(strlen "$tag_content")
144
145 run_tests 'tag' $tag_sha1 $tag_size "$tag_content" "$tag_pretty_content" 1
146
147 test_expect_success \
148     "Reach a blob from a tag pointing to it" \
149     "test '$hello_content' = \"\$(git cat-file blob $tag_sha1)\""
150
151 for batch in batch batch-check
152 do
153     for opt in t s e p
154     do
155         test_expect_success "Passing -$opt with --$batch fails" '
156             test_must_fail git cat-file --$batch -$opt $hello_sha1
157         '
158
159         test_expect_success "Passing --$batch with -$opt fails" '
160             test_must_fail git cat-file -$opt --$batch $hello_sha1
161         '
162     done
163
164     test_expect_success "Passing <type> with --$batch fails" '
165         test_must_fail git cat-file --$batch blob $hello_sha1
166     '
167
168     test_expect_success "Passing --$batch with <type> fails" '
169         test_must_fail git cat-file blob --$batch $hello_sha1
170     '
171
172     test_expect_success "Passing sha1 with --$batch fails" '
173         test_must_fail git cat-file --$batch $hello_sha1
174     '
175 done
176
177 test_expect_success "--batch-check for a non-existent named object" '
178     test "foobar42 missing
179 foobar84 missing" = \
180     "$( ( echo foobar42; echo_without_newline foobar84; ) | git cat-file --batch-check)"
181 '
182
183 test_expect_success "--batch-check for a non-existent hash" '
184     test "0000000000000000000000000000000000000042 missing
185 0000000000000000000000000000000000000084 missing" = \
186     "$( ( echo 0000000000000000000000000000000000000042;
187          echo_without_newline 0000000000000000000000000000000000000084; ) \
188        | git cat-file --batch-check)"
189 '
190
191 test_expect_success "--batch for an existent and a non-existent hash" '
192     test "$tag_sha1 tag $tag_size
193 $tag_content
194 0000000000000000000000000000000000000000 missing" = \
195     "$( ( echo $tag_sha1;
196          echo_without_newline 0000000000000000000000000000000000000000; ) \
197        | git cat-file --batch)"
198 '
199
200 test_expect_success "--batch-check for an emtpy line" '
201     test " missing" = "$(echo | git cat-file --batch-check)"
202 '
203
204 batch_input="$hello_sha1
205 $commit_sha1
206 $tag_sha1
207 deadbeef
208
209 "
210
211 batch_output="$hello_sha1 blob $hello_size
212 $hello_content
213 $commit_sha1 commit $commit_size
214 $commit_content
215 $tag_sha1 tag $tag_size
216 $tag_content
217 deadbeef missing
218  missing"
219
220 test_expect_success '--batch with multiple sha1s gives correct format' '
221         test "$(maybe_remove_timestamp "$batch_output" 1)" = "$(maybe_remove_timestamp "$(echo_without_newline "$batch_input" | git cat-file --batch)" 1)"
222 '
223
224 batch_check_input="$hello_sha1
225 $tree_sha1
226 $commit_sha1
227 $tag_sha1
228 deadbeef
229
230 "
231
232 batch_check_output="$hello_sha1 blob $hello_size
233 $tree_sha1 tree $tree_size
234 $commit_sha1 commit $commit_size
235 $tag_sha1 tag $tag_size
236 deadbeef missing
237  missing"
238
239 test_expect_success "--batch-check with multiple sha1s gives correct format" '
240     test "$batch_check_output" = \
241     "$(echo_without_newline "$batch_check_input" | git cat-file --batch-check)"
242 '
243
244 test_done