match_explicit: hoist refspec lhs checks into their own function

In preparation for being able to check the left-hand side of
our push refspecs separately, this pulls the examination of
them out into its own function. There should be no behavior
change.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2014-03-05 14:03:21 -05:00 коммит произвёл Junio C Hamano
Родитель 5f95c9f850
Коммит f7ade3d36b
1 изменённых файлов: 30 добавлений и 19 удалений

Просмотреть файл

@ -1096,12 +1096,36 @@ static char *guess_ref(const char *name, struct ref *peer)
return strbuf_detach(&buf, NULL);
}
static int match_explicit_lhs(struct ref *src,
struct refspec *rs,
struct ref **match,
int *allocated_match)
{
switch (count_refspec_match(rs->src, src, match)) {
case 1:
*allocated_match = 0;
return 0;
case 0:
/* The source could be in the get_sha1() format
* not a reference name. :refs/other is a
* way to delete 'other' ref at the remote end.
*/
*match = try_explicit_object_name(rs->src);
if (!*match)
return error("src refspec %s does not match any.", rs->src);
*allocated_match = 1;
return 0;
default:
return error("src refspec %s matches more than one.", rs->src);
}
}
static int match_explicit(struct ref *src, struct ref *dst,
struct ref ***dst_tail,
struct refspec *rs)
{
struct ref *matched_src, *matched_dst;
int copy_src;
int allocated_src;
const char *dst_value = rs->dst;
char *dst_guess;
@ -1110,23 +1134,8 @@ static int match_explicit(struct ref *src, struct ref *dst,
return 0;
matched_src = matched_dst = NULL;
switch (count_refspec_match(rs->src, src, &matched_src)) {
case 1:
copy_src = 1;
break;
case 0:
/* The source could be in the get_sha1() format
* not a reference name. :refs/other is a
* way to delete 'other' ref at the remote end.
*/
matched_src = try_explicit_object_name(rs->src);
if (!matched_src)
return error("src refspec %s does not match any.", rs->src);
copy_src = 0;
break;
default:
return error("src refspec %s matches more than one.", rs->src);
}
if (match_explicit_lhs(src, rs, &matched_src, &allocated_src) < 0)
return -1;
if (!dst_value) {
unsigned char sha1[20];
@ -1171,7 +1180,9 @@ static int match_explicit(struct ref *src, struct ref *dst,
return error("dst ref %s receives from more than one src.",
matched_dst->name);
else {
matched_dst->peer_ref = copy_src ? copy_ref(matched_src) : matched_src;
matched_dst->peer_ref = allocated_src ?
matched_src :
copy_ref(matched_src);
matched_dst->force = rs->force;
}
return 0;