On Thu, Jun 7, 2018 at 4:07 PM Derrick Stolee <stolee@xxxxxxxxx> wrote: > > If the multi-pack-index contains a packfile, then we do not need to add > that packfile to the packed_git linked list or the MRU list. Because...? I think I see the reason, but I'd like it spelled out to avoid any misunderstanding. > > Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > --- > midx.c | 23 +++++++++++++++++++++++ > midx.h | 1 + > packfile.c | 7 +++++++ > 3 files changed, 31 insertions(+) > > diff --git a/midx.c b/midx.c > index 388d79b7d9..3242646fe0 100644 > --- a/midx.c > +++ b/midx.c > @@ -278,6 +278,29 @@ int fill_midx_entry(const struct object_id *oid, struct pack_entry *e, struct mi > return nth_midxed_pack_entry(m, e, pos); > } > > +int midx_contains_pack(struct midxed_git *m, const char *idx_name) > +{ > + uint32_t first = 0, last = m->num_packs; > + > + while (first < last) { > + uint32_t mid = first + (last - first) / 2; > + const char *current; > + int cmp; > + > + current = m->pack_names[mid]; > + cmp = strcmp(idx_name, current); > + if (!cmp) > + return 1; > + if (cmp > 0) { > + first = mid + 1; > + continue; > + } > + last = mid; > + } > + > + return 0; > +} > + > int prepare_midxed_git_one(struct repository *r, const char *object_dir) > { > struct midxed_git *m = r->objects->midxed_git; > diff --git a/midx.h b/midx.h > index 497bdcc77c..c1db58d8c4 100644 > --- a/midx.h > +++ b/midx.h > @@ -13,6 +13,7 @@ struct object_id *nth_midxed_object_oid(struct object_id *oid, > struct midxed_git *m, > uint32_t n); > int fill_midx_entry(const struct object_id *oid, struct pack_entry *e, struct midxed_git *m); > +int midx_contains_pack(struct midxed_git *m, const char *idx_name); > int prepare_midxed_git_one(struct repository *r, const char *object_dir); > > int write_midx_file(const char *object_dir); > diff --git a/packfile.c b/packfile.c > index 059b2aa097..479cb69b9f 100644 > --- a/packfile.c > +++ b/packfile.c > @@ -746,6 +746,11 @@ static void prepare_packed_git_one(struct repository *r, char *objdir, int local > DIR *dir; > struct dirent *de; > struct string_list garbage = STRING_LIST_INIT_DUP; > + struct midxed_git *m = r->objects->midxed_git; > + > + /* look for the multi-pack-index for this object directory */ > + while (m && strcmp(m->object_dir, objdir)) > + m = m->next; > > strbuf_addstr(&path, objdir); > strbuf_addstr(&path, "/pack"); > @@ -772,6 +777,8 @@ static void prepare_packed_git_one(struct repository *r, char *objdir, int local > base_len = path.len; > if (strip_suffix_mem(path.buf, &base_len, ".idx")) { > /* Don't reopen a pack we already have. */ > + if (m && midx_contains_pack(m, de->d_name)) > + continue; > for (p = r->objects->packed_git; p; > p = p->next) { > size_t len; > -- > 2.18.0.rc1 > -- Duy