Re: [PATCH v4 5/9] builtin/clone: move setup of alternates for shared local clones
Patrick Steinhardt <ps@pks.im> writes:
Show 38 quoted lines
> When cloning a local repository with "--shared" we add that repository
> to the new repository's alternates. This is done in `clone_local()`,
> which is responsible for performing local clones.
>
> Move the logic into `collect_alternates()` to unify our setup of
> alternates. Furthermore, this will allow us to set up alternates right
> at creation time of the object database.
>
> Note that the logic for cloning a local repository with "--no-shared" is
> not yet part of `collect_alternates()`. This will be handled in the next
> commit.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> builtin/clone.c | 23 ++++++++++++++---------
> 1 file changed, 14 insertions(+), 9 deletions(-)
>
> diff --git a/builtin/clone.c b/builtin/clone.c
> index 8786a49332..011fc867c8 100644
> --- a/builtin/clone.c
> +++ b/builtin/clone.c
> @@ -220,7 +220,8 @@ static void copy_alternates(struct strbuf *src, const char *src_repo)
> fclose(in);
> }
>
> -static void collect_alternates(struct strvec *alternates)
> +static void collect_alternates(struct strvec *alternates,
> + const char *src_repo, bool is_local)
> {
> if (option_required_reference.nr || option_optional_reference.nr) {
> struct add_one_alternate_data data = {
> @@ -234,6 +235,16 @@ static void collect_alternates(struct strvec *alternates)
> for_each_string_list(&option_optional_reference,
> add_one_alternate, &data);
> }
> +
> + if (is_local) {
>Shouldn't we also check for `option_shared` here?
Show 38 quoted lines
> + struct strbuf commondir = STRBUF_INIT;
> +
> + get_common_dir(&commondir, src_repo);
> + if (option_shared)
> + strvec_pushf(alternates, "%s/objects", commondir.buf);
> +
> + strbuf_release(&commondir);
> + }
> }
>
> static void mkdir_if_missing(const char *pathname, mode_t mode)
> @@ -357,13 +368,7 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest,
>
> static void clone_local(const char *src_repo, const char *dest_repo)
> {
> - if (option_shared) {
> - struct strbuf alt = STRBUF_INIT;
> - get_common_dir(&alt, src_repo);
> - strbuf_addstr(&alt, "/objects");
> - odb_add_to_alternates_file(the_repository->objects, alt.buf);
> - strbuf_release(&alt);
> - } else {
> + if (!option_shared) {
> struct strbuf src = STRBUF_INIT;
> struct strbuf dest = STRBUF_INIT;
> get_common_dir(&src, src_repo);
> @@ -1348,7 +1353,7 @@ int cmd_clone(int argc,
> warning(_("--local is ignored"));
>
> create_object_database(the_repository);
> - collect_alternates(&alternates);
> + collect_alternates(&alternates, path, is_local);
>
> for (size_t i = 0; i < alternates.nr; i++)
> odb_add_to_alternates_file(the_repository->objects, alternates.v[i]);
>
> --
> 2.55.0.1074.ge7621b4bad.dirty