On Sat, 17 Nov 2007, Jeff King wrote: > This lets us show remote errors (e.g., a denied hook) along > with the usual push output. > > There is a slightly clever optimization in receive_status > that bears explanation. We need to correlate the returned > status and our ref objects, which naively could be an O(m*n) > operation. However, since the current implementation of > receive-pack returns the errors to us in the same order that > we sent them, we optimistically look for the next ref to be > looked up to come after the last one we have found. So it > should be an O(m+n) merge if the receive-pack behavior > holds, but we fall back to a correct but slower behavior if > it should change. > > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > builtin-send-pack.c | 51 +++++++++++++++++++++++++++++++++++++++----- > cache.h | 2 + > t/t5406-remote-rejects.sh | 24 +++++++++++++++++++++ > 3 files changed, 71 insertions(+), 6 deletions(-) > create mode 100755 t/t5406-remote-rejects.sh > > diff --git a/builtin-send-pack.c b/builtin-send-pack.c > index c7d07aa..bcf7143 100644 > --- a/builtin-send-pack.c > +++ b/builtin-send-pack.c > @@ -146,19 +146,43 @@ static void get_local_heads(void) > for_each_ref(one_local_ref, NULL); > } > > -static int receive_status(int in) > +static struct ref *set_ref_error(struct ref *refs, const char *line) > { > + struct ref *ref; > + > + for (ref = refs; ref; ref = ref->next) { > + const char *msg; > + if (prefixcmp(line, ref->name)) > + continue; > + msg = line + strlen(ref->name); > + if (*msg++ != ' ') > + continue; > + ref->status = REF_STATUS_REMOTE_REJECT; > + ref->error = xstrdup(msg); > + ref->error[strlen(ref->error)-1] = '\0'; > + return ref; > + } > + return NULL; > +} Maybe this should take both the full list and the hint and do both passes internally? IMHO, the logic in receive_status() looks like it might be setting the error twice or not at all, unless you read very carefully. But, regardless, Acked-by: Daniel Barkalow <barkalow@xxxxxxxxxxxx> -Daniel *This .sig left intentionally blank* - 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