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}
37 dir_with_prefix
=$dir/$2
39 test_expect_success
' extract tar archive' '
40 (mkdir $dir && cd $dir && "$TAR" xf -) <$tarfile
43 test_expect_success
' validate filenames' '
44 (cd ${dir_with_prefix}a && find .) | sort >$listfile &&
45 test_cmp a.lst $listfile
48 test_expect_success
' validate file contents' '
49 diff -r a ${dir_with_prefix}a
56 echo simple textfile >a/a &&
59 printf "A\$Format:%s\$O" "$SUBSTFORMAT" >a/substfile1 &&
60 printf "A not substituted O" >a/substfile2 &&
61 if test_have_prereq SYMLINKS; then
66 (p=long_path_to_a_file && cd a &&
67 for depth in 1 2 3 4 5; do mkdir $p && cd $p; done &&
68 echo text >file_with_long_path) &&
69 (cd a && find .) | sort >a.lst'
73 'echo ignore me >a/ignored &&
74 echo ignored export-ignore >.git/info/attributes'
77 'add files to repository' \
78 'find a -type f | xargs git update-index --add &&
79 find a -type l | xargs git update-index --add &&
80 treeid=`git write-tree` &&
81 echo $treeid >treeid &&
82 git update-ref HEAD $(TZ=GMT GIT_COMMITTER_DATE="2005-05-27 22:00:00" \
83 git commit-tree $treeid </dev/null)'
85 test_expect_success
'setup export-subst' '
86 echo "substfile?" export-subst >>.git/info/attributes &&
87 git log --max-count=1 "--pretty=format:A${SUBSTFORMAT}O" HEAD \
93 'git clone --bare . bare.git &&
94 cp .git/info/attributes bare.git/info/attributes'
97 'remove ignored file' \
100 test_expect_success \
102 'git archive HEAD >b.tar'
106 test_expect_success
'git archive --prefix=prefix/' '
107 git archive --prefix=prefix/ HEAD >with_prefix.tar
110 check_tar with_prefix prefix
/
112 test_expect_success
'git-archive --prefix=olde-' '
113 git archive --prefix=olde- HEAD >with_olde-prefix.tar
116 check_tar with_olde-prefix olde-
118 test_expect_success \
120 'git tar-tree HEAD >b2.tar'
122 test_expect_success \
123 'git archive vs. git tar-tree' \
124 'test_cmp b.tar b2.tar'
126 test_expect_success
'git archive on large files' '
127 test_config core.bigfilethreshold 1 &&
128 git archive HEAD >b3.tar &&
129 test_cmp b.tar b3.tar
132 test_expect_success \
133 'git archive in a bare repo' \
134 '(cd bare.git && git archive HEAD) >b3.tar'
136 test_expect_success \
137 'git archive vs. the same in a bare repo' \
138 'test_cmp b.tar b3.tar'
140 test_expect_success
'git archive with --output' \
141 'git archive --output=b4.tar HEAD &&
142 test_cmp b.tar b4.tar'
144 test_expect_success
'git archive --remote' \
145 'git archive --remote=. HEAD >b5.tar &&
146 test_cmp b.tar b5.tar'
148 test_expect_success \
149 'validate file modification time' \
151 "$TAR" xf b.tar -C extract a/a &&
152 test-chmtime -v +0 extract/a/a |cut -f 1 >b.mtime &&
153 echo "1117231200" >expected.mtime &&
154 test_cmp expected.mtime b.mtime'
156 test_expect_success \
157 'git get-tar-commit-id' \
158 'git get-tar-commit-id <b.tar >b.commitid &&
159 test_cmp .git/$(git symbolic-ref HEAD) b.commitid'
161 test_expect_success \
162 'git tar-tree with prefix' \
163 'git tar-tree HEAD prefix >c.tar'
165 test_expect_success \
166 'extract tar archive with prefix' \
167 '(mkdir c && cd c && "$TAR" xf -) <c.tar'
169 test_expect_success \
170 'validate filenames with prefix' \
171 '(cd c/prefix/a && find .) | sort >c.lst &&
172 test_cmp a.lst c.lst'
174 test_expect_success \
175 'validate file contents with prefix' \
176 'diff -r a c/prefix/a'
178 test_expect_success
'git archive with --output, override inferred format' '
179 git archive --format=tar --output=d4.zip HEAD &&
180 test_cmp b.tar d4.zip
183 test_expect_success \
184 'git archive --list outside of a git repo' \
185 'GIT_DIR=some/non-existing/directory git archive --list'
187 test_expect_success
'clients cannot access unreachable commits' '
188 test_commit unreachable &&
189 sha1=`git rev-parse HEAD` &&
190 git reset --hard HEAD^ &&
191 git archive $sha1 >remote.tar &&
192 test_must_fail git archive --remote=. $sha1 >remote.tar
195 test_expect_success
'setup tar filters' '
196 git config tar.tar.foo.command "tr ab ba" &&
197 git config tar.bar.command "tr ab ba" &&
198 git config tar.bar.remote true &&
199 git config tar.invalid baz
202 test_expect_success
'archive --list mentions user filter' '
203 git archive --list >output &&
204 grep "^tar\.foo\$" output &&
208 test_expect_success
'archive --list shows only enabled remote filters' '
209 git archive --list --remote=. >output &&
210 ! grep "^tar\.foo\$" output &&
214 test_expect_success
'invoke tar filter by format' '
215 git archive --format=tar.foo HEAD >config.tar.foo &&
216 tr ab ba <config.tar.foo >config.tar &&
217 test_cmp b.tar config.tar &&
218 git archive --format=bar HEAD >config.bar &&
219 tr ab ba <config.bar >config.tar &&
220 test_cmp b.tar config.tar
223 test_expect_success
'invoke tar filter by extension' '
224 git archive -o config-implicit.tar.foo HEAD &&
225 test_cmp config.tar.foo config-implicit.tar.foo &&
226 git archive -o config-implicit.bar HEAD &&
227 test_cmp config.tar.foo config-implicit.bar
230 test_expect_success
'default output format remains tar' '
231 git archive -o config-implicit.baz HEAD &&
232 test_cmp b.tar config-implicit.baz
235 test_expect_success
'extension matching requires dot' '
236 git archive -o config-implicittar.foo HEAD &&
237 test_cmp b.tar config-implicittar.foo
240 test_expect_success
'only enabled filters are available remotely' '
241 test_must_fail git archive --remote=. --format=tar.foo HEAD \
243 git archive --remote=. --format=bar >remote.bar HEAD &&
244 test_cmp remote.bar config.bar
247 if $GZIP --version >/dev
/null
2>&1; then
250 say
"Skipping some tar.gz tests because gzip not found"
253 test_expect_success GZIP
'git archive --format=tgz' '
254 git archive --format=tgz HEAD >j.tgz
257 test_expect_success GZIP
'git archive --format=tar.gz' '
258 git archive --format=tar.gz HEAD >j1.tar.gz &&
259 test_cmp j.tgz j1.tar.gz
262 test_expect_success GZIP
'infer tgz from .tgz filename' '
263 git archive --output=j2.tgz HEAD &&
264 test_cmp j.tgz j2.tgz
267 test_expect_success GZIP
'infer tgz from .tar.gz filename' '
268 git archive --output=j3.tar.gz HEAD &&
269 test_cmp j.tgz j3.tar.gz
272 if $GUNZIP --version >/dev
/null
2>&1; then
273 test_set_prereq GUNZIP
275 say
"Skipping some tar.gz tests because gunzip was not found"
278 test_expect_success GZIP
,GUNZIP
'extract tgz file' '
279 $GUNZIP -c <j.tgz >j.tar &&
283 test_expect_success GZIP
'remote tar.gz is allowed by default' '
284 git archive --remote=. --format=tar.gz HEAD >remote.tar.gz &&
285 test_cmp j.tgz remote.tar.gz
288 test_expect_success GZIP
'remote tar.gz can be disabled' '
289 git config tar.tar.gz.remote false &&
290 test_must_fail git archive --remote=. --format=tar.gz HEAD \