1. 10 5月, 2013 2 次提交
    • 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
    • R
      t5004: ignore pax global header file · abdb9b2e
      René Scharfe 提交于
      Versions of tar that don't know pax headers -- like the ones in NetBSD 6
      and OpenBSD 5.2 -- extract them as regular files.  Explicitly ignore the
      file created for our global header when checking the list of extracted
      files, as this is normal and harmless fall-back behaviour.  This fixes
      test 3 of t5004 on these platforms.
      Signed-off-by: NRene Scharfe <rene.scharfe@lsrfire.ath.cx>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      abdb9b2e
  2. 11 4月, 2013 1 次提交
  3. 11 3月, 2013 1 次提交
    • J
      archive: handle commits with an empty tree · bd54cf17
      Jeff King 提交于
      git-archive relies on get_pathspec to convert its argv into
      a list of pathspecs. When get_pathspec is given an empty
      argv list, it returns a single pathspec, the empty string,
      to indicate that everything matches. When we feed this to
      our path_exists function, we typically see that the pathspec
      turns up at least one item in the tree, and we are happy.
      
      But when our tree is empty, we erroneously think it is
      because the pathspec is too limited, when in fact it is
      simply that there is nothing to be found in the tree. This
      is a weird corner case, but the correct behavior is almost
      certainly to produce an empty archive, not to exit with an
      error.
      
      This patch teaches git-archive to create empty archives when
      there is no pathspec given (we continue to complain if a
      pathspec is given, since it obviously is not matched). It
      also confirms that the tar and zip writers produce sane
      output in this instance.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      bd54cf17