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]);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
10
remote.c
10
remote.c
@ -730,9 +730,17 @@ static int match_explicit(struct ref *src, struct ref *dst,
|
||||
errs = 1;
|
||||
|
||||
if (!dst_value) {
|
||||
unsigned char sha1[20];
|
||||
int flag;
|
||||
|
||||
if (!matched_src)
|
||||
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)) {
|
||||
|
@ -302,6 +302,49 @@ test_expect_success 'push with HEAD nonexisting at remote' '
|
||||
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' '
|
||||
|
||||
mk_test heads/master &&
|
||||
|
Loading…
Reference in New Issue
Block a user