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>maint
parent
1404bcbb6b
commit
4d7a5ceacc
|
@ -1332,28 +1332,106 @@ test_expect_success 'fetch into bare respects core.logallrefupdates' '
|
||||||
|
|
||||||
test_expect_success 'receive.denyCurrentBranch = updateInstead' '
|
test_expect_success 'receive.denyCurrentBranch = updateInstead' '
|
||||||
git push testrepo master &&
|
git push testrepo master &&
|
||||||
(cd testrepo &&
|
(
|
||||||
|
cd testrepo &&
|
||||||
git reset --hard &&
|
git reset --hard &&
|
||||||
git config receive.denyCurrentBranch updateInstead
|
git config receive.denyCurrentBranch updateInstead
|
||||||
) &&
|
) &&
|
||||||
test_commit third path2 &&
|
test_commit third path2 &&
|
||||||
|
|
||||||
|
# Try pushing into a repository with pristine working tree
|
||||||
git push testrepo master &&
|
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 update-index -q --refresh &&
|
||||||
git diff-files --quiet -- &&
|
git diff-files --quiet -- &&
|
||||||
git diff-index --quiet --cached HEAD -- &&
|
git diff-index --quiet --cached HEAD -- &&
|
||||||
echo changed >path2 &&
|
test third = "$(cat path2)" &&
|
||||||
git add 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 &&
|
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_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 &&
|
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
|
test_done
|
||||||
|
|
Loading…
Reference in New Issue