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; - 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