diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-11-30 17:54:30 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-11-30 17:54:30 -0800 |
commit | 4d7a5ceacc97e69c4ab5e1543f61fafafb963a9c (patch) | |
tree | 53321307e90232507fda8c3ba919b983b7bdc6d9 /t/t5516-fetch-push.sh | |
parent | 1404bcbb6b3bdb248d32024430644e55faec91ce (diff) | |
download | git-4d7a5ceacc97e69c4ab5e1543f61fafafb963a9c.tar.gz |
t5516: more tests for receive.denyCurrentBranch=updateInsteadjs/push-to-updatejs/push-to-deploy
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>
Diffstat (limited to 't/t5516-fetch-push.sh')
-rwxr-xr-x | t/t5516-fetch-push.sh | 96 |
1 files changed, 87 insertions, 9 deletions
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 7b353d0b85..85c7fecd22 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -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 -- && + 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 -- && - echo changed >path2 && - git add path2 + 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 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 changed = "$(cat path2)" + test fifth = "$(cat path3)" ) + ' test_done |