]>
Commit | Line | Data |
---|---|---|
b335d3f1 AR |
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 | ||
a8128ed6 AR |
31 | batch_output="$sha1 $type $size |
32 | $content" | |
33 | ||
b335d3f1 AR |
34 | test_expect_success "$type exists" ' |
35 | git cat-file -e $sha1 | |
36 | ' | |
37 | ||
38 | test_expect_success "Type of $type is correct" ' | |
03c893cb JK |
39 | echo $type >expect && |
40 | git cat-file -t $sha1 >actual && | |
41 | test_cmp expect actual | |
b335d3f1 AR |
42 | ' |
43 | ||
44 | test_expect_success "Size of $type is correct" ' | |
03c893cb JK |
45 | echo $size >expect && |
46 | git cat-file -s $sha1 >actual && | |
47 | test_cmp expect actual | |
b335d3f1 AR |
48 | ' |
49 | ||
50 | test -z "$content" || | |
51 | test_expect_success "Content of $type is correct" ' | |
03c893cb JK |
52 | maybe_remove_timestamp "$content" $no_ts >expect && |
53 | maybe_remove_timestamp "$(git cat-file $type $sha1)" $no_ts >actual && | |
54 | test_cmp expect actual | |
b335d3f1 AR |
55 | ' |
56 | ||
57 | test_expect_success "Pretty content of $type is correct" ' | |
03c893cb JK |
58 | maybe_remove_timestamp "$pretty_content" $no_ts >expect && |
59 | maybe_remove_timestamp "$(git cat-file -p $sha1)" $no_ts >actual && | |
60 | test_cmp expect actual | |
b335d3f1 | 61 | ' |
05d5667f | 62 | |
a8128ed6 AR |
63 | test -z "$content" || |
64 | test_expect_success "--batch output of $type is correct" ' | |
03c893cb JK |
65 | maybe_remove_timestamp "$batch_output" $no_ts >expect && |
66 | maybe_remove_timestamp "$(echo $sha1 | git cat-file --batch)" $no_ts >actual && | |
67 | test_cmp expect actual | |
a8128ed6 AR |
68 | ' |
69 | ||
05d5667f | 70 | test_expect_success "--batch-check output of $type is correct" ' |
03c893cb JK |
71 | echo "$sha1 $type $size" >expect && |
72 | echo_without_newline $sha1 | git cat-file --batch-check >actual && | |
73 | test_cmp expect actual | |
05d5667f | 74 | ' |
93d2a607 JK |
75 | |
76 | test_expect_success "custom --batch-check format" ' | |
77 | echo "$type $sha1" >expect && | |
78 | echo $sha1 | git cat-file --batch-check="%(objecttype) %(objectname)" >actual && | |
79 | test_cmp expect actual | |
80 | ' | |
97be0407 JK |
81 | |
82 | test_expect_success '--batch-check with %(rest)' ' | |
83 | echo "$type this is some extra content" >expect && | |
84 | echo "$sha1 this is some extra content" | | |
85 | git cat-file --batch-check="%(objecttype) %(rest)" >actual && | |
86 | test_cmp expect actual | |
87 | ' | |
b335d3f1 AR |
88 | } |
89 | ||
90 | hello_content="Hello World" | |
91 | hello_size=$(strlen "$hello_content") | |
92 | hello_sha1=$(echo_without_newline "$hello_content" | git hash-object --stdin) | |
93 | ||
94 | test_expect_success "setup" ' | |
95 | echo_without_newline "$hello_content" > hello && | |
96 | git update-index --add hello | |
97 | ' | |
98 | ||
99 | run_tests 'blob' $hello_sha1 $hello_size "$hello_content" "$hello_content" | |
100 | ||
97be0407 JK |
101 | test_expect_success '--batch-check without %(rest) considers whole line' ' |
102 | echo "$hello_sha1 blob $hello_size" >expect && | |
103 | git update-index --add --cacheinfo 100644 $hello_sha1 "white space" && | |
104 | test_when_finished "git update-index --remove \"white space\"" && | |
105 | echo ":white space" | git cat-file --batch-check >actual && | |
106 | test_cmp expect actual | |
107 | ' | |
108 | ||
b335d3f1 AR |
109 | tree_sha1=$(git write-tree) |
110 | tree_size=33 | |
111 | tree_pretty_content="100644 blob $hello_sha1 hello" | |
112 | ||
113 | run_tests 'tree' $tree_sha1 $tree_size "" "$tree_pretty_content" | |
114 | ||
41ccfdd9 | 115 | commit_message="Initial commit" |
b335d3f1 | 116 | commit_sha1=$(echo_without_newline "$commit_message" | git commit-tree $tree_sha1) |
41ccfdd9 | 117 | commit_size=177 |
b335d3f1 AR |
118 | commit_content="tree $tree_sha1 |
119 | author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> 0000000000 +0000 | |
120 | committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 0000000000 +0000 | |
121 | ||
122 | $commit_message" | |
123 | ||
124 | run_tests 'commit' $commit_sha1 $commit_size "$commit_content" "$commit_content" 1 | |
125 | ||
126 | tag_header_without_timestamp="object $hello_sha1 | |
127 | type blob | |
128 | tag hellotag | |
129 | tagger $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" | |
130 | tag_description="This is a tag" | |
131 | tag_content="$tag_header_without_timestamp 0000000000 +0000 | |
132 | ||
b335d3f1 AR |
133 | $tag_description" |
134 | ||
135 | tag_sha1=$(echo_without_newline "$tag_content" | git mktag) | |
136 | tag_size=$(strlen "$tag_content") | |
137 | ||
9cfa5126 | 138 | run_tests 'tag' $tag_sha1 $tag_size "$tag_content" "$tag_content" 1 |
b335d3f1 AR |
139 | |
140 | test_expect_success \ | |
141 | "Reach a blob from a tag pointing to it" \ | |
142 | "test '$hello_content' = \"\$(git cat-file blob $tag_sha1)\"" | |
143 | ||
a8128ed6 | 144 | for batch in batch batch-check |
05d5667f | 145 | do |
a8128ed6 AR |
146 | for opt in t s e p |
147 | do | |
148 | test_expect_success "Passing -$opt with --$batch fails" ' | |
149 | test_must_fail git cat-file --$batch -$opt $hello_sha1 | |
150 | ' | |
151 | ||
152 | test_expect_success "Passing --$batch with -$opt fails" ' | |
153 | test_must_fail git cat-file -$opt --$batch $hello_sha1 | |
154 | ' | |
155 | done | |
156 | ||
157 | test_expect_success "Passing <type> with --$batch fails" ' | |
158 | test_must_fail git cat-file --$batch blob $hello_sha1 | |
05d5667f AR |
159 | ' |
160 | ||
a8128ed6 AR |
161 | test_expect_success "Passing --$batch with <type> fails" ' |
162 | test_must_fail git cat-file blob --$batch $hello_sha1 | |
05d5667f | 163 | ' |
05d5667f | 164 | |
a8128ed6 AR |
165 | test_expect_success "Passing sha1 with --$batch fails" ' |
166 | test_must_fail git cat-file --$batch $hello_sha1 | |
167 | ' | |
168 | done | |
05d5667f | 169 | |
3c076dbe LW |
170 | test_expect_success "--batch-check for a non-existent named object" ' |
171 | test "foobar42 missing | |
172 | foobar84 missing" = \ | |
173 | "$( ( echo foobar42; echo_without_newline foobar84; ) | git cat-file --batch-check)" | |
174 | ' | |
175 | ||
176 | test_expect_success "--batch-check for a non-existent hash" ' | |
177 | test "0000000000000000000000000000000000000042 missing | |
178 | 0000000000000000000000000000000000000084 missing" = \ | |
179 | "$( ( echo 0000000000000000000000000000000000000042; | |
180 | echo_without_newline 0000000000000000000000000000000000000084; ) \ | |
181 | | git cat-file --batch-check)" | |
182 | ' | |
183 | ||
184 | test_expect_success "--batch for an existent and a non-existent hash" ' | |
185 | test "$tag_sha1 tag $tag_size | |
186 | $tag_content | |
187 | 0000000000000000000000000000000000000000 missing" = \ | |
188 | "$( ( echo $tag_sha1; | |
189 | echo_without_newline 0000000000000000000000000000000000000000; ) \ | |
190 | | git cat-file --batch)" | |
05d5667f AR |
191 | ' |
192 | ||
193 | test_expect_success "--batch-check for an emtpy line" ' | |
194 | test " missing" = "$(echo | git cat-file --batch-check)" | |
195 | ' | |
196 | ||
a8128ed6 AR |
197 | batch_input="$hello_sha1 |
198 | $commit_sha1 | |
199 | $tag_sha1 | |
200 | deadbeef | |
201 | ||
202 | " | |
203 | ||
204 | batch_output="$hello_sha1 blob $hello_size | |
205 | $hello_content | |
206 | $commit_sha1 commit $commit_size | |
207 | $commit_content | |
208 | $tag_sha1 tag $tag_size | |
209 | $tag_content | |
210 | deadbeef missing | |
211 | missing" | |
212 | ||
6c41e21d MB |
213 | test_expect_success '--batch with multiple sha1s gives correct format' ' |
214 | test "$(maybe_remove_timestamp "$batch_output" 1)" = "$(maybe_remove_timestamp "$(echo_without_newline "$batch_input" | git cat-file --batch)" 1)" | |
215 | ' | |
a8128ed6 | 216 | |
05d5667f AR |
217 | batch_check_input="$hello_sha1 |
218 | $tree_sha1 | |
219 | $commit_sha1 | |
220 | $tag_sha1 | |
221 | deadbeef | |
222 | ||
223 | " | |
224 | ||
225 | batch_check_output="$hello_sha1 blob $hello_size | |
226 | $tree_sha1 tree $tree_size | |
227 | $commit_sha1 commit $commit_size | |
228 | $tag_sha1 tag $tag_size | |
229 | deadbeef missing | |
230 | missing" | |
231 | ||
232 | test_expect_success "--batch-check with multiple sha1s gives correct format" ' | |
233 | test "$batch_check_output" = \ | |
234 | "$(echo_without_newline "$batch_check_input" | git cat-file --batch-check)" | |
235 | ' | |
236 | ||
b335d3f1 | 237 | test_done |