Skip to content

Commit d2e73c6

Browse files
SRabbeliergitster
authored andcommitted
transport-helper: factor out push_update_refs_status
The update ref status part of push is useful for the export command as well, factor it out into it's own function. Also factor out push_update_ref_status to avoid a long loop without an explicit condition with a non-trivial body. Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com> Acked-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 82670a5 commit d2e73c6

File tree

1 file changed

+84
-69
lines changed

1 file changed

+84
-69
lines changed

transport-helper.c

Lines changed: 84 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,88 @@ static int fetch(struct transport *transport,
559559
return -1;
560560
}
561561

562+
static void push_update_ref_status(struct strbuf *buf,
563+
struct ref **ref,
564+
struct ref *remote_refs)
565+
{
566+
char *refname, *msg;
567+
int status;
568+
569+
if (!prefixcmp(buf->buf, "ok ")) {
570+
status = REF_STATUS_OK;
571+
refname = buf->buf + 3;
572+
} else if (!prefixcmp(buf->buf, "error ")) {
573+
status = REF_STATUS_REMOTE_REJECT;
574+
refname = buf->buf + 6;
575+
} else
576+
die("expected ok/error, helper said '%s'\n", buf->buf);
577+
578+
msg = strchr(refname, ' ');
579+
if (msg) {
580+
struct strbuf msg_buf = STRBUF_INIT;
581+
const char *end;
582+
583+
*msg++ = '\0';
584+
if (!unquote_c_style(&msg_buf, msg, &end))
585+
msg = strbuf_detach(&msg_buf, NULL);
586+
else
587+
msg = xstrdup(msg);
588+
strbuf_release(&msg_buf);
589+
590+
if (!strcmp(msg, "no match")) {
591+
status = REF_STATUS_NONE;
592+
free(msg);
593+
msg = NULL;
594+
}
595+
else if (!strcmp(msg, "up to date")) {
596+
status = REF_STATUS_UPTODATE;
597+
free(msg);
598+
msg = NULL;
599+
}
600+
else if (!strcmp(msg, "non-fast forward")) {
601+
status = REF_STATUS_REJECT_NONFASTFORWARD;
602+
free(msg);
603+
msg = NULL;
604+
}
605+
}
606+
607+
if (*ref)
608+
*ref = find_ref_by_name(*ref, refname);
609+
if (!*ref)
610+
*ref = find_ref_by_name(remote_refs, refname);
611+
if (!*ref) {
612+
warning("helper reported unexpected status of %s", refname);
613+
return;
614+
}
615+
616+
if ((*ref)->status != REF_STATUS_NONE) {
617+
/*
618+
* Earlier, the ref was marked not to be pushed, so ignore the ref
619+
* status reported by the remote helper if the latter is 'no match'.
620+
*/
621+
if (status == REF_STATUS_NONE)
622+
return;
623+
}
624+
625+
(*ref)->status = status;
626+
(*ref)->remote_status = msg;
627+
}
628+
629+
static void push_update_refs_status(struct helper_data *data,
630+
struct ref *remote_refs)
631+
{
632+
struct strbuf buf = STRBUF_INIT;
633+
struct ref *ref = remote_refs;
634+
for (;;) {
635+
recvline(data, &buf);
636+
if (!buf.len)
637+
break;
638+
639+
push_update_ref_status(&buf, &ref, remote_refs);
640+
}
641+
strbuf_release(&buf);
642+
}
643+
562644
static int push_refs_with_push(struct transport *transport,
563645
struct ref *remote_refs, int flags)
564646
{
@@ -613,76 +695,9 @@ static int push_refs_with_push(struct transport *transport,
613695

614696
strbuf_addch(&buf, '\n');
615697
sendline(data, &buf);
616-
617-
ref = remote_refs;
618-
while (1) {
619-
char *refname, *msg;
620-
int status;
621-
622-
recvline(data, &buf);
623-
if (!buf.len)
624-
break;
625-
626-
if (!prefixcmp(buf.buf, "ok ")) {
627-
status = REF_STATUS_OK;
628-
refname = buf.buf + 3;
629-
} else if (!prefixcmp(buf.buf, "error ")) {
630-
status = REF_STATUS_REMOTE_REJECT;
631-
refname = buf.buf + 6;
632-
} else
633-
die("expected ok/error, helper said '%s'\n", buf.buf);
634-
635-
msg = strchr(refname, ' ');
636-
if (msg) {
637-
struct strbuf msg_buf = STRBUF_INIT;
638-
const char *end;
639-
640-
*msg++ = '\0';
641-
if (!unquote_c_style(&msg_buf, msg, &end))
642-
msg = strbuf_detach(&msg_buf, NULL);
643-
else
644-
msg = xstrdup(msg);
645-
strbuf_release(&msg_buf);
646-
647-
if (!strcmp(msg, "no match")) {
648-
status = REF_STATUS_NONE;
649-
free(msg);
650-
msg = NULL;
651-
}
652-
else if (!strcmp(msg, "up to date")) {
653-
status = REF_STATUS_UPTODATE;
654-
free(msg);
655-
msg = NULL;
656-
}
657-
else if (!strcmp(msg, "non-fast forward")) {
658-
status = REF_STATUS_REJECT_NONFASTFORWARD;
659-
free(msg);
660-
msg = NULL;
661-
}
662-
}
663-
664-
if (ref)
665-
ref = find_ref_by_name(ref, refname);
666-
if (!ref)
667-
ref = find_ref_by_name(remote_refs, refname);
668-
if (!ref) {
669-
warning("helper reported unexpected status of %s", refname);
670-
continue;
671-
}
672-
673-
if (ref->status != REF_STATUS_NONE) {
674-
/*
675-
* Earlier, the ref was marked not to be pushed, so ignore the ref
676-
* status reported by the remote helper if the latter is 'no match'.
677-
*/
678-
if (status == REF_STATUS_NONE)
679-
continue;
680-
}
681-
682-
ref->status = status;
683-
ref->remote_status = msg;
684-
}
685698
strbuf_release(&buf);
699+
700+
push_update_refs_status(data, remote_refs);
686701
return 0;
687702
}
688703

0 commit comments

Comments
 (0)