Merge branch 'db/push-single-with-HEAD'

* db/push-single-with-HEAD:
  Resolve value supplied for no-colon push refspecs
This commit is contained in:
Junio C Hamano 2008-02-27 11:54:28 -08:00
commit 2f8e2e3eef
3 changed files with 52 additions and 10 deletions

View File

@ -44,15 +44,6 @@ static void set_refspecs(const char **refs, int nr)
strcat(tag, refs[i]); strcat(tag, refs[i]);
ref = tag; 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 (prefixcmp(ref, "refs/heads/"))
die("HEAD cannot be resolved to branch.");
ref = xstrdup(ref + 11);
}
add_refspec(ref); add_refspec(ref);
} }
} }

View File

@ -730,9 +730,17 @@ static int match_explicit(struct ref *src, struct ref *dst,
errs = 1; errs = 1;
if (!dst_value) { if (!dst_value) {
unsigned char sha1[20];
int flag;
if (!matched_src) if (!matched_src)
return errs; return errs;
dst_value = matched_src->name; dst_value = resolve_ref(matched_src->name, sha1, 1, &flag);
if (!dst_value ||
((flag & REF_ISSYMREF) &&
prefixcmp(dst_value, "refs/heads/")))
die("%s cannot be resolved to branch.",
matched_src->name);
} }
switch (count_refspec_match(dst_value, dst, &matched_dst)) { switch (count_refspec_match(dst_value, dst, &matched_dst)) {

View File

@ -302,6 +302,49 @@ test_expect_success 'push with HEAD nonexisting at remote' '
check_push_result $the_commit heads/local check_push_result $the_commit heads/local
' '
test_expect_success 'push with +HEAD' '
mk_test heads/master &&
git checkout master &&
git branch -D local &&
git checkout -b local &&
git push testrepo master local &&
check_push_result $the_commit heads/master &&
check_push_result $the_commit heads/local &&
# Without force rewinding should fail
git reset --hard HEAD^ &&
! git push testrepo HEAD &&
check_push_result $the_commit heads/local &&
# With force rewinding should succeed
git push testrepo +HEAD &&
check_push_result $the_first_commit heads/local
'
test_expect_success 'push with config remote.*.push = HEAD' '
mk_test heads/local &&
git checkout master &&
git branch -f local $the_commit &&
(
cd testrepo &&
git checkout local &&
git reset --hard $the_first_commit
) &&
git config remote.there.url testrepo &&
git config remote.there.push HEAD &&
git config branch.master.remote there &&
git push &&
check_push_result $the_commit heads/master &&
check_push_result $the_first_commit heads/local
'
# clean up the cruft left with the previous one
git config --remove-section remote.there
git config --remove-section branch.master
test_expect_success 'push with dry-run' ' test_expect_success 'push with dry-run' '
mk_test heads/master && mk_test heads/master &&