|  | #!/bin/sh | 
|  |  | 
|  | test_description='git add -u | 
|  |  | 
|  | This test creates a working tree state with three files: | 
|  |  | 
|  | top (previously committed, modified) | 
|  | dir/sub (previously committed, modified) | 
|  | dir/other (untracked) | 
|  |  | 
|  | and issues a git add -u with path limiting on "dir" to add | 
|  | only the updates to dir/sub. | 
|  |  | 
|  | Also tested are "git add -u" without limiting, and "git add -u" | 
|  | without contents changes.' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success setup ' | 
|  | echo initial >check && | 
|  | echo initial >top && | 
|  | echo initial >foo && | 
|  | mkdir dir1 dir2 && | 
|  | echo initial >dir1/sub1 && | 
|  | echo initial >dir1/sub2 && | 
|  | echo initial >dir2/sub3 && | 
|  | git add check dir1 dir2 top foo && | 
|  | test_tick | 
|  | git-commit -m initial && | 
|  |  | 
|  | echo changed >check && | 
|  | echo changed >top && | 
|  | echo changed >dir2/sub3 && | 
|  | rm -f dir1/sub1 && | 
|  | echo other >dir2/other | 
|  | ' | 
|  |  | 
|  | test_expect_success update ' | 
|  | git add -u dir1 dir2 | 
|  | ' | 
|  |  | 
|  | test_expect_success 'update noticed a removal' ' | 
|  | test "$(git-ls-files dir1/sub1)" = "" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'update touched correct path' ' | 
|  | test "$(git-diff-files --name-status dir2/sub3)" = "" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'update did not touch other tracked files' ' | 
|  | test "$(git-diff-files --name-status check)" = "M	check" && | 
|  | test "$(git-diff-files --name-status top)" = "M	top" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'update did not touch untracked files' ' | 
|  | test "$(git-ls-files dir2/other)" = "" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'cache tree has not been corrupted' ' | 
|  |  | 
|  | git ls-files -s | | 
|  | sed -e "s/ 0	/	/" >expect && | 
|  | git ls-tree -r $(git write-tree) | | 
|  | sed -e "s/ blob / /" >current && | 
|  | test_cmp expect current | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'update from a subdirectory' ' | 
|  | ( | 
|  | cd dir1 && | 
|  | echo more >sub2 && | 
|  | git add -u sub2 | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'change gets noticed' ' | 
|  |  | 
|  | test "$(git diff-files --name-status dir1)" = "" | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'replace a file with a symlink' ' | 
|  |  | 
|  | rm foo && | 
|  | ln -s top foo && | 
|  | git add -u -- foo | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'add everything changed' ' | 
|  |  | 
|  | git add -u && | 
|  | test -z "$(git diff-files)" | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'touch and then add -u' ' | 
|  |  | 
|  | touch check && | 
|  | git add -u && | 
|  | test -z "$(git diff-files)" | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'touch and then add explicitly' ' | 
|  |  | 
|  | touch check && | 
|  | git add check && | 
|  | test -z "$(git diff-files)" | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'add -n -u should not add but just report' ' | 
|  |  | 
|  | ( | 
|  | echo "add '\''check'\''" && | 
|  | echo "remove '\''top'\''" | 
|  | ) >expect && | 
|  | before=$(git ls-files -s check top) && | 
|  | echo changed >>check && | 
|  | rm -f top && | 
|  | git add -n -u >actual && | 
|  | after=$(git ls-files -s check top) && | 
|  |  | 
|  | test "$before" = "$after" && | 
|  | test_cmp expect actual | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_done |