(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <'Tests for "git reset" with "--merge" and "--keep" options'>)} spids: [13] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(setup)} { (SQ <'\n'> <' for i in 1 2 3; do echo line $i; done >file1 &&\n'> <' cat file1 >file2 &&\n'> <' git add file1 file2 &&\n'> <' test_tick &&\n'> <' git commit -m "Initial commit" &&\n'> <' git tag initial &&\n'> <' echo line 4 >>file1 &&\n'> <' cat file1 >file2 &&\n'> <' test_tick &&\n'> <' git commit -m "add line 4 to file1" file1 &&\n'> <' git tag second\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --merge is ok with changes in file it does not touch'>)} { (SQ <'\n'> <' git reset --merge HEAD^ &&\n'> <' ! grep 4 file1 &&\n'> <' grep 4 file2 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --merge is ok when switching back'>)} { (SQ <'\n'> <' git reset --merge second &&\n'> <' grep 4 file1 &&\n'> <' grep 4 file2 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --keep is ok with changes in file it does not touch'>)} { (SQ <'\n'> <' git reset --hard second &&\n'> <' cat file1 >file2 &&\n'> <' git reset --keep HEAD^ &&\n'> <' ! grep 4 file1 &&\n'> <' grep 4 file2 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --keep is ok when switching back'>)} { (SQ <'\n'> <' git reset --keep second &&\n'> <' grep 4 file1 &&\n'> <' grep 4 file2 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --merge discards changes added to index (1)'>)} { (SQ <'\n'> <' git reset --hard second &&\n'> <' cat file1 >file2 &&\n'> <' echo "line 5" >> file1 &&\n'> <' git add file1 &&\n'> <' git reset --merge HEAD^ &&\n'> <' ! grep 4 file1 &&\n'> <' ! grep 5 file1 &&\n'> <' grep 4 file2 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --merge is ok again when switching back (1)'>)} { (SQ <'\n'> <' git reset --hard initial &&\n'> <' echo "line 5" >> file2 &&\n'> <' git add file2 &&\n'> <' git reset --merge second &&\n'> <' ! grep 4 file2 &&\n'> <' ! grep 5 file1 &&\n'> <' grep 4 file1 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --keep fails with changes in index in files it touches'>)} { (SQ <'\n'> <' git reset --hard second &&\n'> <' echo "line 5" >> file1 &&\n'> <' git add file1 &&\n'> <' test_must_fail git reset --keep HEAD^\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --merge discards changes added to index (2)'>)} { (SQ <'\n'> <' git reset --hard second &&\n'> <' echo "line 4" >> file2 &&\n'> <' git add file2 &&\n'> <' git reset --merge HEAD^ &&\n'> <' ! grep 4 file2 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> <' test -z "$(git diff)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --merge is ok again when switching back (2)'>)} { (SQ <'\n'> <' git reset --hard initial &&\n'> <' git reset --merge second &&\n'> <' ! grep 4 file2 &&\n'> <' grep 4 file1 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --keep keeps changes it does not touch'>)} { (SQ <'\n'> <' git reset --hard second &&\n'> <' echo "line 4" >> file2 &&\n'> <' git add file2 &&\n'> <' git reset --keep HEAD^ &&\n'> <' grep 4 file2 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --keep keeps changes when switching back'>)} { (SQ <'\n'> <' git reset --keep second &&\n'> <' grep 4 file2 &&\n'> <' grep 4 file1 &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> <' test -z "$(git diff --cached)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --merge fails with changes in file it touches'>)} { (SQ <'\n'> <' git reset --hard second &&\n'> <' echo "line 5" >> file1 &&\n'> <' test_tick &&\n'> <' git commit -m "add line 5" file1 &&\n'> <' sed -e "s/line 1/changed line 1/" <file1 >file3 &&\n'> <' mv file3 file1 &&\n'> <' test_must_fail git reset --merge HEAD^ 2>err.log &&\n'> <' grep file1 err.log | grep "not uptodate"\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --keep fails with changes in file it touches'>)} { (SQ <'\n'> <' git reset --hard second &&\n'> <' echo "line 5" >> file1 &&\n'> <' test_tick &&\n'> <' git commit -m "add line 5" file1 &&\n'> <' sed -e "s/line 1/changed line 1/" <file1 >file3 &&\n'> <' mv file3 file1 &&\n'> <' test_must_fail git reset --keep HEAD^ 2>err.log &&\n'> <' grep file1 err.log | grep "not uptodate"\n'> ) } ) (C {(test_expect_success)} {(SQ <'setup 3 different branches'>)} { (SQ <'\n'> <' git reset --hard second &&\n'> <' git branch branch1 &&\n'> <' git branch branch2 &&\n'> <' git branch branch3 &&\n'> <' git checkout branch1 &&\n'> <' echo "line 5 in branch1" >> file1 &&\n'> <' test_tick &&\n'> <' git commit -a -m "change in branch1" &&\n'> <' git checkout branch2 &&\n'> <' echo "line 5 in branch2" >> file1 &&\n'> <' test_tick &&\n'> <' git commit -a -m "change in branch2" &&\n'> <' git tag third &&\n'> <' git checkout branch3 &&\n'> <' echo a new file >file3 &&\n'> <' rm -f file1 &&\n'> <' git add file3 &&\n'> <' test_tick &&\n'> <' git commit -a -m "change in branch3"\n'> ) } ) (C {(test_expect_success)} {(SQ <'"reset --merge HEAD^" is ok with pending merge'>)} { (SQ <'\n'> <' git checkout third &&\n'> <' test_must_fail git merge branch1 &&\n'> <' git reset --merge HEAD^ &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> <' test -z "$(git diff --cached)" &&\n'> <' test -z "$(git diff)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'"reset --keep HEAD^" fails with pending merge'>)} { (SQ <'\n'> <' git reset --hard third &&\n'> <' test_must_fail git merge branch1 &&\n'> <' test_must_fail git reset --keep HEAD^ 2>err.log &&\n'> <' test_i18ngrep "middle of a merge" err.log\n'> ) } ) (C {(test_expect_success)} {(SQ <'"reset --merge HEAD" is ok with pending merge'>)} { (SQ <'\n'> <' git reset --hard third &&\n'> <' test_must_fail git merge branch1 &&\n'> <' git reset --merge HEAD &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse third)" &&\n'> <' test -z "$(git diff --cached)" &&\n'> <' test -z "$(git diff)"\n'> ) } ) (C {(test_expect_success)} {(SQ <'"reset --keep HEAD" fails with pending merge'>)} { (SQ <'\n'> <' git reset --hard third &&\n'> <' test_must_fail git merge branch1 &&\n'> <' test_must_fail git reset --keep HEAD 2>err.log &&\n'> <' test_i18ngrep "middle of a merge" err.log\n'> ) } ) (C {(test_expect_success)} {(SQ <'--merge is ok with added/deleted merge'>)} { (SQ <'\n'> <' git reset --hard third &&\n'> <' rm -f file2 &&\n'> <' test_must_fail git merge branch3 &&\n'> <' ! test -f file2 &&\n'> <' test -f file3 &&\n'> <' git diff --exit-code file3 &&\n'> <' git diff --exit-code branch3 file3 &&\n'> <' git reset --merge HEAD &&\n'> <' ! test -f file3 &&\n'> <' ! test -f file2 &&\n'> <' git diff --exit-code --cached\n'> ) } ) (C {(test_expect_success)} {(SQ <'--keep fails with added/deleted merge'>)} { (SQ <'\n'> <' git reset --hard third &&\n'> <' rm -f file2 &&\n'> <' test_must_fail git merge branch3 &&\n'> <' ! test -f file2 &&\n'> <' test -f file3 &&\n'> <' git diff --exit-code file3 &&\n'> <' git diff --exit-code branch3 file3 &&\n'> <' test_must_fail git reset --keep HEAD 2>err.log &&\n'> <' test_i18ngrep "middle of a merge" err.log\n'> ) } ) (C {(test_done)}) ] )