|  | #!/bin/sh | 
|  |  | 
|  | test_description='checkout can switch to last branch and merge base' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success 'setup' ' | 
|  | echo hello >world && | 
|  | git add world && | 
|  | git commit -m initial && | 
|  | git branch other && | 
|  | echo "hello again" >>world && | 
|  | git add world && | 
|  | git commit -m second | 
|  | ' | 
|  |  | 
|  | test_expect_success '"checkout -" does not work initially' ' | 
|  | test_must_fail git checkout - | 
|  | ' | 
|  |  | 
|  | test_expect_success 'first branch switch' ' | 
|  | git checkout other | 
|  | ' | 
|  |  | 
|  | test_expect_success '"checkout -" switches back' ' | 
|  | git checkout - && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" | 
|  | ' | 
|  |  | 
|  | test_expect_success '"checkout -" switches forth' ' | 
|  | git checkout - && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/other" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'detach HEAD' ' | 
|  | git checkout $(git rev-parse HEAD) | 
|  | ' | 
|  |  | 
|  | test_expect_success '"checkout -" attaches again' ' | 
|  | git checkout - && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/other" | 
|  | ' | 
|  |  | 
|  | test_expect_success '"checkout -" detaches again' ' | 
|  | git checkout - && | 
|  | test "z$(git rev-parse HEAD)" = "z$(git rev-parse other)" && | 
|  | test_must_fail git symbolic-ref HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'more switches' ' | 
|  | for i in 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 | 
|  | do | 
|  | git checkout -b branch$i | 
|  | done | 
|  | ' | 
|  |  | 
|  | more_switches () { | 
|  | for i in 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 | 
|  | do | 
|  | git checkout branch$i | 
|  | done | 
|  | } | 
|  |  | 
|  | test_expect_success 'switch to the last' ' | 
|  | more_switches && | 
|  | git checkout @{-1} && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/branch2" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'switch to second from the last' ' | 
|  | more_switches && | 
|  | git checkout @{-2} && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/branch3" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'switch to third from the last' ' | 
|  | more_switches && | 
|  | git checkout @{-3} && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/branch4" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'switch to fourth from the last' ' | 
|  | more_switches && | 
|  | git checkout @{-4} && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/branch5" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'switch to twelfth from the last' ' | 
|  | more_switches && | 
|  | git checkout @{-12} && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/branch13" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'merge base test setup' ' | 
|  | git checkout -b another other && | 
|  | echo "hello again" >>world && | 
|  | git add world && | 
|  | git commit -m third | 
|  | ' | 
|  |  | 
|  | test_expect_success 'another...master' ' | 
|  | git checkout another && | 
|  | git checkout another...master && | 
|  | test "z$(git rev-parse --verify HEAD)" = "z$(git rev-parse --verify master^)" | 
|  | ' | 
|  |  | 
|  | test_expect_success '...master' ' | 
|  | git checkout another && | 
|  | git checkout ...master && | 
|  | test "z$(git rev-parse --verify HEAD)" = "z$(git rev-parse --verify master^)" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'master...' ' | 
|  | git checkout another && | 
|  | git checkout master... && | 
|  | test "z$(git rev-parse --verify HEAD)" = "z$(git rev-parse --verify master^)" | 
|  | ' | 
|  |  | 
|  | test_expect_success '"checkout -" works after a rebase A' ' | 
|  | git checkout master && | 
|  | git checkout other && | 
|  | git rebase master && | 
|  | git checkout - && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" | 
|  | ' | 
|  |  | 
|  | test_expect_success '"checkout -" works after a rebase A B' ' | 
|  | git branch moodle master~1 && | 
|  | git checkout master && | 
|  | git checkout other && | 
|  | git rebase master moodle && | 
|  | git checkout - && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" | 
|  | ' | 
|  |  | 
|  | test_expect_success '"checkout -" works after a rebase -i A' ' | 
|  | git checkout master && | 
|  | git checkout other && | 
|  | git rebase -i master && | 
|  | git checkout - && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" | 
|  | ' | 
|  |  | 
|  | test_expect_success '"checkout -" works after a rebase -i A B' ' | 
|  | git branch foodle master~1 && | 
|  | git checkout master && | 
|  | git checkout other && | 
|  | git rebase master foodle && | 
|  | git checkout - && | 
|  | test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" | 
|  | ' | 
|  |  | 
|  | test_done |