Merge branch 'mm/push-force-is-dangerous'
[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="Initial commit"
120 commit_sha1=$(echo_without_newline "$commit_message" | git commit-tree $tree_sha1)
121 commit_size=177
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
139 tag_sha1=$(echo_without_newline "$tag_content" | git mktag)
140 tag_size=$(strlen "$tag_content")
141
142 run_tests 'tag' $tag_sha1 $tag_size "$tag_content" "$tag_content" 1
143
144 test_expect_success \
145     "Reach a blob from a tag pointing to it" \
146     "test '$hello_content' = \"\$(git cat-file blob $tag_sha1)\""
147
148 for batch in batch batch-check
149 do
150     for opt in t s e p
151     do
152         test_expect_success "Passing -$opt with --$batch fails" '
153             test_must_fail git cat-file --$batch -$opt $hello_sha1
154         '
155
156         test_expect_success "Passing --$batch with -$opt fails" '
157             test_must_fail git cat-file -$opt --$batch $hello_sha1
158         '
159     done
160
161     test_expect_success "Passing <type> with --$batch fails" '
162         test_must_fail git cat-file --$batch blob $hello_sha1
163     '
164
165     test_expect_success "Passing --$batch with <type> fails" '
166         test_must_fail git cat-file blob --$batch $hello_sha1
167     '
168
169     test_expect_success "Passing sha1 with --$batch fails" '
170         test_must_fail git cat-file --$batch $hello_sha1
171     '
172 done
173
174 test_expect_success "--batch-check for a non-existent named object" '
175     test "foobar42 missing
176 foobar84 missing" = \
177     "$( ( echo foobar42; echo_without_newline foobar84; ) | git cat-file --batch-check)"
178 '
179
180 test_expect_success "--batch-check for a non-existent hash" '
181     test "0000000000000000000000000000000000000042 missing
182 0000000000000000000000000000000000000084 missing" = \
183     "$( ( echo 0000000000000000000000000000000000000042;
184          echo_without_newline 0000000000000000000000000000000000000084; ) \
185        | git cat-file --batch-check)"
186 '
187
188 test_expect_success "--batch for an existent and a non-existent hash" '
189     test "$tag_sha1 tag $tag_size
190 $tag_content
191 0000000000000000000000000000000000000000 missing" = \
192     "$( ( echo $tag_sha1;
193          echo_without_newline 0000000000000000000000000000000000000000; ) \
194        | git cat-file --batch)"
195 '
196
197 test_expect_success "--batch-check for an emtpy line" '
198     test " missing" = "$(echo | git cat-file --batch-check)"
199 '
200
201 batch_input="$hello_sha1
202 $commit_sha1
203 $tag_sha1
204 deadbeef
205
206 "
207
208 batch_output="$hello_sha1 blob $hello_size
209 $hello_content
210 $commit_sha1 commit $commit_size
211 $commit_content
212 $tag_sha1 tag $tag_size
213 $tag_content
214 deadbeef missing
215  missing"
216
217 test_expect_success '--batch with multiple sha1s gives correct format' '
218         test "$(maybe_remove_timestamp "$batch_output" 1)" = "$(maybe_remove_timestamp "$(echo_without_newline "$batch_input" | git cat-file --batch)" 1)"
219 '
220
221 batch_check_input="$hello_sha1
222 $tree_sha1
223 $commit_sha1
224 $tag_sha1
225 deadbeef
226
227 "
228
229 batch_check_output="$hello_sha1 blob $hello_size
230 $tree_sha1 tree $tree_size
231 $commit_sha1 commit $commit_size
232 $tag_sha1 tag $tag_size
233 deadbeef missing
234  missing"
235
236 test_expect_success "--batch-check with multiple sha1s gives correct format" '
237     test "$batch_check_output" = \
238     "$(echo_without_newline "$batch_check_input" | git cat-file --batch-check)"
239 '
240
241 test_done