Imported Upstream version 2.23.0
[platform/upstream/git.git] / t / t5004-archive-corner-cases.sh
index cca2338..271eb5a 100755 (executable)
@@ -3,8 +3,12 @@
 test_description='test corner cases of git-archive'
 . ./test-lib.sh
 
-test_expect_success 'create commit with empty tree' '
-       git commit --allow-empty -m foo
+# the 10knuls.tar file is used to test for an empty git generated tar
+# without having to invoke tar because an otherwise valid empty GNU tar
+# will be considered broken by {Open,Net}BSD tar
+test_expect_success 'create commit with empty tree and fake empty tar' '
+       git commit --allow-empty -m foo &&
+       perl -e "print \"\\0\" x 10240" >10knuls.tar
 '
 
 # Make a dir and clean it up afterwards
@@ -27,6 +31,9 @@ check_dir() {
        test_cmp expect actual
 }
 
+test_lazy_prereq UNZIP_ZIP64_SUPPORT '
+       "$GIT_UNZIP" -v | grep ZIP64_SUPPORT
+'
 
 # bsdtar/libarchive versions before 3.1.3 consider a tar file with a
 # global pax header that is not followed by a file record as corrupt.
@@ -44,7 +51,6 @@ test_expect_success HEADER_ONLY_TAR_OK 'tar archive of commit with empty tree' '
 
 test_expect_success 'tar archive of empty tree is empty' '
        git archive --format=tar HEAD: >empty.tar &&
-       perl -e "print \"\\0\" x 10240" >10knuls.tar &&
        test_cmp_bin 10knuls.tar empty.tar
 '
 
@@ -103,16 +109,12 @@ test_expect_success 'create a commit with an empty subtree' '
 
 test_expect_success 'archive empty subtree with no pathspec' '
        git archive --format=tar $root_tree >subtree-all.tar &&
-       make_dir extract &&
-       "$TAR" xf subtree-all.tar -C extract &&
-       check_dir extract sub
+       test_cmp_bin 10knuls.tar subtree-all.tar
 '
 
 test_expect_success 'archive empty subtree by direct pathspec' '
        git archive --format=tar $root_tree -- sub >subtree-path.tar &&
-       make_dir extract &&
-       "$TAR" xf subtree-path.tar -C extract &&
-       check_dir extract sub
+       test_cmp_bin 10knuls.tar subtree-path.tar
 '
 
 ZIPINFO=zipinfo
@@ -155,4 +157,51 @@ test_expect_success ZIPINFO 'zip archive with many entries' '
        test_cmp expect actual
 '
 
+test_expect_success EXPENSIVE,UNZIP,UNZIP_ZIP64_SUPPORT \
+       'zip archive bigger than 4GB' '
+       # build string containing 65536 characters
+       s=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef &&
+       s=$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s &&
+       s=$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s &&
+
+       # create blob with a length of 65536 + 1 bytes
+       blob=$(echo $s | git hash-object -w --stdin) &&
+
+       # create tree containing 65500 entries of that blob
+       for i in $(test_seq 1 65500)
+       do
+               echo "100644 blob $blob $i"
+       done >tree &&
+       tree=$(git mktree <tree) &&
+
+       # zip it, creating an archive a bit bigger than 4GB
+       git archive -0 -o many-big.zip $tree &&
+
+       "$GIT_UNZIP" -t many-big.zip 9999 65500 &&
+       "$GIT_UNZIP" -t many-big.zip
+'
+
+test_expect_success EXPENSIVE,LONG_IS_64BIT,UNZIP,UNZIP_ZIP64_SUPPORT,ZIPINFO \
+       'zip archive with files bigger than 4GB' '
+       # Pack created with:
+       #   dd if=/dev/zero of=file bs=1M count=4100 && git hash-object -w file
+       mkdir -p .git/objects/pack &&
+       (
+               cd .git/objects/pack &&
+               "$GIT_UNZIP" "$TEST_DIRECTORY"/t5004/big-pack.zip
+       ) &&
+       blob=754a93d6fada4c6873360e6cb4b209132271ab0e &&
+       size=$(expr 4100 "*" 1024 "*" 1024) &&
+
+       # create a tree containing the file
+       tree=$(echo "100644 blob $blob  big-file" | git mktree) &&
+
+       # zip it, creating an archive with a file bigger than 4GB
+       git archive -o big.zip $tree &&
+
+       "$GIT_UNZIP" -t big.zip &&
+       "$ZIPINFO" big.zip >big.lst &&
+       grep $size big.lst
+'
+
 test_done