The DWIM mode of checkout allows you to run "git checkout foo" when there is no existing local ref or path called "foo", and there is exactly one remote with a remote-tracking branch called "foo". Git will then automatically create a new local branch called "foo" using the remote-tracking "foo" as its starting point and configured upstream. Signed-off-by: Johan Herland <johan@xxxxxxxxxxx> --- t/t2024-checkout-dwim.sh | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100755 t/t2024-checkout-dwim.sh diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh new file mode 100755 index 0000000..5650d21 --- /dev/null +++ b/t/t2024-checkout-dwim.sh @@ -0,0 +1,66 @@ +#!/bin/sh + +test_description='checkout <branch> + +Ensures that checkout on an unborn branch does what the user expects' + +. ./test-lib.sh + +# Arguments: <branch> <remote> <remote-tracking> +# +# Verify that we have checked out <branch>, and that it is at the same +# commit as <remote-tracking>, and that has appropriate tracking config +# setup against <remote> +test_tracking_branch() { + branch=$1 && + remote=$2 && + remote_track=$3 && + test "refs/heads/$branch" = "$(git rev-parse --symbolic-full-name HEAD)" && + test "$(git rev-parse --verify HEAD)" = "$(git rev-parse --verify "$remote_track")" && + test "$remote" = "$(git config "branch.$branch.remote")" && + test "refs/heads/$branch" = "$(git config "branch.$branch.merge")" +} + +test_expect_success 'setup' ' + (git init repo_a && + cd repo_a && + test_commit a_master && + git checkout -b foo && + test_commit a_foo && + git checkout -b bar && + test_commit a_bar + ) && + (git init repo_b && + cd repo_b && + test_commit b_master && + git checkout -b foo && + test_commit b_foo && + git checkout -b baz && + test_commit b_baz + ) && + git remote add repo_a repo_a && + git remote add repo_b repo_b && + git config remote.repo_b.fetch \ + "+refs/heads/*:refs/remotes/other_b/*" && + git fetch --all +' + +test_expect_success 'checkout of non-existing branch fails' ' + test_must_fail git checkout xyzzy +' + +test_expect_success 'checkout of branch from multiple remotes fails' ' + test_must_fail git checkout foo +' + +test_expect_success 'checkout of branch from a single remote succeeds #1' ' + git checkout bar && + test_tracking_branch bar repo_a refs/remotes/repo_a/bar +' + +test_expect_success 'checkout of branch from a single remote succeeds #2' ' + git checkout baz && + test_tracking_branch baz repo_b refs/remotes/other_b/baz +' + +test_done -- 1.8.1.3.704.g33f7d4f -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html