From 1945237486851bc3a0c6d65eaeb21cb22cac2ea1 Mon Sep 17 00:00:00 2001 From: Tay Ray Chuan Date: Fri, 8 Jan 2010 10:12:40 +0800 Subject: t5541-http-push.sh: add tests for non-fast-forward pushes Signed-off-by: Tay Ray Chuan Signed-off-by: Junio C Hamano --- t/t5541-http-push.sh | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 't/t5541-http-push.sh') diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh index 2a58d0cc9c..f49c7c4178 100755 --- a/t/t5541-http-push.sh +++ b/t/t5541-http-push.sh @@ -88,5 +88,28 @@ test_expect_success 'used receive-pack service' ' test_cmp exp act ' +test_expect_success 'non-fast-forward push fails' ' + cd "$ROOT_PATH"/test_repo_clone && + git checkout master && + echo "changed" > path2 && + git commit -a -m path2 --amend && + + HEAD=$(git rev-parse --verify HEAD) && + !(git push -v origin >output 2>&1) && + (cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git && + test $HEAD != $(git rev-parse --verify HEAD)) +' + +test_expect_failure 'non-fast-forward push show ref status' ' + grep "^ ! \[rejected\][ ]*master -> master (non-fast-forward)$" output +' + +test_expect_failure 'non-fast-forward push shows help message' ' + grep \ +"To prevent you from losing history, non-fast-forward updates were rejected +Merge the remote changes before pushing again. See the '"'non-fast-forward'"' +section of '"'git push --help'"' for details." output +' + stop_httpd test_done -- cgit v1.2.3 From 7b69079be964ca0a09a1a7895455ba3df379984e Mon Sep 17 00:00:00 2001 From: Tay Ray Chuan Date: Fri, 8 Jan 2010 10:12:41 +0800 Subject: t5541-http-push.sh: add test for unmatched, non-fast-forwarded refs Some refs can only be matched to a remote ref with an explicit refspec. When such a ref is a non-fast-forward of its remote ref, test that pushing them (with the explicit refspec specified) fails with a non- fast-foward-type error (viz. printing of ref status and help message). Signed-off-by: Tay Ray Chuan Signed-off-by: Junio C Hamano --- t/t5541-http-push.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 't/t5541-http-push.sh') diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh index f49c7c4178..cc740fe124 100755 --- a/t/t5541-http-push.sh +++ b/t/t5541-http-push.sh @@ -111,5 +111,26 @@ Merge the remote changes before pushing again. See the '"'non-fast-forward'"' section of '"'git push --help'"' for details." output ' +test_expect_failure 'push fails for non-fast-forward refs unmatched by remote helper' ' + # create a dissimilarly-named remote ref so that git is unable to match the + # two refs (viz. local, remote) unless an explicit refspec is provided. + git push origin master:retsam + + echo "change changed" > path2 && + git commit -a -m path2 --amend && + + # push master too; this ensures there is at least one '"'push'"' command to + # the remote helper and triggers interaction with the helper. + !(git push -v origin +master master:retsam >output 2>&1) && + + grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *master -> master (forced update)$" output && + grep "^ ! \[rejected\] *master -> retsam (non-fast-forward)$" output && + + grep \ +"To prevent you from losing history, non-fast-forward updates were rejected +Merge the remote changes before pushing again. See the '"'non-fast-forward'"' +section of '"'git push --help'"' for details." output +' + stop_httpd test_done -- cgit v1.2.3 From 20e8b465a53e651cc3f50bd60f39d577ecdb7722 Mon Sep 17 00:00:00 2001 From: Tay Ray Chuan Date: Fri, 8 Jan 2010 10:12:42 +0800 Subject: refactor ref status logic for pushing Move the logic that detects up-to-date and non-fast-forward refs to a new function in remote.[ch], set_ref_status_for_push(). Make transport_push() invoke set_ref_status_for_push() before invoking the push_refs() implementation. (As a side-effect, the push_refs() implementation in transport-helper.c now knows of non-fast-forward pushes.) Removed logic for detecting up-to-date refs from the push_refs() implementation in transport-helper.c, as transport_push() has already done so for it. Make cmd_send_pack() invoke set_ref_status_for_push() before invoking send_pack(), as transport_push() can't do it for send_pack() here. Mark the test on the return status of non-fast-forward push to fail. Git now exits with success, as transport.c::transport_push() does not check for refs with status REF_STATUS_REJECT_NONFASTFORWARD nor does it indicate rejected pushes with its return value. Mark the test for ref status to succeed. As mentioned earlier, refs might be marked as non-fast-forwards, triggering the push status printing mechanism in transport.c. Signed-off-by: Tay Ray Chuan Signed-off-by: Junio C Hamano --- t/t5541-http-push.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 't/t5541-http-push.sh') diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh index cc740fe124..6d92196d24 100755 --- a/t/t5541-http-push.sh +++ b/t/t5541-http-push.sh @@ -88,7 +88,7 @@ test_expect_success 'used receive-pack service' ' test_cmp exp act ' -test_expect_success 'non-fast-forward push fails' ' +test_expect_failure 'non-fast-forward push fails' ' cd "$ROOT_PATH"/test_repo_clone && git checkout master && echo "changed" > path2 && @@ -100,7 +100,7 @@ test_expect_success 'non-fast-forward push fails' ' test $HEAD != $(git rev-parse --verify HEAD)) ' -test_expect_failure 'non-fast-forward push show ref status' ' +test_expect_success 'non-fast-forward push show ref status' ' grep "^ ! \[rejected\][ ]*master -> master (non-fast-forward)$" output ' -- cgit v1.2.3 From 4232826771d5bdc4cc0bd21188b6ee5f3e700a52 Mon Sep 17 00:00:00 2001 From: Tay Ray Chuan Date: Fri, 8 Jan 2010 10:12:43 +0800 Subject: transport.c::transport_push(): make ref status affect return value Use push_had_errors() to check the refs for errors and modify the return value. Mark the non-fast-forward push tests to succeed. Signed-off-by: Tay Ray Chuan Signed-off-by: Junio C Hamano --- t/t5541-http-push.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 't/t5541-http-push.sh') diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh index 6d92196d24..979624d0dc 100755 --- a/t/t5541-http-push.sh +++ b/t/t5541-http-push.sh @@ -88,7 +88,7 @@ test_expect_success 'used receive-pack service' ' test_cmp exp act ' -test_expect_failure 'non-fast-forward push fails' ' +test_expect_success 'non-fast-forward push fails' ' cd "$ROOT_PATH"/test_repo_clone && git checkout master && echo "changed" > path2 && @@ -104,7 +104,7 @@ test_expect_success 'non-fast-forward push show ref status' ' grep "^ ! \[rejected\][ ]*master -> master (non-fast-forward)$" output ' -test_expect_failure 'non-fast-forward push shows help message' ' +test_expect_success 'non-fast-forward push shows help message' ' grep \ "To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes before pushing again. See the '"'non-fast-forward'"' -- cgit v1.2.3 From 08d63a422ba7293119865e6cbbc3a34619be32f7 Mon Sep 17 00:00:00 2001 From: Tay Ray Chuan Date: Fri, 8 Jan 2010 10:12:44 +0800 Subject: transport-helper.c::push_refs(): ignore helper-reported status if ref is not to be pushed If the status of a ref is REF_STATUS_NONE, the remote helper will not be told to push the ref (via a 'push' command). However, the remote helper may still act on these refs. If the helper does act on the ref, and prints a status for it, ignore the report (ie. don't overwrite the status of the ref with it, nor the message in the remote_status member) if the reported status is 'no match'. This allows the user to be alerted to more "interesting" ref statuses, like REF_STATUS_NONFASTFORWARD. Cc: Jeff King Signed-off-by: Tay Ray Chuan Signed-off-by: Junio C Hamano --- t/t5541-http-push.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 't/t5541-http-push.sh') diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh index 979624d0dc..83a8e14c6c 100755 --- a/t/t5541-http-push.sh +++ b/t/t5541-http-push.sh @@ -111,7 +111,7 @@ Merge the remote changes before pushing again. See the '"'non-fast-forward'"' section of '"'git push --help'"' for details." output ' -test_expect_failure 'push fails for non-fast-forward refs unmatched by remote helper' ' +test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper' ' # create a dissimilarly-named remote ref so that git is unable to match the # two refs (viz. local, remote) unless an explicit refspec is provided. git push origin master:retsam -- cgit v1.2.3 From 9567f082ddc1f3143a153d0ecf59f3727ff0f7a5 Mon Sep 17 00:00:00 2001 From: Tay Ray Chuan Date: Mon, 25 Jan 2010 15:42:23 +0800 Subject: t5541-http-push: make grep expression check for one line only Don't feed a multiple-line pattern to grep and expect the them to match with lines in order. Simplify the grep expressions in the non-fast-forward tests to check only for the first line of the non-fast-forward warning - having that line should be enough assurance that the full warning is printed. Signed-off-by: Tay Ray Chuan Signed-off-by: Junio C Hamano --- t/t5541-http-push.sh | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 't/t5541-http-push.sh') diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh index 83a8e14c6c..53f54a2789 100755 --- a/t/t5541-http-push.sh +++ b/t/t5541-http-push.sh @@ -105,10 +105,8 @@ test_expect_success 'non-fast-forward push show ref status' ' ' test_expect_success 'non-fast-forward push shows help message' ' - grep \ -"To prevent you from losing history, non-fast-forward updates were rejected -Merge the remote changes before pushing again. See the '"'non-fast-forward'"' -section of '"'git push --help'"' for details." output + grep "To prevent you from losing history, non-fast-forward updates were rejected" \ + output ' test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper' ' @@ -126,10 +124,8 @@ test_expect_success 'push fails for non-fast-forward refs unmatched by remote he grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *master -> master (forced update)$" output && grep "^ ! \[rejected\] *master -> retsam (non-fast-forward)$" output && - grep \ -"To prevent you from losing history, non-fast-forward updates were rejected -Merge the remote changes before pushing again. See the '"'non-fast-forward'"' -section of '"'git push --help'"' for details." output + grep "To prevent you from losing history, non-fast-forward updates were rejected" \ + output ' stop_httpd -- cgit v1.2.3