checkout tests: index should be clean after dwim checkout
Assert that whenever there's a DWIM checkout that the index should be
clean afterwards, in addition to the correct branch being checked-out.
The way the DWIM checkout code in checkout.[ch] works is by looping
over all remotes, and for each remote trying to find if a given
reference name only exists on that remote, or if it exists anywhere
else.
This is done by starting out with a `unique = 1` tracking variable in
a struct shared by the entire loop, which will get set to `0` if the
data reference is not unique.
Thus if we find a match we know the dst_oid member of
tracking_name_data must be correct, since it's associated with the
only reference on the only remote that could have matched our query.
But if there was ever a mismatch there for some reason we might end up
with the correct branch checked out, but at the wrong oid, which would
show whatever the difference between the two staged in the
index (checkout branch A, stage changes from the state of branch B).
So let's amend the tests (mostly added in) 399e4a1c56
("t2024: Add
tests verifying current DWIM behavior of 'git checkout <branch>'",
2013-04-21) to always assert that "status" is clean after we run
"checkout", that's being done with "-uno" because there's going to be
some untracked files related to the test itself which we don't care
about.
In all these tests (DWIM or otherwise) we start with a clean index, so
these tests are asserting that that's still the case after the
"checkout", failed or otherwise.
Then if we ever run into this sort of regression, either in the
existing code or with a new feature, we'll know.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
c2c7d17b03
commit
c8cbf20cc2
@ -23,6 +23,12 @@ test_branch_upstream () {
|
|||||||
test_cmp expect.upstream actual.upstream
|
test_cmp expect.upstream actual.upstream
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status_uno_is_clean () {
|
||||||
|
>status.expect &&
|
||||||
|
git status -uno --porcelain >status.actual &&
|
||||||
|
test_cmp status.expect status.actual
|
||||||
|
}
|
||||||
|
|
||||||
test_expect_success 'setup' '
|
test_expect_success 'setup' '
|
||||||
test_commit my_master &&
|
test_commit my_master &&
|
||||||
git init repo_a &&
|
git init repo_a &&
|
||||||
@ -55,6 +61,7 @@ test_expect_success 'checkout of non-existing branch fails' '
|
|||||||
test_might_fail git branch -D xyzzy &&
|
test_might_fail git branch -D xyzzy &&
|
||||||
|
|
||||||
test_must_fail git checkout xyzzy &&
|
test_must_fail git checkout xyzzy &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_must_fail git rev-parse --verify refs/heads/xyzzy &&
|
test_must_fail git rev-parse --verify refs/heads/xyzzy &&
|
||||||
test_branch master
|
test_branch master
|
||||||
'
|
'
|
||||||
@ -64,6 +71,7 @@ test_expect_success 'checkout of branch from multiple remotes fails #1' '
|
|||||||
test_might_fail git branch -D foo &&
|
test_might_fail git branch -D foo &&
|
||||||
|
|
||||||
test_must_fail git checkout foo &&
|
test_must_fail git checkout foo &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_must_fail git rev-parse --verify refs/heads/foo &&
|
test_must_fail git rev-parse --verify refs/heads/foo &&
|
||||||
test_branch master
|
test_branch master
|
||||||
'
|
'
|
||||||
@ -73,6 +81,7 @@ test_expect_success 'checkout of branch from a single remote succeeds #1' '
|
|||||||
test_might_fail git branch -D bar &&
|
test_might_fail git branch -D bar &&
|
||||||
|
|
||||||
git checkout bar &&
|
git checkout bar &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_branch bar &&
|
test_branch bar &&
|
||||||
test_cmp_rev remotes/repo_a/bar HEAD &&
|
test_cmp_rev remotes/repo_a/bar HEAD &&
|
||||||
test_branch_upstream bar repo_a bar
|
test_branch_upstream bar repo_a bar
|
||||||
@ -83,6 +92,7 @@ test_expect_success 'checkout of branch from a single remote succeeds #2' '
|
|||||||
test_might_fail git branch -D baz &&
|
test_might_fail git branch -D baz &&
|
||||||
|
|
||||||
git checkout baz &&
|
git checkout baz &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_branch baz &&
|
test_branch baz &&
|
||||||
test_cmp_rev remotes/other_b/baz HEAD &&
|
test_cmp_rev remotes/other_b/baz HEAD &&
|
||||||
test_branch_upstream baz repo_b baz
|
test_branch_upstream baz repo_b baz
|
||||||
@ -90,6 +100,7 @@ test_expect_success 'checkout of branch from a single remote succeeds #2' '
|
|||||||
|
|
||||||
test_expect_success '--no-guess suppresses branch auto-vivification' '
|
test_expect_success '--no-guess suppresses branch auto-vivification' '
|
||||||
git checkout -B master &&
|
git checkout -B master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_might_fail git branch -D bar &&
|
test_might_fail git branch -D bar &&
|
||||||
|
|
||||||
test_must_fail git checkout --no-guess bar &&
|
test_must_fail git checkout --no-guess bar &&
|
||||||
@ -99,6 +110,7 @@ test_expect_success '--no-guess suppresses branch auto-vivification' '
|
|||||||
|
|
||||||
test_expect_success 'setup more remotes with unconventional refspecs' '
|
test_expect_success 'setup more remotes with unconventional refspecs' '
|
||||||
git checkout -B master &&
|
git checkout -B master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
git init repo_c &&
|
git init repo_c &&
|
||||||
(
|
(
|
||||||
cd repo_c &&
|
cd repo_c &&
|
||||||
@ -128,27 +140,33 @@ test_expect_success 'setup more remotes with unconventional refspecs' '
|
|||||||
|
|
||||||
test_expect_success 'checkout of branch from multiple remotes fails #2' '
|
test_expect_success 'checkout of branch from multiple remotes fails #2' '
|
||||||
git checkout -B master &&
|
git checkout -B master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_might_fail git branch -D bar &&
|
test_might_fail git branch -D bar &&
|
||||||
|
|
||||||
test_must_fail git checkout bar &&
|
test_must_fail git checkout bar &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_must_fail git rev-parse --verify refs/heads/bar &&
|
test_must_fail git rev-parse --verify refs/heads/bar &&
|
||||||
test_branch master
|
test_branch master
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'checkout of branch from multiple remotes fails #3' '
|
test_expect_success 'checkout of branch from multiple remotes fails #3' '
|
||||||
git checkout -B master &&
|
git checkout -B master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_might_fail git branch -D baz &&
|
test_might_fail git branch -D baz &&
|
||||||
|
|
||||||
test_must_fail git checkout baz &&
|
test_must_fail git checkout baz &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_must_fail git rev-parse --verify refs/heads/baz &&
|
test_must_fail git rev-parse --verify refs/heads/baz &&
|
||||||
test_branch master
|
test_branch master
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'checkout of branch from a single remote succeeds #3' '
|
test_expect_success 'checkout of branch from a single remote succeeds #3' '
|
||||||
git checkout -B master &&
|
git checkout -B master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_might_fail git branch -D spam &&
|
test_might_fail git branch -D spam &&
|
||||||
|
|
||||||
git checkout spam &&
|
git checkout spam &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_branch spam &&
|
test_branch spam &&
|
||||||
test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD &&
|
test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD &&
|
||||||
test_branch_upstream spam repo_c spam
|
test_branch_upstream spam repo_c spam
|
||||||
@ -156,9 +174,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' '
|
test_expect_success 'checkout of branch from a single remote succeeds #4' '
|
||||||
git checkout -B master &&
|
git checkout -B master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_might_fail git branch -D eggs &&
|
test_might_fail git branch -D eggs &&
|
||||||
|
|
||||||
git checkout eggs &&
|
git checkout eggs &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_branch eggs &&
|
test_branch eggs &&
|
||||||
test_cmp_rev refs/repo_d/eggs HEAD &&
|
test_cmp_rev refs/repo_d/eggs HEAD &&
|
||||||
test_branch_upstream eggs repo_d eggs
|
test_branch_upstream eggs repo_d eggs
|
||||||
@ -166,32 +186,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' '
|
test_expect_success 'checkout of branch with a file having the same name fails' '
|
||||||
git checkout -B master &&
|
git checkout -B master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_might_fail git branch -D spam &&
|
test_might_fail git branch -D spam &&
|
||||||
|
|
||||||
>spam &&
|
>spam &&
|
||||||
test_must_fail git checkout spam &&
|
test_must_fail git checkout spam &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_must_fail git rev-parse --verify refs/heads/spam &&
|
test_must_fail git rev-parse --verify refs/heads/spam &&
|
||||||
test_branch master
|
test_branch master
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'checkout of branch with a file in subdir having the same name fails' '
|
test_expect_success 'checkout of branch with a file in subdir having the same name fails' '
|
||||||
git checkout -B master &&
|
git checkout -B master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_might_fail git branch -D spam &&
|
test_might_fail git branch -D spam &&
|
||||||
|
|
||||||
>spam &&
|
>spam &&
|
||||||
mkdir sub &&
|
mkdir sub &&
|
||||||
mv spam sub/spam &&
|
mv spam sub/spam &&
|
||||||
test_must_fail git -C sub checkout spam &&
|
test_must_fail git -C sub checkout spam &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_must_fail git rev-parse --verify refs/heads/spam &&
|
test_must_fail git rev-parse --verify refs/heads/spam &&
|
||||||
test_branch master
|
test_branch master
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'checkout <branch> -- succeeds, even if a file with the same name exists' '
|
test_expect_success 'checkout <branch> -- succeeds, even if a file with the same name exists' '
|
||||||
git checkout -B master &&
|
git checkout -B master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_might_fail git branch -D spam &&
|
test_might_fail git branch -D spam &&
|
||||||
|
|
||||||
>spam &&
|
>spam &&
|
||||||
git checkout spam -- &&
|
git checkout spam -- &&
|
||||||
|
status_uno_is_clean &&
|
||||||
test_branch spam &&
|
test_branch spam &&
|
||||||
test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD &&
|
test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD &&
|
||||||
test_branch_upstream spam repo_c spam
|
test_branch_upstream spam repo_c spam
|
||||||
@ -200,6 +226,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' '
|
test_expect_success 'loosely defined local base branch is reported correctly' '
|
||||||
|
|
||||||
git checkout master &&
|
git checkout master &&
|
||||||
|
status_uno_is_clean &&
|
||||||
git branch strict &&
|
git branch strict &&
|
||||||
git branch loose &&
|
git branch loose &&
|
||||||
git commit --allow-empty -m "a bit more" &&
|
git commit --allow-empty -m "a bit more" &&
|
||||||
@ -210,7 +237,9 @@ test_expect_success 'loosely defined local base branch is reported correctly' '
|
|||||||
test_config branch.loose.merge master &&
|
test_config branch.loose.merge master &&
|
||||||
|
|
||||||
git checkout strict | sed -e "s/strict/BRANCHNAME/g" >expect &&
|
git checkout strict | sed -e "s/strict/BRANCHNAME/g" >expect &&
|
||||||
|
status_uno_is_clean &&
|
||||||
git checkout loose | sed -e "s/loose/BRANCHNAME/g" >actual &&
|
git checkout loose | sed -e "s/loose/BRANCHNAME/g" >actual &&
|
||||||
|
status_uno_is_clean &&
|
||||||
|
|
||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
Loading…
Reference in New Issue
Block a user