Skip to content

Commit

Permalink
t5000: test long filenames
Browse files Browse the repository at this point in the history
Add a file with a long name to the test archive in order to check
entries with pax extended headers.  Also add a check for tar versions
that doen't understand this format.  Those versions should extract the
headers as a regular files.  Add code to check_tar() to interpret the
path header if present, so that our tests work even with those tar
versions.

It's important to use the fallback code only if needed to still be
able to detect git archive errorously creating pax headers as regular
file entries (with a suitable tar version, of course).

The archive used to check for pax header support in tar was generated
using GNU tar 1.26 and its option --format=pax.

Tested successfully on NetBSD 6.1, which has a tar version lacking pax
header support.

Signed-off-by: René Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and Junio C Hamano committed May 20, 2013
1 parent 0a00ee5 commit 9bf1ac4
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
46 changes: 46 additions & 0 deletions t/t5000-tar-tree.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,32 @@ GUNZIP=${GUNZIP:-gzip -d}

SUBSTFORMAT=%H%n

test_lazy_prereq TAR_NEEDS_PAX_FALLBACK '
(
mkdir pax &&
cd pax &&
"$TAR" xf "$TEST_DIRECTORY"/t5000/pax.tar &&
test -f PaxHeaders.1791/file
)
'

get_pax_header() {
file=$1
header=$2=

while read len rest
do
if test "$len" = $(echo "$len $rest" | wc -c)
then
case "$rest" in
$header*)
echo "${rest#$header}"
;;
esac
fi
done <"$file"
}

check_tar() {
tarfile=$1.tar
listfile=$1.lst
Expand All @@ -40,6 +66,24 @@ check_tar() {
(mkdir $dir && cd $dir && "$TAR" xf -) <$tarfile
'

test_expect_success TAR_NEEDS_PAX_FALLBACK ' interpret pax headers' '
(
cd $dir &&
for header in *.paxheader
do
data=${header%.paxheader}.data &&
if test -h $data -o -e $data
then
path=$(get_pax_header $header path) &&
if test -n "$path"
then
mv "$data" "$path"
fi
fi
done
)
'

test_expect_success ' validate filenames' '
(cd ${dir_with_prefix}a && find .) | sort >$listfile &&
test_cmp a.lst $listfile
Expand All @@ -54,6 +98,8 @@ test_expect_success \
'populate workdir' \
'mkdir a &&
echo simple textfile >a/a &&
ten=0123456789 && hundred=$ten$ten$ten$ten$ten$ten$ten$ten$ten$ten &&
echo long filename >a/four$hundred &&
mkdir a/bin &&
cp /bin/sh a/bin &&
printf "A\$Format:%s\$O" "$SUBSTFORMAT" >a/substfile1 &&
Expand Down
Binary file added t/t5000/pax.tar
Binary file not shown.

0 comments on commit 9bf1ac4

Please sign in to comment.