From 18afe101eb2c2f68ba58085515f592148128fba3 Mon Sep 17 00:00:00 2001 From: Martin Koegler Date: Mon, 10 Nov 2008 22:47:11 +0100 Subject: git push: Interpret $GIT_DIR/branches in a Cogito compatible way Current git versions ignore everything after # (called in the following) when pushing. Older versions (before cf818348f1ab57), interpret # as part of the URL, which make git bail out. As branches origin from Cogito, it is the best to correct this by using the behaviour of cg-push, that is to push HEAD to remote refs/heads/. Signed-off-by: Martin Koegler Signed-off-by: Junio C Hamano diff --git a/Documentation/urls-remotes.txt b/Documentation/urls-remotes.txt index 504ae8a..41ec777 100644 --- a/Documentation/urls-remotes.txt +++ b/Documentation/urls-remotes.txt @@ -68,13 +68,22 @@ This file should have the following format: ------------ `` is required; `#` is optional. -When you do not provide a refspec on the command line, -git will use the following refspec, where `` defaults to `master`, -and `` is the name of this file -you provided in the command line. + +Depending on the operation, git will use one of the following +refspecs, if you don't provide one on the command line. +`` is the name of this file in `$GIT_DIR/branches` and +`` defaults to `master`. + +git fetch uses: + +------------ + refs/heads/:refs/heads/ +------------ + +git push uses: ------------ - refs/heads/: + HEAD:refs/heads/ ------------ diff --git a/remote.c b/remote.c index 7688f3b..91f1b7c 100644 --- a/remote.c +++ b/remote.c @@ -298,6 +298,17 @@ static void read_branches_file(struct remote *remote) } add_url_alias(remote, p); add_fetch_refspec(remote, strbuf_detach(&branch, 0)); + /* + * Cogito compatible push: push current HEAD to remote #branch + * (master if missing) + */ + strbuf_init(&branch, 0); + strbuf_addstr(&branch, "HEAD"); + if (frag) + strbuf_addf(&branch, ":refs/heads/%s", frag); + else + strbuf_addstr(&branch, ":refs/heads/master"); + add_push_refspec(remote, strbuf_detach(&branch, 0)); remote->fetch_tags = 1; /* always auto-follow */ } diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 598664c..f9e8780 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -494,4 +494,54 @@ test_expect_success 'allow deleting an invalid remote ref' ' ' +test_expect_success 'fetch with branches' ' + mk_empty && + git branch second $the_first_commit && + git checkout second && + echo ".." > testrepo/.git/branches/branch1 && + (cd testrepo && + git fetch branch1 && + r=$(git show-ref -s --verify refs/heads/branch1) && + test "z$r" = "z$the_commit" && + test 1 = $(git for-each-ref refs/heads | wc -l) + ) && + git checkout master +' + +test_expect_success 'fetch with branches containing #' ' + mk_empty && + echo "..#second" > testrepo/.git/branches/branch2 && + (cd testrepo && + git fetch branch2 && + r=$(git show-ref -s --verify refs/heads/branch2) && + test "z$r" = "z$the_first_commit" && + test 1 = $(git for-each-ref refs/heads | wc -l) + ) && + git checkout master +' + +test_expect_success 'push with branches' ' + mk_empty && + git checkout second && + echo "testrepo" > .git/branches/branch1 && + git push branch1 && + (cd testrepo && + r=$(git show-ref -s --verify refs/heads/master) && + test "z$r" = "z$the_first_commit" && + test 1 = $(git for-each-ref refs/heads | wc -l) + ) +' + +test_expect_success 'push with branches containing #' ' + mk_empty && + echo "testrepo#branch3" > .git/branches/branch2 && + git push branch2 && + (cd testrepo && + r=$(git show-ref -s --verify refs/heads/branch3) && + test "z$r" = "z$the_first_commit" && + test 1 = $(git for-each-ref refs/heads | wc -l) + ) && + git checkout master +' + test_done -- cgit v0.10.2-6-g49f6