Imported Upstream version 2.23.0
[platform/upstream/git.git] / t / t5004-archive-corner-cases.sh
index 654adda..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,99 @@ 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
+
+test_lazy_prereq ZIPINFO '
+       n=$("$ZIPINFO" "$TEST_DIRECTORY"/t5004/empty.zip | sed -n "2s/.* //p")
+       test "x$n" = "x0"
+'
+
+test_expect_success ZIPINFO 'zip archive with many entries' '
+       # add a directory with 256 files
+       mkdir 00 &&
+       for a in 0 1 2 3 4 5 6 7 8 9 a b c d e f
+       do
+               for b in 0 1 2 3 4 5 6 7 8 9 a b c d e f
+               do
+                       : >00/$a$b
+               done
+       done &&
+       git add 00 &&
+       git commit -m "256 files in 1 directory" &&
+
+       # duplicate it to get 65536 files in 256 directories
+       subtree=$(git write-tree --prefix=00/) &&
+       for c in 0 1 2 3 4 5 6 7 8 9 a b c d e f
+       do
+               for d in 0 1 2 3 4 5 6 7 8 9 a b c d e f
+               do
+                       echo "040000 tree $subtree      $c$d"
+               done
+       done >tree &&
+       tree=$(git mktree <tree) &&
+
+       # zip them
+       git archive -o many.zip $tree &&
+
+       # check the number of entries in the ZIP file directory
+       expr 65536 + 256 >expect &&
+       "$ZIPINFO" many.zip | head -2 | sed -n "2s/.* //p" >actual &&
+       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