#!/bin/sh # # Copyright (c) 2008 Nguyễn Thái Ngọc Duy # test_description='test worktree writing operations when skip-worktree is used' . ./test-lib.sh test_expect_success 'setup' ' test_commit init && echo modified >> init.t && touch added && git add init.t added && git commit -m "modified and added" && git tag top ' test_expect_success 'read-tree updates worktree, absent case' ' git checkout -f top && git update-index --skip-worktree init.t && rm init.t && git read-tree -m -u HEAD^ && echo init > expected && test_cmp expected init.t ' test_expect_success 'read-tree updates worktree, dirty case' ' git checkout -f top && git update-index --skip-worktree init.t && echo dirty >> init.t && test_must_fail git read-tree -m -u HEAD^ && grep -q dirty init.t && test "$(git ls-files -t init.t)" = "S init.t" && git update-index --no-skip-worktree init.t ' test_expect_success 'read-tree removes worktree, absent case' ' git checkout -f top && git update-index --skip-worktree added && rm added && git read-tree -m -u HEAD^ && test ! -f added ' test_expect_success 'read-tree removes worktree, dirty case' ' git checkout -f top && git update-index --skip-worktree added && echo dirty >> added && test_must_fail git read-tree -m -u HEAD^ && grep -q dirty added && test "$(git ls-files -t added)" = "S added" && git update-index --no-skip-worktree added ' setup_absent() { test -f 1 && rm 1 git update-index --remove 1 && git update-index --add --cacheinfo 100644 $EMPTY_BLOB 1 && git update-index --skip-worktree 1 } test_absent() { echo "100644 $EMPTY_BLOB 0 1" > expected && git ls-files --stage 1 > result && test_cmp expected result && test ! -f 1 } setup_dirty() { git update-index --force-remove 1 && echo dirty > 1 && git update-index --add --cacheinfo 100644 $EMPTY_BLOB 1 && git update-index --skip-worktree 1 } test_dirty() { echo "100644 $EMPTY_BLOB 0 1" > expected && git ls-files --stage 1 > result && test_cmp expected result && echo dirty > expected test_cmp expected 1 } cat >expected <<EOF S 1 H 2 H init.t S sub/1 H sub/2 EOF test_expect_success 'index setup' ' git checkout -f init && mkdir sub && touch ./1 ./2 sub/1 sub/2 && git add 1 2 sub/1 sub/2 && git update-index --skip-worktree 1 sub/1 && git ls-files -t > result && test_cmp expected result ' test_expect_success 'git-add ignores worktree content' ' setup_absent && git add 1 && test_absent ' test_expect_success 'git-add ignores worktree content' ' setup_dirty && git add 1 && test_dirty ' test_expect_success 'git-rm fails if worktree is dirty' ' setup_dirty && test_must_fail git rm 1 && test_dirty ' cat >expected <<EOF Would remove expected Would remove result EOF test_expect_success 'git-clean, absent case' ' setup_absent && git clean -n > result && test_cmp expected result ' test_expect_success 'git-clean, dirty case' ' setup_dirty && git clean -n > result && test_cmp expected result ' test_expect_success '--ignore-skip-worktree-entries leaves worktree alone' ' test_commit keep-me && git update-index --skip-worktree keep-me.t && rm keep-me.t && : ignoring the worktree && git update-index --remove --ignore-skip-worktree-entries keep-me.t && git diff-index --cached --exit-code HEAD && : not ignoring the worktree, a deletion is staged && git update-index --remove keep-me.t && test_must_fail git diff-index --cached --exit-code HEAD \ --diff-filter=D -- keep-me.t ' test_expect_success 'stash restore in sparse checkout' ' test_create_repo stash-restore && ( cd stash-restore && mkdir subdir && echo A >subdir/A && echo untouched >untouched && echo removeme >removeme && echo modified >modified && git add . && git commit -m Initial && echo AA >>subdir/A && echo addme >addme && echo tweaked >>modified && rm removeme && git add addme && git stash push && git sparse-checkout set subdir && # Ensure after sparse-checkout we only have expected files cat >expect <<-EOF && S modified S removeme H subdir/A S untouched EOF git ls-files -t >actual && test_cmp expect actual && test_path_is_missing addme && test_path_is_missing modified && test_path_is_missing removeme && test_path_is_file subdir/A && test_path_is_missing untouched && # Put a file in the working directory in the way echo in the way >modified && git stash apply && # Ensure stash vivifies modifies paths... cat >expect <<-EOF && H addme H modified H removeme H subdir/A S untouched EOF git ls-files -t >actual && test_cmp expect actual && # ...and that the paths show up in status as changed... cat >expect <<-EOF && A addme M modified D removeme M subdir/A ?? actual ?? expect ?? modified.stash.XXXXXX EOF git status --porcelain | \ sed -e s/stash......./stash.XXXXXX/ >actual && test_cmp expect actual && # ...and that working directory reflects the files correctly test_path_is_file addme && test_path_is_file modified && test_path_is_missing removeme && test_path_is_file subdir/A && test_path_is_missing untouched && # ...including that we have the expected "modified" file... cat >expect <<-EOF && modified tweaked EOF test_cmp expect modified && # ...and that the other "modified" file is still present... echo in the way >expect && test_cmp expect modified.stash.* ) ' #TODO test_expect_failure 'git-apply adds file' false #TODO test_expect_failure 'git-apply updates file' false #TODO test_expect_failure 'git-apply removes file' false #TODO test_expect_failure 'git-mv to skip-worktree' false #TODO test_expect_failure 'git-mv from skip-worktree' false #TODO test_expect_failure 'git-checkout' false test_done