Re: [PATCHv4 8/8] clone: recursive and reference option triggers submodule alternates
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Aug 12, 2016, 22:32 UTC
- Message-ID
- <xmqq60r5vcrs.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <20160811231405.17318-9-sbeller@google.com>
Stefan Beller <sbeller@google.com> writes:
Show 28 quoted lines
> +int add_possible_reference_from_superproject(
> + struct alternate_object_database *alt, void *sas_cb)
> +{
> + struct submodule_alternate_setup *sas = sas_cb;
> +
> + ...
> + size_t namelen = alt->name - alt->base - 1;
> + struct strbuf name = STRBUF_INIT;
> + strbuf_add(&name, alt->base, namelen);
> +
> + /*
> + * If the alternate object store is another repository, try the
> + * standard layout with .git/modules/<name>/objects
> + */
> + if (ends_with(name.buf, ".git/objects")) {
> + char *sm_alternate;
> + struct strbuf sb = STRBUF_INIT;
> + struct strbuf err = STRBUF_INIT;
> + strbuf_add(&sb, name.buf, name.len - strlen("objects"));
> + /*
> + * We need to end the new path with '/' to mark it as a dir,
> + * otherwise a submodule name containing '/' will be broken
> + * as the last part of a missing submodule reference would
> + * be taken as a file name.
> + */
> + strbuf_addf(&sb, "modules/%s/", sas->submodule_name);
> +
> + sm_alternate = compute_alternate_path(sb.buf, &err);OK. Thanks to the refactoring in the earlier step, this has become quite straight-forward and robust; this code will always decide if the other directory can be used as an alternate the same way the "git clone" we will call would decide.
Good.