# [PATCH] Beautify the output of send-pack a bit

2 messages from 2007-11-12 to 2007-11-13. Participants: Alex Riesen, Jeff King.
Thread: https://gitlist.dev/t/10840

## Alex Riesen, 2007-11-12 22:11

Subject: [PATCH] Beautify the output of send-pack a bit
Message-ID: <20071112221140.GD2918@steel.home>
URL: https://gitlist.dev/e/20071112221140.GD2918%40steel.home

```
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@gmail.com>
---

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

```

## Jeff King, 2007-11-13 07:55

Subject: Re: [PATCH] Beautify the output of send-pack a bit
Message-ID: <20071113075523.GB21799@sigill.intra.peff.net>
URL: https://gitlist.dev/e/20071113075523.GB21799%40sigill.intra.peff.net
In-Reply-To: <20071112221140.GD2918@steel.home>

```
On Mon, Nov 12, 2007 at 11:11:40PM +0100, Alex Riesen wrote:

> Cluster the errors regarding ancestry violation and output them
> in one batch, together with a hint to pull before pushing.

I think this is a good direction, but I think it might be simpler if
just record error information for each ref as we go, and then dump all
of them at the end. That will let us add remote-generated error
information easily.

-Peff

```
