Merge branch 'en/abort-df-conflict-fixes'
[gitweb.git] / t / t2024-checkout-dwim.sh
index 3e5ac81bd29bf6aded0d0fa643dca448a281d481..f79dfbbdd693b3fd7443d3c839e86e627663eb4b 100755 (executable)
@@ -23,6 +23,11 @@ test_branch_upstream () {
        test_cmp expect.upstream actual.upstream
 }
 
+status_uno_is_clean () {
+       git status -uno --porcelain >status.actual &&
+       test_must_be_empty status.actual
+}
+
 test_expect_success 'setup' '
        test_commit my_master &&
        git init repo_a &&
@@ -55,6 +60,7 @@ test_expect_success 'checkout of non-existing branch fails' '
        test_might_fail git branch -D xyzzy &&
 
        test_must_fail git checkout xyzzy &&
+       status_uno_is_clean &&
        test_must_fail git rev-parse --verify refs/heads/xyzzy &&
        test_branch master
 '
@@ -64,15 +70,47 @@ test_expect_success 'checkout of branch from multiple remotes fails #1' '
        test_might_fail git branch -D foo &&
 
        test_must_fail git checkout foo &&
+       status_uno_is_clean &&
        test_must_fail git rev-parse --verify refs/heads/foo &&
        test_branch master
 '
 
+test_expect_success 'checkout of branch from multiple remotes fails with advice' '
+       git checkout -B master &&
+       test_might_fail git branch -D foo &&
+       test_must_fail git checkout foo 2>stderr &&
+       test_branch master &&
+       status_uno_is_clean &&
+       test_i18ngrep "^hint: " stderr &&
+       test_must_fail git -c advice.checkoutAmbiguousRemoteBranchName=false \
+               checkout foo 2>stderr &&
+       test_branch master &&
+       status_uno_is_clean &&
+       test_i18ngrep ! "^hint: " stderr &&
+       # Make sure the likes of checkout -p do not print this hint
+       git checkout -p foo 2>stderr &&
+       test_i18ngrep ! "^hint: " stderr &&
+       status_uno_is_clean
+'
+
+test_expect_success 'checkout of branch from multiple remotes succeeds with checkout.defaultRemote #1' '
+       git checkout -B master &&
+       status_uno_is_clean &&
+       test_might_fail git branch -D foo &&
+
+       git -c checkout.defaultRemote=repo_a checkout foo &&
+       status_uno_is_clean &&
+       test_branch foo &&
+       test_cmp_rev remotes/repo_a/foo HEAD &&
+       test_branch_upstream foo repo_a foo
+'
+
 test_expect_success 'checkout of branch from a single remote succeeds #1' '
        git checkout -B master &&
        test_might_fail git branch -D bar &&
 
        git checkout bar &&
+       status_uno_is_clean &&
        test_branch bar &&
        test_cmp_rev remotes/repo_a/bar HEAD &&
        test_branch_upstream bar repo_a bar
@@ -83,6 +121,7 @@ test_expect_success 'checkout of branch from a single remote succeeds #2' '
        test_might_fail git branch -D baz &&
 
        git checkout baz &&
+       status_uno_is_clean &&
        test_branch baz &&
        test_cmp_rev remotes/other_b/baz HEAD &&
        test_branch_upstream baz repo_b baz
@@ -90,6 +129,7 @@ test_expect_success 'checkout of branch from a single remote succeeds #2' '
 
 test_expect_success '--no-guess suppresses branch auto-vivification' '
        git checkout -B master &&
+       status_uno_is_clean &&
        test_might_fail git branch -D bar &&
 
        test_must_fail git checkout --no-guess bar &&
@@ -99,6 +139,7 @@ test_expect_success '--no-guess suppresses branch auto-vivification' '
 
 test_expect_success 'setup more remotes with unconventional refspecs' '
        git checkout -B master &&
+       status_uno_is_clean &&
        git init repo_c &&
        (
                cd repo_c &&
@@ -128,27 +169,33 @@ test_expect_success 'setup more remotes with unconventional refspecs' '
 
 test_expect_success 'checkout of branch from multiple remotes fails #2' '
        git checkout -B master &&
+       status_uno_is_clean &&
        test_might_fail git branch -D bar &&
 
        test_must_fail git checkout bar &&
+       status_uno_is_clean &&
        test_must_fail git rev-parse --verify refs/heads/bar &&
        test_branch master
 '
 
 test_expect_success 'checkout of branch from multiple remotes fails #3' '
        git checkout -B master &&
+       status_uno_is_clean &&
        test_might_fail git branch -D baz &&
 
        test_must_fail git checkout baz &&
+       status_uno_is_clean &&
        test_must_fail git rev-parse --verify refs/heads/baz &&
        test_branch master
 '
 
 test_expect_success 'checkout of branch from a single remote succeeds #3' '
        git checkout -B master &&
+       status_uno_is_clean &&
        test_might_fail git branch -D spam &&
 
        git checkout spam &&
+       status_uno_is_clean &&
        test_branch spam &&
        test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD &&
        test_branch_upstream spam repo_c spam
@@ -156,9 +203,11 @@ test_expect_success 'checkout of branch from a single remote succeeds #3' '
 
 test_expect_success 'checkout of branch from a single remote succeeds #4' '
        git checkout -B master &&
+       status_uno_is_clean &&
        test_might_fail git branch -D eggs &&
 
        git checkout eggs &&
+       status_uno_is_clean &&
        test_branch eggs &&
        test_cmp_rev refs/repo_d/eggs HEAD &&
        test_branch_upstream eggs repo_d eggs
@@ -166,32 +215,38 @@ test_expect_success 'checkout of branch from a single remote succeeds #4' '
 
 test_expect_success 'checkout of branch with a file having the same name fails' '
        git checkout -B master &&
+       status_uno_is_clean &&
        test_might_fail git branch -D spam &&
 
        >spam &&
        test_must_fail git checkout spam &&
+       status_uno_is_clean &&
        test_must_fail git rev-parse --verify refs/heads/spam &&
        test_branch master
 '
 
 test_expect_success 'checkout of branch with a file in subdir having the same name fails' '
        git checkout -B master &&
+       status_uno_is_clean &&
        test_might_fail git branch -D spam &&
 
        >spam &&
        mkdir sub &&
        mv spam sub/spam &&
        test_must_fail git -C sub checkout spam &&
+       status_uno_is_clean &&
        test_must_fail git rev-parse --verify refs/heads/spam &&
        test_branch master
 '
 
 test_expect_success 'checkout <branch> -- succeeds, even if a file with the same name exists' '
        git checkout -B master &&
+       status_uno_is_clean &&
        test_might_fail git branch -D spam &&
 
        >spam &&
        git checkout spam -- &&
+       status_uno_is_clean &&
        test_branch spam &&
        test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD &&
        test_branch_upstream spam repo_c spam
@@ -200,6 +255,7 @@ test_expect_success 'checkout <branch> -- succeeds, even if a file with the same
 test_expect_success 'loosely defined local base branch is reported correctly' '
 
        git checkout master &&
+       status_uno_is_clean &&
        git branch strict &&
        git branch loose &&
        git commit --allow-empty -m "a bit more" &&
@@ -210,7 +266,9 @@ test_expect_success 'loosely defined local base branch is reported correctly' '
        test_config branch.loose.merge master &&
 
        git checkout strict | sed -e "s/strict/BRANCHNAME/g" >expect &&
+       status_uno_is_clean &&
        git checkout loose | sed -e "s/loose/BRANCHNAME/g" >actual &&
+       status_uno_is_clean &&
 
        test_cmp expect actual
 '