Merge branch 'yk/git-tag-remove-mention-of-old-layout-in-doc' into maint
[gitweb.git] / t / t5000-tar-tree.sh
index 4b68bbafbe9016d66ce4f96f2058ac67640ed147..80b2387341c3a7abb9cc4b126376d7dd755d9e1d 100755 (executable)
@@ -319,4 +319,78 @@ test_expect_success 'catch non-matching pathspec' '
        test_must_fail git archive -v HEAD -- "*.abc" >/dev/null
 '
 
+# Pull the size and date of each entry in a tarfile using the system tar.
+#
+# We'll pull out only the year from the date; that avoids any question of
+# timezones impacting the result (as long as we keep our test times away from a
+# year boundary; our reference times are all in August).
+#
+# The output of tar_info is expected to be "<size> <year>", both in decimal. It
+# ignores the return value of tar. We have to do this, because some of our test
+# input is only partial (the real data is 64GB in some cases).
+tar_info () {
+       "$TAR" tvf "$1" |
+       awk '{
+               split($4, date, "-")
+               print $3 " " date[1]
+       }'
+}
+
+# See if our system tar can handle a tar file with huge sizes and dates far in
+# the future, and that we can actually parse its output.
+#
+# The reference file was generated by GNU tar, and the magic time and size are
+# both octal 01000000000001, which overflows normal ustar fields.
+test_lazy_prereq TAR_HUGE '
+       echo "68719476737 4147" >expect &&
+       tar_info "$TEST_DIRECTORY"/t5000/huge-and-future.tar >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success LONG_IS_64BIT 'set up repository with huge blob' '
+       obj_d=19 &&
+       obj_f=f9c8273ec45a8938e6999cb59b3ff66739902a &&
+       obj=${obj_d}${obj_f} &&
+       mkdir -p .git/objects/$obj_d &&
+       cp "$TEST_DIRECTORY"/t5000/$obj .git/objects/$obj_d/$obj_f &&
+       rm -f .git/index &&
+       git update-index --add --cacheinfo 100644,$obj,huge &&
+       git commit -m huge
+'
+
+# We expect git to die with SIGPIPE here (otherwise we
+# would generate the whole 64GB).
+test_expect_success LONG_IS_64BIT 'generate tar with huge size' '
+       {
+               git archive HEAD
+               echo $? >exit-code
+       } | test_copy_bytes 4096 >huge.tar &&
+       echo 141 >expect &&
+       test_cmp expect exit-code
+'
+
+test_expect_success TAR_HUGE,LONG_IS_64BIT 'system tar can read our huge size' '
+       echo 68719476737 >expect &&
+       tar_info huge.tar | cut -d" " -f1 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success LONG_IS_64BIT 'set up repository with far-future commit' '
+       rm -f .git/index &&
+       echo content >file &&
+       git add file &&
+       GIT_COMMITTER_DATE="@68719476737 +0000" \
+               git commit -m "tempori parendum"
+'
+
+test_expect_success LONG_IS_64BIT 'generate tar with future mtime' '
+       git archive HEAD >future.tar
+'
+
+test_expect_success TAR_HUGE,LONG_IS_64BIT 'system tar can read our future mtime' '
+       echo 4147 >expect &&
+       tar_info future.tar | cut -d" " -f2 >actual &&
+       test_cmp expect actual
+'
+
 test_done