Merge branch 'fc/atmark-in-refspec'

"@" sometimes worked (e.g. "git push origin @:there") as a part of
a refspec element, but "git push origin @" did not work, which has
been corrected.

* fc/atmark-in-refspec:
  refspec: make @ a synonym of HEAD
  tests: push: trivial cleanup
  tests: push: improve cleanup of HEAD tests
maint
Junio C Hamano 2020-12-14 10:21:36 -08:00
commit c59b73bef3
3 changed files with 62 additions and 51 deletions

View File

@ -71,7 +71,10 @@ static int parse_refspec(struct refspec_item *item, const char *refspec, int fet
} }


item->pattern = is_glob; item->pattern = is_glob;
item->src = xstrndup(lhs, llen); if (llen == 1 && *lhs == '@')
item->src = xstrdup("HEAD");
else
item->src = xstrndup(lhs, llen);
flags = REFNAME_ALLOW_ONELEVEL | (is_glob ? REFNAME_REFSPEC_PATTERN : 0); flags = REFNAME_ALLOW_ONELEVEL | (is_glob ? REFNAME_REFSPEC_PATTERN : 0);


if (item->negative) { if (item->negative) {

View File

@ -58,6 +58,8 @@ test_refspec fetch 'HEAD~4:refs/remotes/frotz/new' invalid


test_refspec push 'HEAD' test_refspec push 'HEAD'
test_refspec fetch 'HEAD' test_refspec fetch 'HEAD'
test_refspec push '@'
test_refspec fetch '@'
test_refspec push 'refs/heads/ nitfol' invalid test_refspec push 'refs/heads/ nitfol' invalid
test_refspec fetch 'refs/heads/ nitfol' invalid test_refspec fetch 'refs/heads/ nitfol' invalid



View File

@ -436,70 +436,76 @@ test_expect_success 'push ref expression with non-existent, incomplete dest' '


' '


test_expect_success 'push with HEAD' ' for head in HEAD @
do


mk_test testrepo heads/master && test_expect_success "push with $head" '
git checkout master &&
git push testrepo HEAD &&
check_push_result testrepo $the_commit heads/master


' mk_test testrepo heads/master &&
git checkout master &&
git push testrepo $head &&
check_push_result testrepo $the_commit heads/master


test_expect_success 'push with HEAD nonexisting at remote' ' '


mk_test testrepo heads/master && test_expect_success "push with $head nonexisting at remote" '
git checkout -b local master &&
git push testrepo HEAD &&
check_push_result testrepo $the_commit heads/local
'


test_expect_success 'push with +HEAD' ' mk_test testrepo heads/master &&
git checkout -b local master &&
test_when_finished "git checkout master; git branch -D local" &&
git push testrepo $head &&
check_push_result testrepo $the_commit heads/local
'


mk_test testrepo heads/master && test_expect_success "push with +$head" '
git checkout master &&
git branch -D local &&
git checkout -b local &&
git push testrepo master local &&
check_push_result testrepo $the_commit heads/master &&
check_push_result testrepo $the_commit heads/local &&


# Without force rewinding should fail mk_test testrepo heads/master &&
git reset --hard HEAD^ && git checkout -b local master &&
test_must_fail git push testrepo HEAD && test_when_finished "git checkout master; git branch -D local" &&
check_push_result testrepo $the_commit heads/local && git push testrepo master local &&
check_push_result testrepo $the_commit heads/master &&
check_push_result testrepo $the_commit heads/local &&


# With force rewinding should succeed # Without force rewinding should fail
git push testrepo +HEAD && git reset --hard $head^ &&
check_push_result testrepo $the_first_commit heads/local test_must_fail git push testrepo $head &&
check_push_result testrepo $the_commit heads/local &&


' # With force rewinding should succeed
git push testrepo +$head &&
check_push_result testrepo $the_first_commit heads/local


test_expect_success 'push HEAD with non-existent, incomplete dest' ' '


mk_test testrepo && test_expect_success "push $head with non-existent, incomplete dest" '
git checkout master &&
git push testrepo HEAD:branch &&
check_push_result testrepo $the_commit heads/branch


' mk_test testrepo &&
git checkout master &&
git push testrepo $head:branch &&
check_push_result testrepo $the_commit heads/branch


test_expect_success 'push with config remote.*.push = HEAD' ' '


mk_test testrepo heads/local && test_expect_success "push with config remote.*.push = $head" '
git checkout master &&
git branch -f local $the_commit && mk_test testrepo heads/local &&
( git checkout master &&
cd testrepo && git branch -f local $the_commit &&
git checkout local && test_when_finished "git branch -D local" &&
git reset --hard $the_first_commit (
) && cd testrepo &&
test_config remote.there.url testrepo && git checkout local &&
test_config remote.there.push HEAD && git reset --hard $the_first_commit
test_config branch.master.remote there && ) &&
git push && test_config remote.there.url testrepo &&
check_push_result testrepo $the_commit heads/master && test_config remote.there.push $head &&
check_push_result testrepo $the_first_commit heads/local test_config branch.master.remote there &&
' git push &&
check_push_result testrepo $the_commit heads/master &&
check_push_result testrepo $the_first_commit heads/local
'

done


test_expect_success 'push with remote.pushdefault' ' test_expect_success 'push with remote.pushdefault' '
mk_test up_repo heads/master && mk_test up_repo heads/master &&