From: Martin Koegler Date: Mon, 10 Nov 2008 21:47:11 GMT Subject: [PATCH] git push: Interpret $GIT_DIR/branches in a Cogito compatible way Message-ID: <1226353631-3716-1-git-send-email-mkoegler@auto.tuwien.ac.at> 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. Ignoring the part for push (fetch respects them) is unlogical. As branches origin from Cogito, it is the best to correct this by using the behaviour of cg-push: push HEAD to remote refs/heads/ Signed-off-by: Martin Koegler --- Documentation/urls-remotes.txt | 19 +++++++++++---- remote.c | 11 ++++++++ t/t5516-fetch-push.sh | 50 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/Documentation/urls-remotes.txt b/Documentation/urls-remotes.txt index 504ae8a..d9e284c 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 +refsprecs, 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 e530a21..660b2ce 100644 --- a/remote.c +++ b/remote.c @@ -297,6 +297,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 a6532cb..4426df9 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -523,4 +523,54 @@ test_expect_success 'allow push to HEAD of non-bare repository (config)' ' ! grep "warning.*this may cause confusion" stderr ' +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 -- 1.5.6.5