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:
commit
2f8e2e3eef
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
remote.c
10
remote.c
@ -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)) {
|
||||||
|
@ -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 &&
|
||||||
|
Loading…
Reference in New Issue
Block a user