git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Pierre Habouzit <madcoder@debian.org>,
	Daniel Barkalow <barkalow@iabervon.org>,
	Alex Riesen <raa.lkml@gmail.com>
Subject: Re: [PATCH v2 3/3] send-pack: assign remote errors to each ref
Date: Wed, 14 Nov 2007 23:47:16 -0500	[thread overview]
Message-ID: <20071115044715.GB9794@sigill.intra.peff.net> (raw)
In-Reply-To: <7vbq9xpprg.fsf@gitster.siamese.dyndns.org>

On Tue, Nov 13, 2007 at 05:41:39PM -0800, Junio C Hamano wrote:

> Is it really "arbitrary msg", or just a fixed set of strings?

It is for a fixed version of the remote receive-pack, but I don't want
to start relying on that.

> Also I think we can rely on the order report-status extension
> reports the per-ref result.  It gives back the information the
> same order send-pack side supplies the head information, no?

I considered that, but I didn't want to rely on it without your say-so.
We could also just use it as a hint to boost performance. I.e., track
the last match, and start our linear search there, but if we fail, drop
back to searching the whole list. Something like (on top of my other
patch):

diff --git a/builtin-send-pack.c b/builtin-send-pack.c
index 7d466d9..8e9580a 100644
--- a/builtin-send-pack.c
+++ b/builtin-send-pack.c
@@ -146,7 +146,8 @@ static void get_local_heads(void)
 	for_each_ref(one_local_ref, NULL);
 }
 
-static void set_ref_error(struct ref *refs, const char *line) {
+static struct ref *set_ref_error(struct ref *refs, const char *line)
+{
 	struct ref *ref;
 
 	for (ref = refs; ref; ref = ref->next) {
@@ -159,8 +160,9 @@ static void set_ref_error(struct ref *refs, const char *line) {
 		ref->status = REF_STATUS_REMOTE_REJECT;
 		ref->error = xstrdup(msg);
 		ref->error[strlen(ref->error)-1] = '\0';
-		return;
+		return ref;
 	}
+	return NULL;
 }
 
 /* a return value of -1 indicates that an error occurred,
@@ -168,6 +170,7 @@ static void set_ref_error(struct ref *refs, const char *line) {
  * value of -2 means we couldn't even get that far. */
 static int receive_status(int in, struct ref *refs)
 {
+	struct ref *hint;
 	char line[1000];
 	int ret = 0;
 	int len = packet_read_line(in, line, sizeof(line));
@@ -179,6 +182,7 @@ static int receive_status(int in, struct ref *refs)
 		fputs(line, stderr);
 		ret = -1;
 	}
+	hint = NULL;
 	while (1) {
 		len = packet_read_line(in, line, sizeof(line));
 		if (!len)
@@ -191,7 +195,10 @@ static int receive_status(int in, struct ref *refs)
 		}
 		if (!memcmp(line, "ok", 2))
 			continue;
-		set_ref_error(refs, line + 3);
+		if (hint)
+			hint = set_ref_error(hint, line + 3);
+		if (!hint)
+			hint = set_ref_error(refs, line + 3);
 		ret = -1;
 	}
 	return ret;

      parent reply	other threads:[~2007-11-15  4:47 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-13 10:25 [RFC/PATCH 0/3] tracking per-ref errors on push Jeff King
2007-11-13 10:27 ` [PATCH/RFC 1/3] send-pack: track errors for each ref Jeff King
2007-11-13 11:32   ` Jeff King
2007-11-13 19:04   ` Alex Riesen
2007-11-13 22:30     ` Jeff King
2007-11-13 20:18   ` Alex Riesen
2007-11-13 10:27 ` [PATCH/RFC 2/3] send-pack: check ref->status before updating tracking refs Jeff King
2007-11-13 10:29 ` [PATCH/RFC 3/3] send-pack: assign remote errors to each ref Jeff King
2007-11-13 10:29   ` Jeff King
2007-11-13 11:34 ` [RFC/PATCH 0/3] tracking per-ref errors on push Jeff King
2007-11-13 11:36 ` [PATCH v2 1/3] send-pack: track errors for each ref Jeff King
2007-11-13 11:36 ` [PATCH v2 2/3] send-pack: check ref->status before updating tracking refs Jeff King
2007-11-13 11:37 ` [PATCH v2 3/3] send-pack: assign remote errors to each ref Jeff King
2007-11-14  1:41   ` Junio C Hamano
2007-11-14  1:56     ` Junio C Hamano
2007-11-14  2:01     ` Johannes Schindelin
2007-11-14  6:12       ` Junio C Hamano
2007-11-15  4:54       ` Jeff King
2007-11-16  5:05         ` Junio C Hamano
2007-11-15  4:47     ` Jeff King [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20071115044715.GB9794@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=barkalow@iabervon.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=madcoder@debian.org \
    --cc=raa.lkml@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).