#!/bin/sh global test_description := ''Intent to add'' source ./test-lib.sh test_expect_success 'intent to add' ' test_commit 1 && git rm 1.t && echo hello >1.t && echo hello >file && echo hello >elif && git add -N file && git add elif && git add -N 1.t ' test_expect_success 'git status' ' git status --porcelain | grep -v actual >actual && cat >expect <<-\EOF && DA 1.t A elif A file EOF test_cmp expect actual ' test_expect_success 'check result of "add -N"' ' git ls-files -s file >actual && empty=$(git hash-object --stdin expect && test_cmp expect actual ' test_expect_success 'intent to add is just an ordinary empty blob' ' git add -u && git ls-files -s file >actual && git ls-files -s elif | sed -e "s/elif/file/" >expect && test_cmp expect actual ' test_expect_success 'intent to add does not clobber existing paths' ' git add -N file elif && empty=$(git hash-object --stdin actual && ! grep "$empty" actual ' test_expect_success 'i-t-a entry is simply ignored' ' test_tick && git commit -a -m initial && git reset --hard && echo xyzzy >rezrov && echo frotz >nitfol && git add rezrov && git add -N nitfol && git commit -m second && test $(git ls-tree HEAD -- nitfol | wc -l) = 0 && test $(git diff --name-only HEAD -- nitfol | wc -l) = 1 && test $(git diff --name-only --ita-invisible-in-index HEAD -- nitfol | wc -l) = 0 && test $(git diff --name-only --ita-invisible-in-index -- nitfol | wc -l) = 1 ' test_expect_success 'can commit with an unrelated i-t-a entry in index' ' git reset --hard && echo bozbar >rezrov && echo frotz >nitfol && git add rezrov && git add -N nitfol && git commit -m partial rezrov ' test_expect_success 'can "commit -a" with an i-t-a entry' ' git reset --hard && : >nitfol && git add -N nitfol && git commit -a -m all ' test_expect_success 'cache-tree invalidates i-t-a paths' ' git reset --hard && mkdir dir && : >dir/foo && git add dir/foo && git commit -m foo && : >dir/bar && git add -N dir/bar && git diff --cached --name-only >actual && echo dir/bar >expect && test_cmp expect actual && git write-tree >/dev/null && git diff --cached --name-only >actual && echo dir/bar >expect && test_cmp expect actual ' test_expect_success 'cache-tree does not ignore dir that has i-t-a entries' ' git init ita-in-dir && ( cd ita-in-dir && mkdir 2 && for f in 1 2/1 2/2 3 do echo "$f" >"$f" done && git add 1 2/2 3 && git add -N 2/1 && git commit -m committed && git ls-tree -r HEAD >actual && grep 2/2 actual ) ' test_expect_success 'cache-tree does skip dir that becomes empty' ' rm -fr ita-in-dir && git init ita-in-dir && ( cd ita-in-dir && mkdir -p 1/2/3 && echo 4 >1/2/3/4 && git add -N 1/2/3/4 && git write-tree >actual && echo $EMPTY_TREE >expected && test_cmp expected actual ) ' test_expect_success 'commit: ita entries ignored in empty intial commit check' ' git init empty-intial-commit && ( cd empty-intial-commit && : >one && git add -N one && test_must_fail git commit -m nothing-new-here ) ' test_expect_success 'commit: ita entries ignored in empty commit check' ' git init empty-subsequent-commit && ( cd empty-subsequent-commit && test_commit one && : >two && git add -N two && test_must_fail git commit -m nothing-new-here ) ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"Intent to add">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ <"intent to add">)} { (SQ <"\n"> <"\ttest_commit 1 &&\n"> <"\tgit rm 1.t &&\n"> <"\techo hello >1.t &&\n"> <"\techo hello >file &&\n"> <"\techo hello >elif &&\n"> <"\tgit add -N file &&\n"> <"\tgit add elif &&\n"> <"\tgit add -N 1.t\n"> ) } ) (C {(test_expect_success)} {(SQ <"git status">)} { (SQ <"\n"> <"\tgit status --porcelain | grep -v actual >actual &&\n"> <"\tcat >expect <<-\\EOF &&\n"> <"\tDA 1.t\n"> <"\tA elif\n"> <"\t A file\n"> <"\tEOF\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"check result of \"add -N\"">)} { (SQ <"\n"> <"\tgit ls-files -s file >actual &&\n"> <"\tempty=$(git hash-object --stdin <"\techo \"100644 $empty 0\tfile\" >expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"intent to add is just an ordinary empty blob">)} { (SQ <"\n"> <"\tgit add -u &&\n"> <"\tgit ls-files -s file >actual &&\n"> <"\tgit ls-files -s elif | sed -e \"s/elif/file/\" >expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"intent to add does not clobber existing paths">)} { (SQ <"\n"> <"\tgit add -N file elif &&\n"> <"\tempty=$(git hash-object --stdin <"\tgit ls-files -s >actual &&\n"> <"\t! grep \"$empty\" actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"i-t-a entry is simply ignored">)} { (SQ <"\n"> <"\ttest_tick &&\n"> <"\tgit commit -a -m initial &&\n"> <"\tgit reset --hard &&\n"> <"\n"> <"\techo xyzzy >rezrov &&\n"> <"\techo frotz >nitfol &&\n"> <"\tgit add rezrov &&\n"> <"\tgit add -N nitfol &&\n"> <"\tgit commit -m second &&\n"> <"\ttest $(git ls-tree HEAD -- nitfol | wc -l) = 0 &&\n"> <"\ttest $(git diff --name-only HEAD -- nitfol | wc -l) = 1 &&\n"> <"\ttest $(git diff --name-only --ita-invisible-in-index HEAD -- nitfol | wc -l) = 0 &&\n"> <"\ttest $(git diff --name-only --ita-invisible-in-index -- nitfol | wc -l) = 1\n"> ) } ) (C {(test_expect_success)} {(SQ <"can commit with an unrelated i-t-a entry in index">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\techo bozbar >rezrov &&\n"> <"\techo frotz >nitfol &&\n"> <"\tgit add rezrov &&\n"> <"\tgit add -N nitfol &&\n"> <"\tgit commit -m partial rezrov\n"> ) } ) (C {(test_expect_success)} {(SQ <"can \"commit -a\" with an i-t-a entry">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\t: >nitfol &&\n"> <"\tgit add -N nitfol &&\n"> <"\tgit commit -a -m all\n"> ) } ) (C {(test_expect_success)} {(SQ <"cache-tree invalidates i-t-a paths">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tmkdir dir &&\n"> <"\t: >dir/foo &&\n"> <"\tgit add dir/foo &&\n"> <"\tgit commit -m foo &&\n"> <"\n"> <"\t: >dir/bar &&\n"> <"\tgit add -N dir/bar &&\n"> <"\tgit diff --cached --name-only >actual &&\n"> <"\techo dir/bar >expect &&\n"> <"\ttest_cmp expect actual &&\n"> <"\n"> <"\tgit write-tree >/dev/null &&\n"> <"\n"> <"\tgit diff --cached --name-only >actual &&\n"> <"\techo dir/bar >expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"cache-tree does not ignore dir that has i-t-a entries">)} { (SQ <"\n"> <"\tgit init ita-in-dir &&\n"> <"\t(\n"> <"\t\tcd ita-in-dir &&\n"> <"\t\tmkdir 2 &&\n"> <"\t\tfor f in 1 2/1 2/2 3\n"> <"\t\tdo\n"> <"\t\t\techo \"$f\" >\"$f\"\n"> <"\t\tdone &&\n"> <"\t\tgit add 1 2/2 3 &&\n"> <"\t\tgit add -N 2/1 &&\n"> <"\t\tgit commit -m committed &&\n"> <"\t\tgit ls-tree -r HEAD >actual &&\n"> <"\t\tgrep 2/2 actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"cache-tree does skip dir that becomes empty">)} { (SQ <"\n"> <"\trm -fr ita-in-dir &&\n"> <"\tgit init ita-in-dir &&\n"> <"\t(\n"> <"\t\tcd ita-in-dir &&\n"> <"\t\tmkdir -p 1/2/3 &&\n"> <"\t\techo 4 >1/2/3/4 &&\n"> <"\t\tgit add -N 1/2/3/4 &&\n"> <"\t\tgit write-tree >actual &&\n"> <"\t\techo $EMPTY_TREE >expected &&\n"> <"\t\ttest_cmp expected actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"commit: ita entries ignored in empty intial commit check">)} { (SQ <"\n"> <"\tgit init empty-intial-commit &&\n"> <"\t(\n"> <"\t\tcd empty-intial-commit &&\n"> <"\t\t: >one &&\n"> <"\t\tgit add -N one &&\n"> <"\t\ttest_must_fail git commit -m nothing-new-here\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"commit: ita entries ignored in empty commit check">)} { (SQ <"\n"> <"\tgit init empty-subsequent-commit &&\n"> <"\t(\n"> <"\t\tcd empty-subsequent-commit &&\n"> <"\t\ttest_commit one &&\n"> <"\t\t: >two &&\n"> <"\t\tgit add -N two &&\n"> <"\t\ttest_must_fail git commit -m nothing-new-here\n"> <"\t)\n"> ) } ) (C {(test_done)}) ] )