Code

Merge branch 'maint'
[git.git] / t / t7201-co.sh
index 1d4ff6e8d30ce49a2792107be1c23a66b1df3a8b..82769b89fc79d91982420ddfc83ce6c3dd672095 100755 (executable)
@@ -3,7 +3,7 @@
 # Copyright (c) 2006 Junio C Hamano
 #
 
-test_description='git-checkout tests.
+test_description='git checkout tests.
 
 Creates master, forks renamer and side branches from it.
 Test switching across them.
@@ -337,7 +337,39 @@ test_expect_success \
     test refs/heads/delete-me = "$(git symbolic-ref HEAD)" &&
     test_must_fail git checkout --track -b track'
 
-test_expect_success 'checkout an unmerged path should fail' '
+test_expect_success \
+    'checkout with --track fakes a sensible -b <name>' '
+    git update-ref refs/remotes/origin/koala/bear renamer &&
+    git update-ref refs/new/koala/bear renamer &&
+
+    git checkout --track origin/koala/bear &&
+    test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&
+    test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" &&
+
+    git checkout master && git branch -D koala/bear &&
+
+    git checkout --track refs/remotes/origin/koala/bear &&
+    test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&
+    test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" &&
+
+    git checkout master && git branch -D koala/bear &&
+
+    git checkout --track remotes/origin/koala/bear &&
+    test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&
+    test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" &&
+
+    git checkout master && git branch -D koala/bear &&
+
+    git checkout --track refs/new/koala/bear &&
+    test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&
+    test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)"
+'
+
+test_expect_success \
+    'checkout with --track, but without -b, fails with too short tracked name' '
+    test_must_fail git checkout --track renamer'
+
+setup_conflicting_index () {
        rm -f .git/index &&
        O=$(echo original | git hash-object -w --stdin) &&
        A=$(echo ourside | git hash-object -w --stdin) &&
@@ -348,7 +380,11 @@ test_expect_success 'checkout an unmerged path should fail' '
                echo "100644 $A 2       file" &&
                echo "100644 $B 3       file" &&
                echo "100644 $A 0       filf"
-       ) | git update-index --index-info &&
+       ) | git update-index --index-info
+}
+
+test_expect_success 'checkout an unmerged path should fail' '
+       setup_conflicting_index &&
        echo "none of the above" >sample &&
        cat sample >fild &&
        cat sample >file &&
@@ -360,17 +396,7 @@ test_expect_success 'checkout an unmerged path should fail' '
 '
 
 test_expect_success 'checkout with an unmerged path can be ignored' '
-       rm -f .git/index &&
-       O=$(echo original | git hash-object -w --stdin) &&
-       A=$(echo ourside | git hash-object -w --stdin) &&
-       B=$(echo theirside | git hash-object -w --stdin) &&
-       (
-               echo "100644 $A 0       fild" &&
-               echo "100644 $O 1       file" &&
-               echo "100644 $A 2       file" &&
-               echo "100644 $B 3       file" &&
-               echo "100644 $A 0       filf"
-       ) | git update-index --index-info &&
+       setup_conflicting_index &&
        echo "none of the above" >sample &&
        echo ourside >expect &&
        cat sample >fild &&
@@ -383,17 +409,7 @@ test_expect_success 'checkout with an unmerged path can be ignored' '
 '
 
 test_expect_success 'checkout unmerged stage' '
-       rm -f .git/index &&
-       O=$(echo original | git hash-object -w --stdin) &&
-       A=$(echo ourside | git hash-object -w --stdin) &&
-       B=$(echo theirside | git hash-object -w --stdin) &&
-       (
-               echo "100644 $A 0       fild" &&
-               echo "100644 $O 1       file" &&
-               echo "100644 $A 2       file" &&
-               echo "100644 $B 3       file" &&
-               echo "100644 $A 0       filf"
-       ) | git update-index --index-info &&
+       setup_conflicting_index &&
        echo "none of the above" >sample &&
        echo ourside >expect &&
        cat sample >fild &&
@@ -408,17 +424,7 @@ test_expect_success 'checkout unmerged stage' '
 '
 
 test_expect_success 'checkout with --merge' '
-       rm -f .git/index &&
-       O=$(echo original | git hash-object -w --stdin) &&
-       A=$(echo ourside | git hash-object -w --stdin) &&
-       B=$(echo theirside | git hash-object -w --stdin) &&
-       (
-               echo "100644 $A 0       fild" &&
-               echo "100644 $O 1       file" &&
-               echo "100644 $A 2       file" &&
-               echo "100644 $B 3       file" &&
-               echo "100644 $A 0       filf"
-       ) | git update-index --index-info &&
+       setup_conflicting_index &&
        echo "none of the above" >sample &&
        echo ourside >expect &&
        cat sample >fild &&
@@ -439,17 +445,7 @@ test_expect_success 'checkout with --merge' '
 
 test_expect_success 'checkout with --merge, in diff3 -m style' '
        git config merge.conflictstyle diff3 &&
-       rm -f .git/index &&
-       O=$(echo original | git hash-object -w --stdin) &&
-       A=$(echo ourside | git hash-object -w --stdin) &&
-       B=$(echo theirside | git hash-object -w --stdin) &&
-       (
-               echo "100644 $A 0       fild" &&
-               echo "100644 $O 1       file" &&
-               echo "100644 $A 2       file" &&
-               echo "100644 $B 3       file" &&
-               echo "100644 $A 0       filf"
-       ) | git update-index --index-info &&
+       setup_conflicting_index &&
        echo "none of the above" >sample &&
        echo ourside >expect &&
        cat sample >fild &&
@@ -470,4 +466,58 @@ test_expect_success 'checkout with --merge, in diff3 -m style' '
        test_cmp merged file
 '
 
+test_expect_success 'checkout --conflict=merge, overriding config' '
+       git config merge.conflictstyle diff3 &&
+       setup_conflicting_index &&
+       echo "none of the above" >sample &&
+       echo ourside >expect &&
+       cat sample >fild &&
+       cat sample >file &&
+       cat sample >filf &&
+       git checkout --conflict=merge -- fild file filf &&
+       (
+               echo "<<<<<<< ours"
+               echo ourside
+               echo "======="
+               echo theirside
+               echo ">>>>>>> theirs"
+       ) >merged &&
+       test_cmp expect fild &&
+       test_cmp expect filf &&
+       test_cmp merged file
+'
+
+test_expect_success 'checkout --conflict=diff3' '
+       git config --unset merge.conflictstyle
+       setup_conflicting_index &&
+       echo "none of the above" >sample &&
+       echo ourside >expect &&
+       cat sample >fild &&
+       cat sample >file &&
+       cat sample >filf &&
+       git checkout --conflict=diff3 -- fild file filf &&
+       (
+               echo "<<<<<<< ours"
+               echo ourside
+               echo "|||||||"
+               echo original
+               echo "======="
+               echo theirside
+               echo ">>>>>>> theirs"
+       ) >merged &&
+       test_cmp expect fild &&
+       test_cmp expect filf &&
+       test_cmp merged file
+'
+
+test_expect_success 'failing checkout -b should not break working tree' '
+       git reset --hard master &&
+       git symbolic-ref HEAD refs/heads/master &&
+       test_must_fail git checkout -b renamer side^ &&
+       test $(git symbolic-ref HEAD) = refs/heads/master &&
+       git diff --exit-code &&
+       git diff --cached --exit-code
+
+'
+
 test_done