• R
    t5004: avoid using tar for checking emptiness of archive · ea2d20d4
    René Scharfe 提交于
    Test 2 of t5004 checks if a supposedly empty tar archive really
    contains no files.  24676f02 (t5004: fix issue with empty archive test
    and bsdtar) removed our commit hash to make it work with bsdtar, but
    the test still fails on NetBSD and OpenBSD, which use their own tar
    that considers a tar file containing only NULs as broken.
    
    Here's what the different archivers do when asked to create a tar
    file without entries:
    
    	$ uname -v
    	NetBSD 6.0.1 (GENERIC)
    	$ gtar --version | head -1
    	tar (GNU tar) 1.26
    	$ bsdtar --version
    	bsdtar 2.8.4 - libarchive 2.8.4
    
    	$ : >zero.tar
    	$ perl -e 'print "\0" x 10240' >tenk.tar
    	$ sha1 zero.tar tenk.tar
    	SHA1 (zero.tar) = da39a3ee5e6b4b0d3255bfef95601890afd80709
    	SHA1 (tenk.tar) = 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
    
    	$ : | tar cf - -T - | sha1
    	da39a3ee5e6b4b0d3255bfef95601890afd80709
    	$ : | gtar cf - -T - | sha1
    	34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
    	$ : | bsdtar cf - -T - | sha1
    	34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
    
    So NetBSD's native tar creates an empty file, while GNU tar and bsdtar
    both give us 10KB of NULs -- just like git archive with an empty tree.
    Now let's see how the archivers handle these two kinds of empty tar
    files:
    
    	$ tar tf zero.tar; echo $?
    	tar: Unexpected EOF on archive file
    	1
    	$ gtar tf zero.tar; echo $?
    	gtar: This does not look like a tar archive
    	gtar: Exiting with failure status due to previous errors
    	2
    	$ bsdtar tf zero.tar; echo $?
    	0
    
    	$ tar tf tenk.tar; echo $?
    	tar: Cannot identify format. Searching...
    	tar: End of archive volume 1 reached
    	tar: Sorry, unable to determine archive format.
    	1
    	$ gtar tf tenk.tar; echo $?
    	0
    	$ bsdtar tf tenk.tar; echo $?
    	0
    
    NetBSD's tar complains about both, bsdtar happily accepts any of them
    and GNU tar doesn't like zero-length archive files.  So the safest
    course of action is to stay with our block-of-NULs format which is
    compatible with GNU tar and bsdtar, as we can't make NetBSD's native
    tar happy anyway.
    
    We can simplify our test, however, by taking tar out of the picture.
    Instead of extracting the archive and checking for the non-presence of
    files, check if the file has a size of 10KB and contains only NULs.
    This makes t5004 pass on NetBSD and OpenBSD.
    Signed-off-by: NRene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    ea2d20d4
t5004-archive-corner-cases.sh 2.9 KB