Skip to content

Commit 736bb72

Browse files
pks-tgitster
authored andcommitted
packfile: refactor get_multi_pack_index() to work on sources
The function `get_multi_pack_index()` loads multi-pack indices via `prepare_packed_git()` and then returns the linked list of multi-pack indices that is stored in `struct object_database`. That list is in the process of being removed though in favor of storing the MIDX as part of the object database source it belongs to. Refactor `get_multi_pack_index()` so that it returns the multi-pack index for a single object source. Callers are now expected to call this function for each source they are interested in. This requires them to iterate through alternates, so we have to prepare alternate object sources before doing so. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 6567432 commit 736bb72

File tree

7 files changed

+57
-62
lines changed

7 files changed

+57
-62
lines changed

builtin/pack-objects.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1706,8 +1706,8 @@ static int want_object_in_pack_mtime(const struct object_id *oid,
17061706
uint32_t found_mtime)
17071707
{
17081708
int want;
1709+
struct odb_source *source;
17091710
struct list_head *pos;
1710-
struct multi_pack_index *m;
17111711

17121712
if (!exclude && local && has_loose_object_nonlocal(oid))
17131713
return 0;
@@ -1727,9 +1727,13 @@ static int want_object_in_pack_mtime(const struct object_id *oid,
17271727
*found_offset = 0;
17281728
}
17291729

1730-
for (m = get_multi_pack_index(the_repository); m; m = m->next) {
1730+
odb_prepare_alternates(the_repository->objects);
1731+
1732+
for (source = the_repository->objects->sources; source; source = source->next) {
1733+
struct multi_pack_index *m = get_multi_pack_index(source);
17311734
struct pack_entry e;
1732-
if (fill_midx_entry(the_repository, oid, &e, m)) {
1735+
1736+
if (m && fill_midx_entry(the_repository, oid, &e, m)) {
17331737
want = want_object_in_pack_one(e.p, oid, exclude, found_pack, found_offset, found_mtime);
17341738
if (want != -1)
17351739
return want;

builtin/repack.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,9 @@ static void mark_packs_for_deletion(struct existing_packs *existing,
223223
static void remove_redundant_pack(const char *dir_name, const char *base_name)
224224
{
225225
struct strbuf buf = STRBUF_INIT;
226-
struct multi_pack_index *m = get_local_multi_pack_index(the_repository);
226+
struct multi_pack_index *m = get_multi_pack_index(the_repository->objects->sources);
227227
strbuf_addf(&buf, "%s.pack", base_name);
228-
if (m && midx_contains_pack(m, buf.buf))
228+
if (m && m->local && midx_contains_pack(m, buf.buf))
229229
clear_midx_file(the_repository);
230230
strbuf_insertf(&buf, 0, "%s/", dir_name);
231231
unlink_pack_path(buf.buf, 1);
@@ -1531,7 +1531,7 @@ int cmd_repack(int argc,
15311531
* midx_has_unknown_packs() will make the decision for
15321532
* us.
15331533
*/
1534-
if (!get_local_multi_pack_index(the_repository))
1534+
if (!get_multi_pack_index(the_repository->objects->sources))
15351535
midx_must_contain_cruft = 1;
15361536
}
15371537

@@ -1614,9 +1614,9 @@ int cmd_repack(int argc,
16141614

16151615
string_list_sort(&names);
16161616

1617-
if (get_local_multi_pack_index(the_repository)) {
1617+
if (get_multi_pack_index(the_repository->objects->sources)) {
16181618
struct multi_pack_index *m =
1619-
get_local_multi_pack_index(the_repository);
1619+
get_multi_pack_index(the_repository->objects->sources);
16201620

16211621
ALLOC_ARRAY(midx_pack_names,
16221622
m->num_packs + m->num_packs_in_base);

midx-write.c

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -916,26 +916,8 @@ static int write_midx_bitmap(struct write_midx_context *ctx,
916916
static struct multi_pack_index *lookup_multi_pack_index(struct repository *r,
917917
const char *object_dir)
918918
{
919-
struct multi_pack_index *result = NULL;
920-
struct multi_pack_index *cur;
921-
char *obj_dir_real = real_pathdup(object_dir, 1);
922-
struct strbuf cur_path_real = STRBUF_INIT;
923-
924-
/* Ensure the given object_dir is local, or a known alternate. */
925-
odb_find_source(r->objects, obj_dir_real);
926-
927-
for (cur = get_multi_pack_index(r); cur; cur = cur->next) {
928-
strbuf_realpath(&cur_path_real, cur->object_dir, 1);
929-
if (!strcmp(obj_dir_real, cur_path_real.buf)) {
930-
result = cur;
931-
goto cleanup;
932-
}
933-
}
934-
935-
cleanup:
936-
free(obj_dir_real);
937-
strbuf_release(&cur_path_real);
938-
return result;
919+
struct odb_source *source = odb_find_source(r->objects, object_dir);
920+
return get_multi_pack_index(source);
939921
}
940922

941923
static int fill_packs_from_midx(struct write_midx_context *ctx,

object-name.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -198,16 +198,20 @@ static void unique_in_pack(struct packed_git *p,
198198

199199
static void find_short_packed_object(struct disambiguate_state *ds)
200200
{
201-
struct multi_pack_index *m;
201+
struct odb_source *source;
202202
struct packed_git *p;
203203

204204
/* Skip, unless oids from the storage hash algorithm are wanted */
205205
if (ds->bin_pfx.algo && (&hash_algos[ds->bin_pfx.algo] != ds->repo->hash_algo))
206206
return;
207207

208-
for (m = get_multi_pack_index(ds->repo); m && !ds->ambiguous;
209-
m = m->next)
210-
unique_in_midx(m, ds);
208+
odb_prepare_alternates(ds->repo->objects);
209+
for (source = ds->repo->objects->sources; source && !ds->ambiguous; source = source->next) {
210+
struct multi_pack_index *m = get_multi_pack_index(source);
211+
if (m)
212+
unique_in_midx(m, ds);
213+
}
214+
211215
for (p = get_packed_git(ds->repo); p && !ds->ambiguous;
212216
p = p->next)
213217
unique_in_pack(p, ds);
@@ -792,11 +796,15 @@ static void find_abbrev_len_for_pack(struct packed_git *p,
792796

793797
static void find_abbrev_len_packed(struct min_abbrev_data *mad)
794798
{
795-
struct multi_pack_index *m;
796799
struct packed_git *p;
797800

798-
for (m = get_multi_pack_index(mad->repo); m; m = m->next)
799-
find_abbrev_len_for_midx(m, mad);
801+
odb_prepare_alternates(mad->repo->objects);
802+
for (struct odb_source *source = mad->repo->objects->sources; source; source = source->next) {
803+
struct multi_pack_index *m = get_multi_pack_index(source);
804+
if (m)
805+
find_abbrev_len_for_midx(m, mad);
806+
}
807+
800808
for (p = get_packed_git(mad->repo); p; p = p->next)
801809
find_abbrev_len_for_pack(p, mad);
802810
}

pack-bitmap.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -691,13 +691,15 @@ static int open_pack_bitmap(struct repository *r,
691691
static int open_midx_bitmap(struct repository *r,
692692
struct bitmap_index *bitmap_git)
693693
{
694+
struct odb_source *source;
694695
int ret = -1;
695-
struct multi_pack_index *midx;
696696

697697
assert(!bitmap_git->map);
698698

699-
for (midx = get_multi_pack_index(r); midx; midx = midx->next) {
700-
if (!open_midx_bitmap_1(bitmap_git, midx))
699+
odb_prepare_alternates(r->objects);
700+
for (source = r->objects->sources; source; source = source->next) {
701+
struct multi_pack_index *midx = get_multi_pack_index(source);
702+
if (midx && !open_midx_bitmap_1(bitmap_git, midx))
701703
ret = 0;
702704
}
703705
return ret;
@@ -3305,11 +3307,18 @@ static int verify_bitmap_file(const struct git_hash_algo *algop,
33053307

33063308
int verify_bitmap_files(struct repository *r)
33073309
{
3310+
struct odb_source *source;
33083311
int res = 0;
33093312

3310-
for (struct multi_pack_index *m = get_multi_pack_index(r);
3311-
m; m = m->next) {
3312-
char *midx_bitmap_name = midx_bitmap_filename(m);
3313+
odb_prepare_alternates(r->objects);
3314+
for (source = r->objects->sources; source; source = source->next) {
3315+
struct multi_pack_index *m = get_multi_pack_index(source);
3316+
char *midx_bitmap_name;
3317+
3318+
if (!m)
3319+
continue;
3320+
3321+
midx_bitmap_name = midx_bitmap_filename(m);
33133322
res |= verify_bitmap_file(r->hash_algo, midx_bitmap_name);
33143323
free(midx_bitmap_name);
33153324
}

packfile.c

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -963,14 +963,18 @@ static void prepare_packed_git(struct repository *r);
963963
unsigned long repo_approximate_object_count(struct repository *r)
964964
{
965965
if (!r->objects->approximate_object_count_valid) {
966-
unsigned long count;
967-
struct multi_pack_index *m;
966+
struct odb_source *source;
967+
unsigned long count = 0;
968968
struct packed_git *p;
969969

970970
prepare_packed_git(r);
971-
count = 0;
972-
for (m = get_multi_pack_index(r); m; m = m->next)
973-
count += m->num_objects;
971+
972+
for (source = r->objects->sources; source; source = source->next) {
973+
struct multi_pack_index *m = get_multi_pack_index(source);
974+
if (m)
975+
count += m->num_objects;
976+
}
977+
974978
for (p = r->objects->packed_git; p; p = p->next) {
975979
if (open_pack_index(p))
976980
continue;
@@ -1074,21 +1078,10 @@ struct packed_git *get_packed_git(struct repository *r)
10741078
return r->objects->packed_git;
10751079
}
10761080

1077-
struct multi_pack_index *get_multi_pack_index(struct repository *r)
1078-
{
1079-
prepare_packed_git(r);
1080-
return r->objects->multi_pack_index;
1081-
}
1082-
1083-
struct multi_pack_index *get_local_multi_pack_index(struct repository *r)
1081+
struct multi_pack_index *get_multi_pack_index(struct odb_source *source)
10841082
{
1085-
struct multi_pack_index *m = get_multi_pack_index(r);
1086-
1087-
/* no need to iterate; we always put the local one first (if any) */
1088-
if (m && m->local)
1089-
return m;
1090-
1091-
return NULL;
1083+
prepare_packed_git(source->odb->repo);
1084+
return source->midx;
10921085
}
10931086

10941087
struct packed_git *get_all_packs(struct repository *r)

packfile.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,7 @@ void install_packed_git(struct repository *r, struct packed_git *pack);
147147

148148
struct packed_git *get_packed_git(struct repository *r);
149149
struct list_head *get_packed_git_mru(struct repository *r);
150-
struct multi_pack_index *get_multi_pack_index(struct repository *r);
151-
struct multi_pack_index *get_local_multi_pack_index(struct repository *r);
150+
struct multi_pack_index *get_multi_pack_index(struct odb_source *source);
152151
struct packed_git *get_all_packs(struct repository *r);
153152

154153
/*

0 commit comments

Comments
 (0)