t / t7012-skip-worktree-writing.shon commit merge-recursive: D/F conflicts where was_a_dir/file -> was_a_dir (86273e5)
   1#!/bin/sh
   2#
   3# Copyright (c) 2008 Nguyễn Thái Ngọc Duy
   4#
   5
   6test_description='test worktree writing operations when skip-worktree is used'
   7
   8. ./test-lib.sh
   9
  10test_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'
  18
  19test_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'
  27
  28test_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'
  37
  38test_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'
  45
  46test_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'
  55
  56NULL_SHA1=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
  57ZERO_SHA0=0000000000000000000000000000000000000000
  58setup_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}
  64
  65test_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}
  71
  72setup_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}
  78
  79test_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}
  86
  87cat >expected <<EOF
  88S 1
  89H 2
  90H init.t
  91S sub/1
  92H sub/2
  93EOF
  94
  95test_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'
 104
 105test_expect_success 'git-add ignores worktree content' '
 106        setup_absent &&
 107        git add 1 &&
 108        test_absent
 109'
 110
 111test_expect_success 'git-add ignores worktree content' '
 112        setup_dirty &&
 113        git add 1 &&
 114        test_dirty
 115'
 116
 117test_expect_success 'git-rm fails if worktree is dirty' '
 118        setup_dirty &&
 119        test_must_fail git rm 1 &&
 120        test_dirty
 121'
 122
 123cat >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_cmp expected result
 131'
 132
 133test_expect_success 'git-clean, dirty case' '
 134        setup_dirty &&
 135        git clean -n > result &&
 136        test_cmp expected result
 137'
 138
 139#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
 145
 146test_done