3 test_description='git add -u
 
   5 This test creates a working tree state with three files:
 
   7   top (previously committed, modified)
 
   8   dir/sub (previously committed, modified)
 
  11 and issues a git add -u with path limiting on "dir" to add
 
  12 only the updates to dir/sub.
 
  14 Also tested are "git add -u" without limiting, and "git add -u"
 
  15 without contents changes, and other conditions'
 
  19 test_expect_success setup '
 
  20         echo initial >check &&
 
  24         echo initial >dir1/sub1 &&
 
  25         echo initial >dir1/sub2 &&
 
  26         echo initial >dir2/sub3 &&
 
  27         git add check dir1 dir2 top foo &&
 
  29         git commit -m initial &&
 
  31         echo changed >check &&
 
  33         echo changed >dir2/sub3 &&
 
  35         echo other >dir2/other
 
  38 test_expect_success update '
 
  42 test_expect_success 'update noticed a removal' '
 
  43         test "$(git ls-files dir1/sub1)" = ""
 
  46 test_expect_success 'update touched correct path' '
 
  47         test "$(git diff-files --name-status dir2/sub3)" = ""
 
  50 test_expect_success 'update did not touch other tracked files' '
 
  51         test "$(git diff-files --name-status check)" = "M       check" &&
 
  52         test "$(git diff-files --name-status top)" = "M top"
 
  55 test_expect_success 'update did not touch untracked files' '
 
  56         test "$(git ls-files dir2/other)" = ""
 
  59 test_expect_success 'cache tree has not been corrupted' '
 
  62         sed -e "s/ 0    /       /" >expect &&
 
  63         git ls-tree -r $(git write-tree) |
 
  64         sed -e "s/ blob / /" >current &&
 
  65         test_cmp expect current
 
  69 test_expect_success 'update from a subdirectory' '
 
  77 test_expect_success 'change gets noticed' '
 
  79         test "$(git diff-files --name-status dir1)" = ""
 
  83 test_expect_success SYMLINKS 'replace a file with a symlink' '
 
  91 test_expect_success 'add everything changed' '
 
  94         test -z "$(git diff-files)"
 
  98 test_expect_success 'touch and then add -u' '
 
 102         test -z "$(git diff-files)"
 
 106 test_expect_success 'touch and then add explicitly' '
 
 110         test -z "$(git diff-files)"
 
 114 test_expect_success 'add -n -u should not add but just report' '
 
 117                 echo "add '\''check'\''" &&
 
 118                 echo "remove '\''top'\''"
 
 120         before=$(git ls-files -s check top) &&
 
 121         echo changed >>check &&
 
 123         git add -n -u >actual &&
 
 124         after=$(git ls-files -s check top) &&
 
 126         test "$before" = "$after" &&
 
 127         test_i18ncmp expect actual
 
 131 test_expect_success 'add -u resolves unmerged paths' '
 
 133         one=$(echo 1 | git hash-object -w --stdin) &&
 
 134         two=$(echo 2 | git hash-object -w --stdin) &&
 
 135         three=$(echo 3 | git hash-object -w --stdin) &&
 
 137                 for path in path1 path2
 
 139                         echo "100644 $one 1     $path"
 
 140                         echo "100644 $two 2     $path"
 
 141                         echo "100644 $three 3   $path"
 
 143                 echo "100644 $one 1     path3"
 
 144                 echo "100644 $one 1     path4"
 
 145                 echo "100644 $one 3     path5"
 
 146                 echo "100644 $one 3     path6"
 
 148         git update-index --index-info &&
 
 153         # Explicit resolving by adding removed paths should fail
 
 154         test_must_fail git add path4 &&
 
 155         test_must_fail git add path6 &&
 
 157         # "add -u" should notice removals no matter what stages
 
 158         # the index entries are in.
 
 160         git ls-files -s path1 path2 path3 path4 path5 path6 >actual &&
 
 162                 echo "100644 $three 0   path1"
 
 163                 echo "100644 $two 0     path3"
 
 164                 echo "100644 $two 0     path5"
 
 166         test_cmp expect actual
 
 169 test_expect_success '"add -u non-existent" should fail' '
 
 170         test_must_fail git add -u non-existent &&
 
 171         ! (git ls-files | grep "non-existent")