Cluster the errors regarding ancestry violation and output them in one batch, together with a hint to pull before pushing. Signed-off-by: Alex Riesen <raa.lkml@xxxxxxxxx> --- Catching trend... send-pack.c | 33 ++++++++++++++++++++++----------- 1 files changed, 22 insertions(+), 11 deletions(-) diff --git a/send-pack.c b/send-pack.c index d56d980..e6da567 100644 --- a/send-pack.c +++ b/send-pack.c @@ -215,6 +215,7 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha int ask_for_status_report = 0; int allow_deleting_refs = 0; int expect_status_report = 0; + struct ref *failed_refs = NULL, **failed_tail = &failed_refs; /* No funny business with the matcher */ remote_tail = get_remote_heads(in, &remote_refs, 0, NULL, REF_NORMAL); @@ -243,25 +244,27 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha * Finally, tell the other end! */ new_refs = 0; - for (ref = remote_refs; ref; ref = ref->next) { + ref = remote_refs; + remote_refs = NULL; + remote_tail = &remote_refs; + for (; ref; ref = ref->next) { char old_hex[60], *new_hex; int will_delete_ref; if (!ref->peer_ref) - continue; - + goto remote_ok; will_delete_ref = is_null_sha1(ref->peer_ref->new_sha1); if (will_delete_ref && !allow_deleting_refs) { error("remote does not support deleting refs"); ret = -2; - continue; + goto remote_ok; } if (!will_delete_ref && !hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) { if (verbose) fprintf(stderr, "'%s': up-to-date\n", ref->name); - continue; + goto remote_ok; } /* This part determines what can overwrite what. @@ -297,13 +300,9 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha * commits at the remote end and likely * we were not up to date to begin with. */ - error("remote '%s' is not an ancestor of\n" - " local '%s'.\n" - " Maybe you are not up-to-date and " - "need to pull first?", - ref->name, - ref->peer_ref->name); ret = -2; + *failed_tail = ref; + failed_tail = &ref->next; continue; } } @@ -335,6 +334,18 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha fprintf(stderr, "\n from %s\n to %s\n", old_hex, new_hex); } + remote_ok: + *remote_tail = ref; + remote_tail = &ref->next; + } + *remote_tail = NULL; + *failed_tail = NULL; + + if (failed_refs) { + for (ref = failed_refs; ref; ref = ref->next) + error("remote '%s' is not an ancestor of local '%s'", + ref->name, ref->peer_ref->name); + fprintf(stderr, "Maybe you are not up-to-date and need to pull first?\n"); } packet_flush(out); -- 1.5.3.5.648.g1e92c - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html