From: Steffen Prohaska Date: Sun, 28 Oct 2007 17:46:14 GMT Subject: [PATCH 03/10] push: support pushing HEAD to real branch name Message-ID: <1193593581486-git-send-email-prohaska@zib.de> In-Reply-To: <1193593581114-git-send-email-prohaska@zib.de> This teaches "push HEAD" to resolve HEAD on the local side to its real branch name, e.g. master, and then act as if the real branch name was specified. So we have a shorthand for pushing the current branch. Besides HEAD, no other symbolic ref is resolved. Thanks to Daniel Barkalow for suggesting this implementation, which is much simpler than the implementation proposed before. Signed-off-by: Steffen Prohaska --- builtin-push.c | 9 +++++++++ t/t5516-fetch-push.sh | 31 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 0 deletions(-) diff --git a/builtin-push.c b/builtin-push.c index 4ab1401..2e3c8c6 100644 --- a/builtin-push.c +++ b/builtin-push.c @@ -40,6 +40,15 @@ static void set_refspecs(const char **refs, int nr) strcat(tag, refs[i]); ref = tag; } + if (!strcmp("HEAD", ref)) { + unsigned char sha1_dummy[20]; + ref = resolve_ref(ref, sha1_dummy, 1, NULL); + if (!ref) + die("HEAD cannot be resolved."); + if (strncmp(ref, "refs/heads/", 11)) + die("HEAD cannot be resolved to branch."); + ref = xstrdup(ref + 11); + } add_refspec(ref); } } diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 42ca0ff..8becaf8 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -282,6 +282,37 @@ test_expect_success 'push with colon-less refspec (4)' ' ' +test_expect_success 'push with HEAD' ' + + mk_test heads/master && + git checkout master && + git push testrepo HEAD && + check_push_result $the_commit heads/master + +' + +test_expect_success 'push with HEAD (--create)' ' + + mk_test && + git checkout master && + git push --create testrepo HEAD && + check_push_result $the_commit heads/master + +' + +test_expect_success 'push with HEAD nonexisting at remote' ' + + mk_test heads/master && + git checkout -b local master && + if git push testrepo HEAD + then + echo "Oops, should have failed" + false + else + check_push_result $the_first_commit heads/master + fi +' + test_expect_success 'push with dry-run' ' mk_test heads/master && -- 1.5.3.4.439.ge8b49