[PATCH v5 5/9] builtin/clone: move setup of alternates for shared local clones
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Sep 10, 2026, 15:09 UTC
- Message-ID
- <20260910-pks-odb-write-alternates-at-creation-time-v5-5-8d10c4238edc@pks.im>
- In-Reply-To
- <20260910-pks-odb-write-alternates-at-creation-time-v5-0-8d10c4238edc@pks.im>
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, but means that at this step, we may compute `commondir` without it being used. It will become used in the next step though.
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 08d913d306..d397fd36b2 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 *local_source_repo) { if (option_required_reference.nr || option_optional_reference.nr) { struct collect_alternates_data data = { @@ -234,6 +235,16 @@ static void collect_alternates(struct strvec *alternates) for_each_string_list(&option_optional_reference, collect_one_alternate, &data); } + + if (local_source_repo) { + struct strbuf commondir = STRBUF_INIT; + + get_common_dir(&commondir, local_source_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, is_local ? path : NULL); 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