git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 3/3] send-pack: assign remote errors to each ref

From
Daniel Barkalow <barkalow@iabervon.org>
Date
Nov 17, 2007, 18:05 UTC
Message-ID
<Pine.LNX.4.64.0711171258000.12193@iabervon.org>
In-Reply-To
<20071117125602.GC23186@sigill.intra.peff.net>
On Sat, 17 Nov 2007, Jeff King wrote:
Show 49 quoted lines
> 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@peff.net>
> ---
>  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@iabervon.org>
	-Daniel
*This .sig left intentionally blank*
Previous: Jeff KingNext: Jeff King
Message 15 of 20 in “tracking per-ref errors on push”
  1. 0/3 tracking per-ref errors on pushJeff King, Nov 17, 2007
  2. 1/3 send-pack: track errors for each refJeff King, Nov 17, 2007
  3. Alex RiesenNov 17, 2007
  4. Daniel BarkalowNov 17, 2007
  5. Jeff KingNov 18, 2007
  6. Junio C HamanoNov 18, 2007
  7. Jeff KingNov 18, 2007
  8. Junio C HamanoNov 17, 2007
  9. Jeff KingNov 18, 2007
  10. 2/3 send-pack: check ref->status before updating tracking refsJeff King, Nov 17, 2007
  11. Alex RiesenNov 17, 2007
  12. Jeff KingNov 17, 2007
  13. Daniel BarkalowNov 17, 2007
  14. 3/3 send-pack: assign remote errors to each refJeff King, Nov 17, 2007
  15. Daniel BarkalowNov 17, 2007
  16. Jeff KingNov 18, 2007
  17. Junio C HamanoNov 18, 2007
  18. Jeff KingNov 18, 2007
  19. Junio C HamanoNov 18, 2007
  20. Jeff KingNov 18, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.