3 # Copyright (C) 2005 Rene Scharfe
6 test_description='git tar-tree and git get-tar-commit-id test
8 This test covers the topics of file contents, commit date handling and
11 The contents of the repository is compared to the extracted tar
12 archive. The repository contains simple text files, symlinks and a
13 binary file (/bin/sh). Only paths shorter than 99 characters are
16 git tar-tree applies the commit date to every file in the archive it
17 creates. The test sets the commit date to a specific value and checks
18 if the tar archive contains that value.
20 When giving git tar-tree a commit id (in contrast to a tree id) it
21 embeds this commit id into the tar archive as a comment. The test
22 checks the ability of git get-tar-commit-id to figure it out from the
29 GUNZIP=${GUNZIP:-gzip -d}
33 test_lazy_prereq TAR_NEEDS_PAX_FALLBACK '
37 "$TAR" xf "$TEST_DIRECTORY"/t5000/pax.tar &&
38 test -f PaxHeaders.1791/file
48 if test "$len" = $(echo "$len $rest" | wc -c)
52 echo "${rest#$header}"
63 dir_with_prefix=$dir/$2
65 test_expect_success ' extract tar archive' '
66 (mkdir $dir && cd $dir && "$TAR" xf -) <$tarfile
69 test_expect_success TAR_NEEDS_PAX_FALLBACK ' interpret pax headers' '
72 for header in *.paxheader
74 data=${header%.paxheader}.data &&
75 if test -h $data -o -e $data
77 path=$(get_pax_header $header path) &&
87 test_expect_success ' validate filenames' '
88 (cd ${dir_with_prefix}a && find .) | sort >$listfile &&
89 test_cmp a.lst $listfile
92 test_expect_success ' validate file contents' '
93 diff -r a ${dir_with_prefix}a
100 echo simple textfile >a/a &&
101 ten=0123456789 && hundred=$ten$ten$ten$ten$ten$ten$ten$ten$ten$ten &&
102 echo long filename >a/four$hundred &&
105 printf "A\$Format:%s\$O" "$SUBSTFORMAT" >a/substfile1 &&
106 printf "A not substituted O" >a/substfile2 &&
107 if test_have_prereq SYMLINKS; then
112 (p=long_path_to_a_file && cd a &&
113 for depth in 1 2 3 4 5; do mkdir $p && cd $p; done &&
114 echo text >file_with_long_path) &&
115 (cd a && find .) | sort >a.lst'
117 test_expect_success \
119 'echo ignore me >a/ignored &&
120 echo ignored export-ignore >.git/info/attributes'
122 test_expect_success \
123 'add files to repository' \
124 'find a -type f | xargs git update-index --add &&
125 find a -type l | xargs git update-index --add &&
126 treeid=`git write-tree` &&
127 echo $treeid >treeid &&
128 git update-ref HEAD $(TZ=GMT GIT_COMMITTER_DATE="2005-05-27 22:00:00" \
129 git commit-tree $treeid </dev/null)'
131 test_expect_success 'setup export-subst' '
132 echo "substfile?" export-subst >>.git/info/attributes &&
133 git log --max-count=1 "--pretty=format:A${SUBSTFORMAT}O" HEAD \
137 test_expect_success \
138 'create bare clone' \
139 'git clone --bare . bare.git &&
140 cp .git/info/attributes bare.git/info/attributes'
142 test_expect_success \
143 'remove ignored file' \
146 test_expect_success \
148 'git archive HEAD >b.tar'
152 test_expect_success 'git archive --prefix=prefix/' '
153 git archive --prefix=prefix/ HEAD >with_prefix.tar
156 check_tar with_prefix prefix/
158 test_expect_success 'git-archive --prefix=olde-' '
159 git archive --prefix=olde- HEAD >with_olde-prefix.tar
162 check_tar with_olde-prefix olde-
164 test_expect_success 'git archive on large files' '
165 test_config core.bigfilethreshold 1 &&
166 git archive HEAD >b3.tar &&
167 test_cmp b.tar b3.tar
170 test_expect_success \
171 'git archive in a bare repo' \
172 '(cd bare.git && git archive HEAD) >b3.tar'
174 test_expect_success \
175 'git archive vs. the same in a bare repo' \
176 'test_cmp b.tar b3.tar'
178 test_expect_success 'git archive with --output' \
179 'git archive --output=b4.tar HEAD &&
180 test_cmp b.tar b4.tar'
182 test_expect_success 'git archive --remote' \
183 'git archive --remote=. HEAD >b5.tar &&
184 test_cmp b.tar b5.tar'
186 test_expect_success \
187 'validate file modification time' \
189 "$TAR" xf b.tar -C extract a/a &&
190 test-chmtime -v +0 extract/a/a |cut -f 1 >b.mtime &&
191 echo "1117231200" >expected.mtime &&
192 test_cmp expected.mtime b.mtime'
194 test_expect_success \
195 'git get-tar-commit-id' \
196 'git get-tar-commit-id <b.tar >b.commitid &&
197 test_cmp .git/$(git symbolic-ref HEAD) b.commitid'
199 test_expect_success 'git tar-tree' '
200 git tar-tree HEAD >tar-tree.tar &&
201 test_cmp b.tar tar-tree.tar
204 test_expect_success 'git tar-tree with prefix' '
205 git tar-tree HEAD prefix >tar-tree_with_prefix.tar &&
206 test_cmp with_prefix.tar tar-tree_with_prefix.tar
209 test_expect_success 'git archive with --output, override inferred format' '
210 git archive --format=tar --output=d4.zip HEAD &&
211 test_cmp b.tar d4.zip
214 test_expect_success \
215 'git archive --list outside of a git repo' \
216 'GIT_DIR=some/non-existing/directory git archive --list'
218 test_expect_success 'clients cannot access unreachable commits' '
219 test_commit unreachable &&
220 sha1=`git rev-parse HEAD` &&
221 git reset --hard HEAD^ &&
222 git archive $sha1 >remote.tar &&
223 test_must_fail git archive --remote=. $sha1 >remote.tar
226 test_expect_success 'setup tar filters' '
227 git config tar.tar.foo.command "tr ab ba" &&
228 git config tar.bar.command "tr ab ba" &&
229 git config tar.bar.remote true &&
230 git config tar.invalid baz
233 test_expect_success 'archive --list mentions user filter' '
234 git archive --list >output &&
235 grep "^tar\.foo\$" output &&
239 test_expect_success 'archive --list shows only enabled remote filters' '
240 git archive --list --remote=. >output &&
241 ! grep "^tar\.foo\$" output &&
245 test_expect_success 'invoke tar filter by format' '
246 git archive --format=tar.foo HEAD >config.tar.foo &&
247 tr ab ba <config.tar.foo >config.tar &&
248 test_cmp b.tar config.tar &&
249 git archive --format=bar HEAD >config.bar &&
250 tr ab ba <config.bar >config.tar &&
251 test_cmp b.tar config.tar
254 test_expect_success 'invoke tar filter by extension' '
255 git archive -o config-implicit.tar.foo HEAD &&
256 test_cmp config.tar.foo config-implicit.tar.foo &&
257 git archive -o config-implicit.bar HEAD &&
258 test_cmp config.tar.foo config-implicit.bar
261 test_expect_success 'default output format remains tar' '
262 git archive -o config-implicit.baz HEAD &&
263 test_cmp b.tar config-implicit.baz
266 test_expect_success 'extension matching requires dot' '
267 git archive -o config-implicittar.foo HEAD &&
268 test_cmp b.tar config-implicittar.foo
271 test_expect_success 'only enabled filters are available remotely' '
272 test_must_fail git archive --remote=. --format=tar.foo HEAD \
274 git archive --remote=. --format=bar >remote.bar HEAD &&
275 test_cmp remote.bar config.bar
278 if $GZIP --version >/dev/null 2>&1; then
281 say "Skipping some tar.gz tests because gzip not found"
284 test_expect_success GZIP 'git archive --format=tgz' '
285 git archive --format=tgz HEAD >j.tgz
288 test_expect_success GZIP 'git archive --format=tar.gz' '
289 git archive --format=tar.gz HEAD >j1.tar.gz &&
290 test_cmp j.tgz j1.tar.gz
293 test_expect_success GZIP 'infer tgz from .tgz filename' '
294 git archive --output=j2.tgz HEAD &&
295 test_cmp j.tgz j2.tgz
298 test_expect_success GZIP 'infer tgz from .tar.gz filename' '
299 git archive --output=j3.tar.gz HEAD &&
300 test_cmp j.tgz j3.tar.gz
303 if $GUNZIP --version >/dev/null 2>&1; then
304 test_set_prereq GUNZIP
306 say "Skipping some tar.gz tests because gunzip was not found"
309 test_expect_success GZIP,GUNZIP 'extract tgz file' '
310 $GUNZIP -c <j.tgz >j.tar &&
314 test_expect_success GZIP 'remote tar.gz is allowed by default' '
315 git archive --remote=. --format=tar.gz HEAD >remote.tar.gz &&
316 test_cmp j.tgz remote.tar.gz
319 test_expect_success GZIP 'remote tar.gz can be disabled' '
320 git config tar.tar.gz.remote false &&
321 test_must_fail git archive --remote=. --format=tar.gz HEAD \