t5516: more tests for receive.denyCurrentBranch=updateInstead
The previous one tests only the case where a path to be updated by the push-to-deploy has an incompatible change in the target's working tree that has already been added to the index, but the feature itself wants to require the working tree to be a lot cleaner than what is tested. Add a handful more tests to protect the feature from future changes that mistakenly (from the viewpoint of the inventor of the feature) loosens the cleanliness requirement, namely: - A change only to the working tree but not to the index is still a change to be protected; - An untracked file in the working tree that would be overwritten by a push-to-deploy needs to be protected; - A change that happens to make a file identical to what is being pushed is still a change to be protected (i.e. the feature's cleanliness requirement is more strict than that of checkout). Also, test that a stat-only change to the working tree is not a reason to reject a push-to-deploy. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
1404bcbb6b
commit
4d7a5ceacc
@ -1332,28 +1332,106 @@ test_expect_success 'fetch into bare respects core.logallrefupdates' '
|
||||
|
||||
test_expect_success 'receive.denyCurrentBranch = updateInstead' '
|
||||
git push testrepo master &&
|
||||
(cd testrepo &&
|
||||
(
|
||||
cd testrepo &&
|
||||
git reset --hard &&
|
||||
git config receive.denyCurrentBranch updateInstead
|
||||
) &&
|
||||
test_commit third path2 &&
|
||||
|
||||
# Try pushing into a repository with pristine working tree
|
||||
git push testrepo master &&
|
||||
test $(git rev-parse HEAD) = $(cd testrepo && git rev-parse HEAD) &&
|
||||
test third = "$(cat testrepo/path2)" &&
|
||||
(cd testrepo &&
|
||||
(
|
||||
cd testrepo &&
|
||||
git update-index -q --refresh &&
|
||||
git diff-files --quiet -- &&
|
||||
git diff-index --quiet --cached HEAD -- &&
|
||||
echo changed >path2 &&
|
||||
git add path2
|
||||
test third = "$(cat path2)" &&
|
||||
test $(git -C .. rev-parse HEAD) = $(git rev-parse HEAD)
|
||||
) &&
|
||||
|
||||
# Try pushing into a repository with working tree needing a refresh
|
||||
(
|
||||
cd testrepo &&
|
||||
git reset --hard HEAD^ &&
|
||||
test $(git -C .. rev-parse HEAD^) = $(git rev-parse HEAD) &&
|
||||
test-chmtime +100 path1
|
||||
) &&
|
||||
git push testrepo master &&
|
||||
(
|
||||
cd testrepo &&
|
||||
git update-index -q --refresh &&
|
||||
git diff-files --quiet -- &&
|
||||
git diff-index --quiet --cached HEAD -- &&
|
||||
test_cmp ../path1 path1 &&
|
||||
test third = "$(cat path2)" &&
|
||||
test $(git -C .. rev-parse HEAD) = $(git rev-parse HEAD)
|
||||
) &&
|
||||
|
||||
# Update what is to be pushed
|
||||
test_commit fourth path2 &&
|
||||
|
||||
# Try pushing into a repository with a dirty working tree
|
||||
# (1) the working tree updated
|
||||
(
|
||||
cd testrepo &&
|
||||
echo changed >path1
|
||||
) &&
|
||||
test_must_fail git push testrepo master &&
|
||||
test $(git rev-parse HEAD^) = $(git -C testrepo rev-parse HEAD) &&
|
||||
(cd testrepo &&
|
||||
(
|
||||
cd testrepo &&
|
||||
test $(git -C .. rev-parse HEAD^) = $(git rev-parse HEAD) &&
|
||||
git diff --quiet --cached &&
|
||||
test changed = "$(cat path1)"
|
||||
) &&
|
||||
|
||||
# (2) the index updated
|
||||
(
|
||||
cd testrepo &&
|
||||
echo changed >path1 &&
|
||||
git add path1
|
||||
) &&
|
||||
test_must_fail git push testrepo master &&
|
||||
(
|
||||
cd testrepo &&
|
||||
test $(git -C .. rev-parse HEAD^) = $(git rev-parse HEAD) &&
|
||||
git diff --quiet &&
|
||||
test changed = "$(cat path2)"
|
||||
test changed = "$(cat path1)"
|
||||
) &&
|
||||
|
||||
# Introduce a new file in the update
|
||||
test_commit fifth path3 &&
|
||||
|
||||
# (3) the working tree has an untracked file that would interfere
|
||||
(
|
||||
cd testrepo &&
|
||||
git reset --hard &&
|
||||
echo changed >path3
|
||||
) &&
|
||||
test_must_fail git push testrepo master &&
|
||||
(
|
||||
cd testrepo &&
|
||||
test $(git -C .. rev-parse HEAD^^) = $(git rev-parse HEAD) &&
|
||||
git diff --quiet &&
|
||||
git diff --quiet --cached &&
|
||||
test changed = "$(cat path3)"
|
||||
) &&
|
||||
|
||||
# (4) the target changes to what gets pushed but it still is a change
|
||||
(
|
||||
cd testrepo &&
|
||||
git reset --hard &&
|
||||
echo fifth >path3 &&
|
||||
git add path3
|
||||
) &&
|
||||
test_must_fail git push testrepo master &&
|
||||
(
|
||||
cd testrepo &&
|
||||
test $(git -C .. rev-parse HEAD^^) = $(git rev-parse HEAD) &&
|
||||
git diff --quiet &&
|
||||
test fifth = "$(cat path3)"
|
||||
)
|
||||
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user