t5000: test long filenames
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>
Mon, 20 May 2013 09:58:29 +0000 (11:58 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 20 May 2013 22:31:46 +0000 (15:31 -0700)
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>
t/t5000-tar-tree.sh
t/t5000/pax.tar [new file with mode: 0644]
index a1f35d207f2f2cb2d329282e3cc6810c3dd1cc16..c2023b1a3d78a7f100207a76678957d2659f8a8d 100755 (executable)
@@ -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
@@ -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
@@ -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 &&
diff --git a/t/t5000/pax.tar b/t/t5000/pax.tar
new file mode 100644 (file)
index 0000000..d911737
Binary files /dev/null and b/t/t5000/pax.tar differ