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

Re: git-clone --config order & fetching extra refs during initial clone

From
Jeff King <peff@peff.net>
Date
Feb 27, 2017, 21:12 UTC
Message-ID
<20170227211217.73gydlxb2qu2sp3m@sigill.intra.peff.net>
In-Reply-To
<xmqqd1e3xx4c.fsf@gitster.mtv.corp.google.com>
On Mon, Feb 27, 2017 at 11:16:35AM -0800, Junio C Hamano wrote:
Show 14 quoted lines
> >> TL;DR: git-clone ignores any fetch specs passed via --config.
> >
> > I agree that this is a bug. There's some previous discussion and an RFC
> > patch from lat March (author cc'd):
> >
> >   http://public-inbox.org/git/1457313062-10073-1-git-send-email-szeder@ira.uka.de/
> >
> > That discussion veered off into alternatives, but I think the v2 posted
> > in that thread is taking a sane approach.
> 
> Let's see how well it fares by cooking it in 'next' ;-) 
> 
> I think it was <1459349623-16443-1-git-send-email-szeder@ira.uka.de>,
> which needs a bit of massaging to apply to the current codebase.
Yeah, that is the most recent one I found.

I didn't actually review it very carefully before, but I'll do so now (spoiler: a few nits, but it looks fine).

>  static struct ref *wanted_peer_refs(const struct ref *refs,
> -		struct refspec *refspec)
> +		struct refspec *refspec, unsigned int refspec_count)

Most of the changes here and elsewhere are just about passing along multiple refspecs instead of a single, which makes sense.

Show 8 quoted lines
> @@ -856,7 +861,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
>  	int submodule_progress;
>  
>  	struct refspec *refspec;
> -	const char *fetch_pattern;
> +	unsigned int refspec_count = 1;
> +	const char **fetch_patterns;
> +	const struct string_list *config_fetch_patterns;

This "1" seems funny to up here by itself, as it must be kept in sync with the later logic that feeds exactly one non-configured refspec into our list. The current code isn't wrong, but it would be nice to have it all together. I.e., replacing:

> +	if (config_fetch_patterns)
> +		refspec_count = 1 + config_fetch_patterns->nr;
> +	fetch_patterns = xcalloc(refspec_count, sizeof(*fetch_patterns));
> +	fetch_patterns[0] = value.buf;
with:
  refspec_count = 1;
  if (config_fetch_patterns)
	refspec_count += config_fetch_patterns->nr;
  ...

Though if I'm bikeshedding, I'd probably have written the whole thing with an argv_array and avoided counting at all.

Show 6 quoted lines
> +	refspec = parse_fetch_refspec(refspec_count, fetch_patterns);
>  
> +	strbuf_reset(&key);
>  	strbuf_reset(&value);
>  
>  	remote = remote_get(option_origin);

I do also notice that right _after_ this parsing, we use remote_get(), which is supposed to give us this config anyway. Which makes me wonder if we could just reorder this to put remote_get() first, and then read the resulting refspecs from remote->fetch.

Show 31 quoted lines
> diff --git a/t/t5611-clone-config.sh b/t/t5611-clone-config.sh
> index e4850b778c..3bed17783b 100755
> --- a/t/t5611-clone-config.sh
> +++ b/t/t5611-clone-config.sh
> @@ -37,6 +37,30 @@ test_expect_success 'clone -c config is available during clone' '
>  	test_cmp expect child/file
>  '
>  
> +test_expect_success 'clone -c remote.origin.fetch=<refspec> works' '
> +	rm -rf child &&
> +	git update-ref refs/grab/it refs/heads/master &&
> +	git update-ref refs/keep/out refs/heads/master &&
> +	git clone -c "remote.origin.fetch=+refs/grab/*:refs/grab/*" . child &&
> +	(
> +		cd child &&
> +		git for-each-ref --format="%(refname)" refs/grab/ >../actual
> +	) &&
> +	echo refs/grab/it >expect &&
> +	test_cmp expect actual
> +'
> +
> +test_expect_success 'git -c remote.origin.fetch=<refspec> clone works' '
> +	rm -rf child &&
> +	git -c "remote.origin.fetch=+refs/grab/*:refs/grab/*" clone . child &&
> +	(
> +		cd child &&
> +		git for-each-ref --format="%(refname)" refs/grab/ >../actual
> +	) &&
> +	echo refs/grab/it >expect &&
> +	test_cmp expect actual
> +'

These look reasonable. Using "git -C for-each-ref" would save a subshell, but that's minor.

If we wanted to be thorough, we could also check that the feature works correctly with "--origin" (I think it does).

-Peff
Previous: Junio C HamanoNext: SZEDER Gábor
Message 5 of 15 in “git-clone --config order & fetching extra refs during initial clone”
  1. Robin H. JohnsonFeb 25, 2017
  2. Jeff KingFeb 25, 2017
  3. Jeff KingFeb 25, 2017
  4. Junio C HamanoFeb 27, 2017
  5. Jeff KingFeb 27, 2017
  6. SZEDER GáborMar 11, 2017
  7. Jeff KingMar 15, 2017
  8. SZEDER GáborMay 3, 2017
  9. Jeff KingMay 3, 2017
  10. Sebastian SchuberthMay 4, 2017
  11. Junio C HamanoMay 9, 2017
  12. Jeff KingMay 9, 2017
  13. Jeff KingMay 9, 2017
  14. Junio C HamanoMay 9, 2017
  15. Ævar Arnfjörð BjarmasonMay 4, 2017

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.