From: Karthik Nayak Date: Thu, 10 Sep 2026 10:52:38 GMT Subject: Re: [PATCH v4 5/9] builtin/clone: move setup of alternates for shared local clones Message-ID: In-Reply-To: <20260909-pks-odb-write-alternates-at-creation-time-v4-5-d8a78ffc32e4@pks.im> Patrick Steinhardt writes: > 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 > --- > 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? > + 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