t / t5004-archive-corner-cases.shon commit index-pack: work around thread-unsafe pread() (3953949)
   1#!/bin/sh
   2
   3test_description='test corner cases of git-archive'
   4. ./test-lib.sh
   5
   6test_expect_success 'create commit with empty tree' '
   7        git commit --allow-empty -m foo
   8'
   9
  10# Make a dir and clean it up afterwards
  11make_dir() {
  12        mkdir "$1" &&
  13        test_when_finished "rm -rf '$1'"
  14}
  15
  16# Check that the dir given in "$1" contains exactly the
  17# set of paths given as arguments.
  18check_dir() {
  19        dir=$1; shift
  20        {
  21                echo "$dir" &&
  22                for i in "$@"; do
  23                        echo "$dir/$i"
  24                done
  25        } | sort >expect &&
  26        find "$dir" ! -name pax_global_header -print | sort >actual &&
  27        test_cmp expect actual
  28}
  29
  30
  31# bsdtar/libarchive versions before 3.1.3 consider a tar file with a
  32# global pax header that is not followed by a file record as corrupt.
  33if "$TAR" tf "$TEST_DIRECTORY"/t5004/empty-with-pax-header.tar >/dev/null 2>&1
  34then
  35        test_set_prereq HEADER_ONLY_TAR_OK
  36fi
  37
  38test_expect_success HEADER_ONLY_TAR_OK 'tar archive of commit with empty tree' '
  39        git archive --format=tar HEAD >empty-with-pax-header.tar &&
  40        make_dir extract &&
  41        "$TAR" xf empty-with-pax-header.tar -C extract &&
  42        check_dir extract
  43'
  44
  45test_expect_success 'tar archive of empty tree is empty' '
  46        git archive --format=tar HEAD: >empty.tar &&
  47        perl -e "print \"\\0\" x 10240" >10knuls.tar &&
  48        test_cmp 10knuls.tar empty.tar
  49'
  50
  51test_expect_success 'tar archive of empty tree with prefix' '
  52        git archive --format=tar --prefix=foo/ HEAD >prefix.tar &&
  53        make_dir extract &&
  54        "$TAR" xf prefix.tar -C extract &&
  55        check_dir extract foo
  56'
  57
  58test_expect_success UNZIP 'zip archive of empty tree is empty' '
  59        # Detect the exit code produced when our particular flavor of unzip
  60        # sees an empty archive. Infozip will generate a warning and exit with
  61        # code 1. But in the name of sanity, we do not expect other unzip
  62        # implementations to do the same thing (it would be perfectly
  63        # reasonable to exit 0, for example).
  64        #
  65        # This makes our test less rigorous on some platforms (unzip may not
  66        # handle the empty repo at all, making our later check of its exit code
  67        # a no-op). But we cannot do anything reasonable except skip the test
  68        # on such platforms anyway, and this is the moral equivalent.
  69        "$GIT_UNZIP" "$TEST_DIRECTORY"/t5004/empty.zip
  70        expect_code=$?
  71
  72        git archive --format=zip HEAD >empty.zip &&
  73        make_dir extract &&
  74        (
  75                cd extract &&
  76                test_expect_code $expect_code "$GIT_UNZIP" ../empty.zip
  77        ) &&
  78        check_dir extract
  79'
  80
  81test_expect_success UNZIP 'zip archive of empty tree with prefix' '
  82        # We do not have to play exit-code tricks here, because our
  83        # result should not be empty; it has a directory in it.
  84        git archive --format=zip --prefix=foo/ HEAD >prefix.zip &&
  85        make_dir extract &&
  86        (
  87                cd extract &&
  88                "$GIT_UNZIP" ../prefix.zip
  89        ) &&
  90        check_dir extract foo
  91'
  92
  93test_expect_success 'archive complains about pathspec on empty tree' '
  94        test_must_fail git archive --format=tar HEAD -- foo >/dev/null
  95'
  96
  97test_expect_success 'create a commit with an empty subtree' '
  98        empty_tree=$(git hash-object -t tree /dev/null) &&
  99        root_tree=$(printf "040000 tree $empty_tree\tsub\n" | git mktree)
 100'
 101
 102test_expect_success 'archive empty subtree with no pathspec' '
 103        git archive --format=tar $root_tree >subtree-all.tar &&
 104        make_dir extract &&
 105        "$TAR" xf subtree-all.tar -C extract &&
 106        check_dir extract sub
 107'
 108
 109test_expect_success 'archive empty subtree by direct pathspec' '
 110        git archive --format=tar $root_tree -- sub >subtree-path.tar &&
 111        make_dir extract &&
 112        "$TAR" xf subtree-path.tar -C extract &&
 113        check_dir extract sub
 114'
 115
 116test_done