#!/bin/sh # # Copyright (c) 2009 Christian Couder # global test_description := ''Tests for "git reset" with "--merge" and "--keep" options'' source ./test-lib.sh test_expect_success setup ' for i in 1 2 3; do echo line $i; done >file1 && cat file1 >file2 && git add file1 file2 && test_tick && git commit -m "Initial commit" && git tag initial && echo line 4 >>file1 && cat file1 >file2 && test_tick && git commit -m "add line 4 to file1" file1 && git tag second ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: C C C D --merge D D D # file2: C D D D --merge C D D test_expect_success 'reset --merge is ok with changes in file it does not touch' ' git reset --merge HEAD^ && ! grep 4 file1 && grep 4 file2 && test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && test -z "$(git diff --cached)" ' test_expect_success 'reset --merge is ok when switching back' ' git reset --merge second && grep 4 file1 && grep 4 file2 && test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && test -z "$(git diff --cached)" ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: C C C D --keep D D D # file2: C D D D --keep C D D test_expect_success 'reset --keep is ok with changes in file it does not touch' ' git reset --hard second && cat file1 >file2 && git reset --keep HEAD^ && ! grep 4 file1 && grep 4 file2 && test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && test -z "$(git diff --cached)" ' test_expect_success 'reset --keep is ok when switching back' ' git reset --keep second && grep 4 file1 && grep 4 file2 && test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && test -z "$(git diff --cached)" ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: B B C D --merge D D D # file2: C D D D --merge C D D test_expect_success 'reset --merge discards changes added to index (1)' ' git reset --hard second && cat file1 >file2 && echo "line 5" >> file1 && git add file1 && git reset --merge HEAD^ && ! grep 4 file1 && ! grep 5 file1 && grep 4 file2 && test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && test -z "$(git diff --cached)" ' test_expect_success 'reset --merge is ok again when switching back (1)' ' git reset --hard initial && echo "line 5" >> file2 && git add file2 && git reset --merge second && ! grep 4 file2 && ! grep 5 file1 && grep 4 file1 && test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && test -z "$(git diff --cached)" ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: B B C D --keep (disallowed) test_expect_success 'reset --keep fails with changes in index in files it touches' ' git reset --hard second && echo "line 5" >> file1 && git add file1 && test_must_fail git reset --keep HEAD^ ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: C C C D --merge D D D # file2: C C D D --merge D D D test_expect_success 'reset --merge discards changes added to index (2)' ' git reset --hard second && echo "line 4" >> file2 && git add file2 && git reset --merge HEAD^ && ! grep 4 file2 && test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && test -z "$(git diff)" && test -z "$(git diff --cached)" ' test_expect_success 'reset --merge is ok again when switching back (2)' ' git reset --hard initial && git reset --merge second && ! grep 4 file2 && grep 4 file1 && test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && test -z "$(git diff --cached)" ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: C C C D --keep D D D # file2: C C D D --keep C D D test_expect_success 'reset --keep keeps changes it does not touch' ' git reset --hard second && echo "line 4" >> file2 && git add file2 && git reset --keep HEAD^ && grep 4 file2 && test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && test -z "$(git diff --cached)" ' test_expect_success 'reset --keep keeps changes when switching back' ' git reset --keep second && grep 4 file2 && grep 4 file1 && test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && test -z "$(git diff --cached)" ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: A B B C --merge (disallowed) test_expect_success 'reset --merge fails with changes in file it touches' ' git reset --hard second && echo "line 5" >> file1 && test_tick && git commit -m "add line 5" file1 && sed -e "s/line 1/changed line 1/" file3 && mv file3 file1 && test_must_fail git reset --merge HEAD^ 2>err.log && grep file1 err.log | grep "not uptodate" ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: A B B C --keep (disallowed) test_expect_success 'reset --keep fails with changes in file it touches' ' git reset --hard second && echo "line 5" >> file1 && test_tick && git commit -m "add line 5" file1 && sed -e "s/line 1/changed line 1/" file3 && mv file3 file1 && test_must_fail git reset --keep HEAD^ 2>err.log && grep file1 err.log | grep "not uptodate" ' test_expect_success 'setup 3 different branches' ' git reset --hard second && git branch branch1 && git branch branch2 && git branch branch3 && git checkout branch1 && echo "line 5 in branch1" >> file1 && test_tick && git commit -a -m "change in branch1" && git checkout branch2 && echo "line 5 in branch2" >> file1 && test_tick && git commit -a -m "change in branch2" && git tag third && git checkout branch3 && echo a new file >file3 && rm -f file1 && git add file3 && test_tick && git commit -a -m "change in branch3" ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: X U B C --merge C C C test_expect_success '"reset --merge HEAD^" is ok with pending merge' ' git checkout third && test_must_fail git merge branch1 && git reset --merge HEAD^ && test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && test -z "$(git diff --cached)" && test -z "$(git diff)" ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: X U B C --keep (disallowed) test_expect_success '"reset --keep HEAD^" fails with pending merge' ' git reset --hard third && test_must_fail git merge branch1 && test_must_fail git reset --keep HEAD^ 2>err.log && test_i18ngrep "middle of a merge" err.log ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: X U B B --merge B B B test_expect_success '"reset --merge HEAD" is ok with pending merge' ' git reset --hard third && test_must_fail git merge branch1 && git reset --merge HEAD && test "$(git rev-parse HEAD)" = "$(git rev-parse third)" && test -z "$(git diff --cached)" && test -z "$(git diff)" ' # The next test will test the following: # # working index HEAD target working index HEAD # ---------------------------------------------------- # file1: X U B B --keep (disallowed) test_expect_success '"reset --keep HEAD" fails with pending merge' ' git reset --hard third && test_must_fail git merge branch1 && test_must_fail git reset --keep HEAD 2>err.log && test_i18ngrep "middle of a merge" err.log ' test_expect_success '--merge is ok with added/deleted merge' ' git reset --hard third && rm -f file2 && test_must_fail git merge branch3 && ! test -f file2 && test -f file3 && git diff --exit-code file3 && git diff --exit-code branch3 file3 && git reset --merge HEAD && ! test -f file3 && ! test -f file2 && git diff --exit-code --cached ' test_expect_success '--keep fails with added/deleted merge' ' git reset --hard third && rm -f file2 && test_must_fail git merge branch3 && ! test -f file2 && test -f file3 && git diff --exit-code file3 && git diff --exit-code branch3 file3 && test_must_fail git reset --keep HEAD 2>err.log && test_i18ngrep "middle of a merge" err.log ' test_done (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/\" 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/\" 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)}) ] )