If our test suite is instrumented to run the first "test_cmp_bin" in "test_done" it'll mostly pass, but fail on a few tests, such as "t5319-multi-pack-index.sh". Those tests reveal edge cases where the output of "gzip -cn" is different than that of "git archive gzip" for the same input. Let's extract a minimal version of the part of "t5319-multi-pack-index.sh" which triggers it, and add a test for archival stability. Whatever we ultimately decide to promise when it comes to this stability (see [1]) it'll be better to go into any behavior difference knowing that's what we're about to do, rather than discover widespread breakage due to already released Git versions. The "GZIP_TRIVIALLY_STABLE" code here is added because on OSX even a trivial *.tgz generated by the two methods will be different. 1. https://lore.kernel.org/git/a812a664-67ea-c0ba-599f-cb79e2d96694@xxxxxxxxx/ Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> --- t/t5005-archive-stability.sh | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 t/t5005-archive-stability.sh diff --git a/t/t5005-archive-stability.sh b/t/t5005-archive-stability.sh new file mode 100755 index 00000000000..c7532886920 --- /dev/null +++ b/t/t5005-archive-stability.sh @@ -0,0 +1,70 @@ +#!/bin/sh + +test_description='git archive stabilty' + +TEST_PASSES_SANITIZE_LEAK=true +. ./test-lib.sh + +create_archive_file_with_config () { + local file="$1" && + local config="$2" && + shift 2 && + + test_when_finished "rm -rf \"$file\"" && + git -c tar.tgz.command="$config" archive -o "$file" HEAD +} + +setup_gzip_vs_git_archive_gzip () { + create_archive_file_with_config "expect.tgz" "gzip -cn" && + create_archive_file_with_config "actual.tgz" "git archive gzip" +} + +test_lazy_prereq GZIP_TRIVIALLY_STABLE ' + git clone "$TRASH_DIRECTORY" . && + test_commit P && + setup_gzip_vs_git_archive_gzip && + test_cmp_bin expect.tgz actual.tgz +' + +if ! test_have_prereq GZIP_TRIVIALLY_STABLE +then + skip_all='skipping gzip v.s. git archive gzip tests, even trivial content differs' + test_done +fi + +# The first test_expect_success is after the "skip_all" so we'll get +# the skip summary in prove(1) output. +test_expect_success 'setup' ' + test_commit A +' + +test_expect_success GZIP '"gzip -cn" and v.s. "git archive gzip" produce the same output still' ' + setup_gzip_vs_git_archive_gzip && + test_cmp_bin expect.tgz actual.tgz +' + +generate_objects () { + i=$1 + iii=$(printf '%03i' $i) + { + echo $iii && + test-tool genrandom "$iii" 8192 + } >file_$iii && + git update-index --add file_$iii +} + +test_expect_success 'create objects with (stable) random data' ' + test_commit initial && + for i in $(test_seq 1 5) + do + generate_objects $i || return 1 + done && + git commit -m"add objects" +' + +test_expect_success GZIP '"gzip -cn" and v.s. "git archive gzip" have differing output' ' + setup_gzip_vs_git_archive_gzip && + ! test_cmp_bin expect.tgz actual.tgz +' + +test_done -- 2.39.1.1392.g63e6d408230