new file mode 100755
@@ -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
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@gmail.com/ Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> --- t/t5005-archive-stability.sh | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 t/t5005-archive-stability.sh