1#!/bin/sh
   2#
   3# Copyright (c) 2008 Nguyễn Thái Ngọc Duy
   4#
   5test_description='test worktree writing operations when skip-worktree is used'
   7. ./test-lib.sh
   9test_expect_success 'setup' '
  11        test_commit init &&
  12        echo modified >> init.t &&
  13        touch added &&
  14        git add init.t added &&
  15        git commit -m "modified and added" &&
  16        git tag top
  17'
  18test_expect_success 'read-tree updates worktree, absent case' '
  20        git checkout -f top &&
  21        git update-index --skip-worktree init.t &&
  22        rm init.t &&
  23        git read-tree -m -u HEAD^ &&
  24        echo init > expected &&
  25        test_cmp expected init.t
  26'
  27test_expect_success 'read-tree updates worktree, dirty case' '
  29        git checkout -f top &&
  30        git update-index --skip-worktree init.t &&
  31        echo dirty >> init.t &&
  32        test_must_fail git read-tree -m -u HEAD^ &&
  33        grep -q dirty init.t &&
  34        test "$(git ls-files -t init.t)" = "S init.t" &&
  35        git update-index --no-skip-worktree init.t
  36'
  37test_expect_success 'read-tree removes worktree, absent case' '
  39        git checkout -f top &&
  40        git update-index --skip-worktree added &&
  41        rm added &&
  42        git read-tree -m -u HEAD^ &&
  43        test ! -f added
  44'
  45test_expect_success 'read-tree removes worktree, dirty case' '
  47        git checkout -f top &&
  48        git update-index --skip-worktree added &&
  49        echo dirty >> added &&
  50        test_must_fail git read-tree -m -u HEAD^ &&
  51        grep -q dirty added &&
  52        test "$(git ls-files -t added)" = "S added" &&
  53        git update-index --no-skip-worktree added
  54'
  55NULL_SHA1=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
  57setup_absent() {
  59        test -f 1 && rm 1
  60        git update-index --remove 1 &&
  61        git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
  62        git update-index --skip-worktree 1
  63}
  64test_absent() {
  66        echo "100644 $NULL_SHA1 0       1" > expected &&
  67        git ls-files --stage 1 > result &&
  68        test_cmp expected result &&
  69        test ! -f 1
  70}
  71setup_dirty() {
  73        git update-index --force-remove 1 &&
  74        echo dirty > 1 &&
  75        git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
  76        git update-index --skip-worktree 1
  77}
  78test_dirty() {
  80        echo "100644 $NULL_SHA1 0       1" > expected &&
  81        git ls-files --stage 1 > result &&
  82        test_cmp expected result &&
  83        echo dirty > expected
  84        test_cmp expected 1
  85}
  86cat >expected <<EOF
  88S 1
  89H 2
  90H init.t
  91S sub/1
  92H sub/2
  93EOF
  94test_expect_success 'index setup' '
  96        git checkout -f init &&
  97        mkdir sub &&
  98        touch ./1 ./2 sub/1 sub/2 &&
  99        git add 1 2 sub/1 sub/2 &&
 100        git update-index --skip-worktree 1 sub/1 &&
 101        git ls-files -t > result &&
 102        test_cmp expected result
 103'
 104test_expect_success 'git-add ignores worktree content' '
 106        setup_absent &&
 107        git add 1 &&
 108        test_absent
 109'
 110test_expect_success 'git-add ignores worktree content' '
 112        setup_dirty &&
 113        git add 1 &&
 114        test_dirty
 115'
 116test_expect_success 'git-rm fails if worktree is dirty' '
 118        setup_dirty &&
 119        test_must_fail git rm 1 &&
 120        test_dirty
 121'
 122cat >expected <<EOF
 124Would remove expected
 125Would remove result
 126EOF
 127test_expect_success 'git-clean, absent case' '
 128        setup_absent &&
 129        git clean -n > result &&
 130        test_i18ncmp expected result
 131'
 132test_expect_success 'git-clean, dirty case' '
 134        setup_dirty &&
 135        git clean -n > result &&
 136        test_i18ncmp expected result
 137'
 138#TODO test_expect_failure 'git-apply adds file' false
 140#TODO test_expect_failure 'git-apply updates file' false
 141#TODO test_expect_failure 'git-apply removes file' false
 142#TODO test_expect_failure 'git-mv to skip-worktree' false
 143#TODO test_expect_failure 'git-mv from skip-worktree' false
 144#TODO test_expect_failure 'git-checkout' false
 145test_done