summaryrefslogtreecommitdiff
path: root/builtin/repack.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2023-04-14 06:01:40 (GMT)
committerJunio C Hamano <gitster@pobox.com>2023-04-14 17:27:51 (GMT)
commit51861340f8d7f76a99e0d7265f4417b0a9a6871c (patch)
tree764b70c21b4233e029f532f1046b42695b718215 /builtin/repack.c
parent3d74a2337c679839265efa16b2bca2a9b7795a00 (diff)
downloadgit-51861340f8d7f76a99e0d7265f4417b0a9a6871c.zip
git-51861340f8d7f76a99e0d7265f4417b0a9a6871c.tar.gz
git-51861340f8d7f76a99e0d7265f4417b0a9a6871c.tar.bz2
repack: fix generating multi-pack-index with only non-local packs
When writing the multi-pack-index with geometric repacking we will add all packfiles to the index that are part of the geometric sequence. This can potentially also include packfiles borrowed from an alternate object directory. But given that a multi-pack-index can only ever include packs that are part of the main object database this does not make much sense whatsoever. In the edge case where all packfiles are contained in the alternate object database and the local repository has none itself this bug can cause us to invoke git-multi-pack-index(1) with only non-local packfiles that it ultimately cannot find. This causes it to return an error and thus causes the geometric repack to fail. Fix the code to skip non-local packfiles. Co-authored-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/repack.c')
-rw-r--r--builtin/repack.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/builtin/repack.c b/builtin/repack.c
index 63585ad..a591a4d 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -570,6 +570,17 @@ static void midx_included_packs(struct string_list *include,
for (i = geometry->split; i < geometry->pack_nr; i++) {
struct packed_git *p = geometry->pack[i];
+ /*
+ * The multi-pack index never refers to packfiles part
+ * of an alternate object database, so we skip these.
+ * While git-multi-pack-index(1) would silently ignore
+ * them anyway, this allows us to skip executing the
+ * command completely when we have only non-local
+ * packfiles.
+ */
+ if (!p->pack_local)
+ continue;
+
strbuf_addstr(&buf, pack_basename(p));
strbuf_strip_suffix(&buf, ".pack");
strbuf_addstr(&buf, ".idx");