1#!/bin/sh
   2test_description='git archive attribute tests'
   4. ./test-lib.sh
   6SUBSTFORMAT='%H (%h)%n'
   8test_expect_exists() {
  10        test_expect_${2:-success} " $1 exists" "test -e $1"
  11}
  12test_expect_missing() {
  14        test_expect_${2:-success} " $1 does not exist" "test ! -e $1"
  15}
  16extract_tar_to_dir () {
  18        (mkdir "$1" && cd "$1" && "$TAR" xf -) <"$1.tar"
  19}
  20test_expect_success 'setup' '
  22        echo ignored >ignored &&
  23        echo ignored export-ignore >>.git/info/attributes &&
  24        git add ignored &&
  25        echo ignored by tree >ignored-by-tree &&
  27        echo ignored-by-tree export-ignore >.gitattributes &&
  28        mkdir ignored-by-tree.d &&
  29        >ignored-by-tree.d/file &&
  30        echo ignored-by-tree.d export-ignore >>.gitattributes &&
  31        git add ignored-by-tree ignored-by-tree.d .gitattributes &&
  32        echo ignored by worktree >ignored-by-worktree &&
  34        echo ignored-by-worktree export-ignore >.gitattributes &&
  35        git add ignored-by-worktree &&
  36        mkdir excluded-by-pathspec.d &&
  38        >excluded-by-pathspec.d/file &&
  39        git add excluded-by-pathspec.d &&
  40        printf "A\$Format:%s\$O" "$SUBSTFORMAT" >nosubstfile &&
  42        printf "A\$Format:%s\$O" "$SUBSTFORMAT" >substfile1 &&
  43        printf "A not substituted O" >substfile2 &&
  44        echo "substfile?" export-subst >>.git/info/attributes &&
  45        git add nosubstfile substfile1 substfile2 &&
  46        git commit -m. &&
  48        git clone --bare . bare &&
  50        cp .git/info/attributes bare/info/attributes
  51'
  52test_expect_success 'git archive' '
  54        git archive HEAD >archive.tar &&
  55        (mkdir archive && cd archive && "$TAR" xf -) <archive.tar
  56'
  57test_expect_missing     archive/ignored
  59test_expect_missing     archive/ignored-by-tree
  60test_expect_missing     archive/ignored-by-tree.d
  61test_expect_missing     archive/ignored-by-tree.d/file
  62test_expect_exists      archive/ignored-by-worktree
  63test_expect_exists      archive/excluded-by-pathspec.d
  64test_expect_exists      archive/excluded-by-pathspec.d/file
  65test_expect_success 'git archive with pathspec' '
  67        git archive HEAD ":!excluded-by-pathspec.d" >archive-pathspec.tar &&
  68        extract_tar_to_dir archive-pathspec
  69'
  70test_expect_missing     archive-pathspec/ignored
  72test_expect_missing     archive-pathspec/ignored-by-tree
  73test_expect_missing     archive-pathspec/ignored-by-tree.d
  74test_expect_missing     archive-pathspec/ignored-by-tree.d/file
  75test_expect_exists      archive-pathspec/ignored-by-worktree
  76test_expect_missing     archive-pathspec/excluded-by-pathspec.d
  77test_expect_missing     archive-pathspec/excluded-by-pathspec.d/file
  78test_expect_success 'git archive with wildcard pathspec' '
  80        git archive HEAD ":!excluded-by-p*" >archive-pathspec-wildcard.tar &&
  81        extract_tar_to_dir archive-pathspec-wildcard
  82'
  83test_expect_missing     archive-pathspec-wildcard/ignored
  85test_expect_missing     archive-pathspec-wildcard/ignored-by-tree
  86test_expect_missing     archive-pathspec-wildcard/ignored-by-tree.d
  87test_expect_missing     archive-pathspec-wildcard/ignored-by-tree.d/file
  88test_expect_exists      archive-pathspec-wildcard/ignored-by-worktree
  89test_expect_missing     archive-pathspec-wildcard/excluded-by-pathspec.d
  90test_expect_missing     archive-pathspec-wildcard/excluded-by-pathspec.d/file
  91test_expect_success 'git archive with worktree attributes' '
  93        git archive --worktree-attributes HEAD >worktree.tar &&
  94        (mkdir worktree && cd worktree && "$TAR" xf -) <worktree.tar
  95'
  96test_expect_missing     worktree/ignored
  98test_expect_exists      worktree/ignored-by-tree
  99test_expect_missing     worktree/ignored-by-worktree
 100test_expect_success 'git archive --worktree-attributes option' '
 102        git archive --worktree-attributes --worktree-attributes HEAD >worktree.tar &&
 103        (mkdir worktree2 && cd worktree2 && "$TAR" xf -) <worktree.tar
 104'
 105test_expect_missing     worktree2/ignored
 107test_expect_exists      worktree2/ignored-by-tree
 108test_expect_missing     worktree2/ignored-by-worktree
 109test_expect_success 'git archive vs. bare' '
 111        (cd bare && git archive HEAD) >bare-archive.tar &&
 112        test_cmp_bin archive.tar bare-archive.tar
 113'
 114test_expect_success 'git archive with worktree attributes, bare' '
 116        (cd bare && git archive --worktree-attributes HEAD) >bare-worktree.tar &&
 117        (mkdir bare-worktree && cd bare-worktree && "$TAR" xf -) <bare-worktree.tar
 118'
 119test_expect_missing     bare-worktree/ignored
 121test_expect_exists      bare-worktree/ignored-by-tree
 122test_expect_exists      bare-worktree/ignored-by-worktree
 123test_expect_success 'export-subst' '
 125        git log "--pretty=format:A${SUBSTFORMAT}O" HEAD >substfile1.expected &&
 126        test_cmp nosubstfile archive/nosubstfile &&
 127        test_cmp substfile1.expected archive/substfile1 &&
 128        test_cmp substfile2 archive/substfile2
 129'
 130test_done