Skip to content

Commit

Permalink
git push: Interpret $GIT_DIR/branches in a Cogito compatible way
Browse files Browse the repository at this point in the history
Current git versions ignore everything after # (called <head> in the
following) when pushing. Older versions (before cf81834),
interpret #<head> 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/<head>.

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Martin Koegler authored and Junio C Hamano committed Nov 11, 2008
1 parent 9db56f7 commit 18afe10
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 5 deletions.
19 changes: 14 additions & 5 deletions Documentation/urls-remotes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,22 @@ This file should have the following format:
------------

`<url>` is required; `#<head>` is optional.
When you do not provide a refspec on the command line,
git will use the following refspec, where `<head>` defaults to `master`,
and `<repository>` 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.
`<branch>` is the name of this file in `$GIT_DIR/branches` and
`<head>` defaults to `master`.

git fetch uses:

------------
refs/heads/<head>:refs/heads/<branch>
------------

git push uses:

------------
refs/heads/<head>:<repository>
HEAD:refs/heads/<head>
------------


Expand Down
11 changes: 11 additions & 0 deletions remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
}

Expand Down
50 changes: 50 additions & 0 deletions t/t5516-fetch-push.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 18afe10

Please sign in to comment.