Skip to content

Commit 703c975

Browse files
committed
Merge branch 'ps/odb-for-each-object' into ps/odb-sources
* ps/odb-for-each-object: odb: drop unused `for_each_{loose,packed}_object()` functions reachable: convert to use `odb_for_each_object()` builtin/pack-objects: use `packfile_store_for_each_object()` odb: introduce mtime fields for object info requests treewide: drop uses of `for_each_{loose,packed}_object()` treewide: enumerate promisor objects via `odb_for_each_object()` builtin/fsck: refactor to use `odb_for_each_object()` odb: introduce `odb_for_each_object()` packfile: introduce function to iterate through objects packfile: extract function to iterate through objects of a store object-file: introduce function to iterate through objects object-file: extract function to read object info from path odb: fix flags parameter to be unsigned odb: rename `FOR_EACH_OBJECT_*` flags
2 parents 7c02d39 + 3565faf commit 703c975

13 files changed

Lines changed: 462 additions & 311 deletions

builtin/cat-file.c

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -806,11 +806,14 @@ struct for_each_object_payload {
806806
void *payload;
807807
};
808808

809-
static int batch_one_object_loose(const struct object_id *oid,
810-
const char *path UNUSED,
811-
void *_payload)
809+
static int batch_one_object_oi(const struct object_id *oid,
810+
struct object_info *oi,
811+
void *_payload)
812812
{
813813
struct for_each_object_payload *payload = _payload;
814+
if (oi && oi->whence == OI_PACKED)
815+
return payload->callback(oid, oi->u.packed.pack, oi->u.packed.offset,
816+
payload->payload);
814817
return payload->callback(oid, NULL, 0, payload->payload);
815818
}
816819

@@ -846,8 +849,21 @@ static void batch_each_object(struct batch_options *opt,
846849
.payload = _payload,
847850
};
848851
struct bitmap_index *bitmap = NULL;
852+
struct odb_source *source;
849853

850-
for_each_loose_object(the_repository->objects, batch_one_object_loose, &payload, 0);
854+
/*
855+
* TODO: we still need to tap into implementation details of the object
856+
* database sources. Ideally, we should extend `odb_for_each_object()`
857+
* to handle object filters itself so that we can move the filtering
858+
* logic into the individual sources.
859+
*/
860+
odb_prepare_alternates(the_repository->objects);
861+
for (source = the_repository->objects->sources; source; source = source->next) {
862+
int ret = odb_source_loose_for_each_object(source, NULL, batch_one_object_oi,
863+
&payload, flags);
864+
if (ret)
865+
break;
866+
}
851867

852868
if (opt->objects_filter.choice != LOFC_DISABLED &&
853869
(bitmap = prepare_bitmap_git(the_repository)) &&
@@ -863,8 +879,14 @@ static void batch_each_object(struct batch_options *opt,
863879
&payload, flags);
864880
}
865881
} else {
866-
for_each_packed_object(the_repository, batch_one_object_packed,
867-
&payload, flags);
882+
struct object_info oi = { 0 };
883+
884+
for (source = the_repository->objects->sources; source; source = source->next) {
885+
int ret = packfile_store_for_each_object(source->packfiles, &oi,
886+
batch_one_object_oi, &payload, flags);
887+
if (ret)
888+
break;
889+
}
868890
}
869891

870892
free_bitmap_index(bitmap);
@@ -924,7 +946,7 @@ static int batch_objects(struct batch_options *opt)
924946
cb.seen = &seen;
925947

926948
batch_each_object(opt, batch_unordered_object,
927-
FOR_EACH_OBJECT_PACK_ORDER, &cb);
949+
ODB_FOR_EACH_OBJECT_PACK_ORDER, &cb);
928950

929951
oidset_clear(&seen);
930952
} else {

builtin/fsck.c

Lines changed: 12 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -219,15 +219,17 @@ static int mark_used(struct object *obj, enum object_type type UNUSED,
219219
return 0;
220220
}
221221

222-
static void mark_unreachable_referents(const struct object_id *oid)
222+
static int mark_unreachable_referents(const struct object_id *oid,
223+
struct object_info *oi UNUSED,
224+
void *data UNUSED)
223225
{
224226
struct fsck_options options = FSCK_OPTIONS_DEFAULT;
225227
struct object *obj = lookup_object(the_repository, oid);
226228

227229
if (!obj || !(obj->flags & HAS_OBJ))
228-
return; /* not part of our original set */
230+
return 0; /* not part of our original set */
229231
if (obj->flags & REACHABLE)
230-
return; /* reachable objects already traversed */
232+
return 0; /* reachable objects already traversed */
231233

232234
/*
233235
* Avoid passing OBJ_NONE to fsck_walk, which will parse the object
@@ -244,22 +246,7 @@ static void mark_unreachable_referents(const struct object_id *oid)
244246
fsck_walk(obj, NULL, &options);
245247
if (obj->type == OBJ_TREE)
246248
free_tree_buffer((struct tree *)obj);
247-
}
248249

249-
static int mark_loose_unreachable_referents(const struct object_id *oid,
250-
const char *path UNUSED,
251-
void *data UNUSED)
252-
{
253-
mark_unreachable_referents(oid);
254-
return 0;
255-
}
256-
257-
static int mark_packed_unreachable_referents(const struct object_id *oid,
258-
struct packed_git *pack UNUSED,
259-
uint32_t pos UNUSED,
260-
void *data UNUSED)
261-
{
262-
mark_unreachable_referents(oid);
263250
return 0;
264251
}
265252

@@ -395,12 +382,8 @@ static void check_connectivity(void)
395382
* and ignore any that weren't present in our earlier
396383
* traversal.
397384
*/
398-
for_each_loose_object(the_repository->objects,
399-
mark_loose_unreachable_referents, NULL, 0);
400-
for_each_packed_object(the_repository,
401-
mark_packed_unreachable_referents,
402-
NULL,
403-
0);
385+
odb_for_each_object(the_repository->objects, NULL,
386+
mark_unreachable_referents, NULL, 0);
404387
}
405388

406389
/* Look up all the requirements, warn about missing objects.. */
@@ -900,26 +883,12 @@ static void fsck_index(struct index_state *istate, const char *index_path,
900883
fsck_resolve_undo(istate, index_path);
901884
}
902885

903-
static void mark_object_for_connectivity(const struct object_id *oid)
886+
static int mark_object_for_connectivity(const struct object_id *oid,
887+
struct object_info *oi UNUSED,
888+
void *cb_data UNUSED)
904889
{
905890
struct object *obj = lookup_unknown_object(the_repository, oid);
906891
obj->flags |= HAS_OBJ;
907-
}
908-
909-
static int mark_loose_for_connectivity(const struct object_id *oid,
910-
const char *path UNUSED,
911-
void *data UNUSED)
912-
{
913-
mark_object_for_connectivity(oid);
914-
return 0;
915-
}
916-
917-
static int mark_packed_for_connectivity(const struct object_id *oid,
918-
struct packed_git *pack UNUSED,
919-
uint32_t pos UNUSED,
920-
void *data UNUSED)
921-
{
922-
mark_object_for_connectivity(oid);
923892
return 0;
924893
}
925894

@@ -1068,10 +1037,8 @@ int cmd_fsck(int argc,
10681037
odb_reprepare(the_repository->objects);
10691038

10701039
if (connectivity_only) {
1071-
for_each_loose_object(the_repository->objects,
1072-
mark_loose_for_connectivity, NULL, 0);
1073-
for_each_packed_object(the_repository,
1074-
mark_packed_for_connectivity, NULL, 0);
1040+
odb_for_each_object(the_repository->objects, NULL,
1041+
mark_object_for_connectivity, NULL, 0);
10751042
} else {
10761043
odb_prepare_alternates(the_repository->objects);
10771044
for (source = the_repository->objects->sources; source; source = source->next)

builtin/pack-objects.c

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3912,7 +3912,7 @@ static void read_packs_list_from_stdin(struct rev_info *revs)
39123912
for_each_object_in_pack(p,
39133913
add_object_entry_from_pack,
39143914
revs,
3915-
FOR_EACH_OBJECT_PACK_ORDER);
3915+
ODB_FOR_EACH_OBJECT_PACK_ORDER);
39163916
}
39173917

39183918
strbuf_release(&buf);
@@ -4315,25 +4315,12 @@ static void show_edge(struct commit *commit)
43154315
}
43164316

43174317
static int add_object_in_unpacked_pack(const struct object_id *oid,
4318-
struct packed_git *pack,
4319-
uint32_t pos,
4318+
struct object_info *oi,
43204319
void *data UNUSED)
43214320
{
43224321
if (cruft) {
4323-
off_t offset;
4324-
time_t mtime;
4325-
4326-
if (pack->is_cruft) {
4327-
if (load_pack_mtimes(pack) < 0)
4328-
die(_("could not load cruft pack .mtimes"));
4329-
mtime = nth_packed_mtime(pack, pos);
4330-
} else {
4331-
mtime = pack->mtime;
4332-
}
4333-
offset = nth_packed_object_offset(pack, pos);
4334-
4335-
add_cruft_object_entry(oid, OBJ_NONE, pack, offset,
4336-
NULL, mtime);
4322+
add_cruft_object_entry(oid, OBJ_NONE, oi->u.packed.pack,
4323+
oi->u.packed.offset, NULL, *oi->mtimep);
43374324
} else {
43384325
add_object_entry(oid, OBJ_NONE, "", 0);
43394326
}
@@ -4342,14 +4329,25 @@ static int add_object_in_unpacked_pack(const struct object_id *oid,
43424329

43434330
static void add_objects_in_unpacked_packs(void)
43444331
{
4345-
if (for_each_packed_object(to_pack.repo,
4346-
add_object_in_unpacked_pack,
4347-
NULL,
4348-
FOR_EACH_OBJECT_PACK_ORDER |
4349-
FOR_EACH_OBJECT_LOCAL_ONLY |
4350-
FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS |
4351-
FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS))
4352-
die(_("cannot open pack index"));
4332+
struct odb_source *source;
4333+
time_t mtime;
4334+
struct object_info oi = {
4335+
.mtimep = &mtime,
4336+
};
4337+
4338+
odb_prepare_alternates(to_pack.repo->objects);
4339+
for (source = to_pack.repo->objects->sources; source; source = source->next) {
4340+
if (!source->local)
4341+
continue;
4342+
4343+
if (packfile_store_for_each_object(source->packfiles, &oi,
4344+
add_object_in_unpacked_pack, NULL,
4345+
ODB_FOR_EACH_OBJECT_PACK_ORDER |
4346+
ODB_FOR_EACH_OBJECT_LOCAL_ONLY |
4347+
ODB_FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS |
4348+
ODB_FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS))
4349+
die(_("cannot open pack index"));
4350+
}
43534351
}
43544352

43554353
static int add_loose_object(const struct object_id *oid, const char *path,

commit-graph.c

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,30 +1479,38 @@ static int write_graph_chunk_bloom_data(struct hashfile *f,
14791479
return 0;
14801480
}
14811481

1482+
static int add_packed_commits_oi(const struct object_id *oid,
1483+
struct object_info *oi,
1484+
void *data)
1485+
{
1486+
struct write_commit_graph_context *ctx = (struct write_commit_graph_context*)data;
1487+
1488+
if (ctx->progress)
1489+
display_progress(ctx->progress, ++ctx->progress_done);
1490+
1491+
if (*oi->typep != OBJ_COMMIT)
1492+
return 0;
1493+
1494+
oid_array_append(&ctx->oids, oid);
1495+
set_commit_pos(ctx->r, oid);
1496+
1497+
return 0;
1498+
}
1499+
14821500
static int add_packed_commits(const struct object_id *oid,
14831501
struct packed_git *pack,
14841502
uint32_t pos,
14851503
void *data)
14861504
{
1487-
struct write_commit_graph_context *ctx = (struct write_commit_graph_context*)data;
14881505
enum object_type type;
14891506
off_t offset = nth_packed_object_offset(pack, pos);
14901507
struct object_info oi = OBJECT_INFO_INIT;
14911508

1492-
if (ctx->progress)
1493-
display_progress(ctx->progress, ++ctx->progress_done);
1494-
14951509
oi.typep = &type;
14961510
if (packed_object_info(pack, offset, &oi) < 0)
14971511
die(_("unable to get type of object %s"), oid_to_hex(oid));
14981512

1499-
if (type != OBJ_COMMIT)
1500-
return 0;
1501-
1502-
oid_array_append(&ctx->oids, oid);
1503-
set_commit_pos(ctx->r, oid);
1504-
1505-
return 0;
1513+
return add_packed_commits_oi(oid, &oi, data);
15061514
}
15071515

15081516
static void add_missing_parents(struct write_commit_graph_context *ctx, struct commit *commit)
@@ -1927,7 +1935,7 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
19271935
goto cleanup;
19281936
}
19291937
for_each_object_in_pack(p, add_packed_commits, ctx,
1930-
FOR_EACH_OBJECT_PACK_ORDER);
1938+
ODB_FOR_EACH_OBJECT_PACK_ORDER);
19311939
close_pack(p);
19321940
free(p);
19331941
}
@@ -1959,13 +1967,23 @@ static int fill_oids_from_commits(struct write_commit_graph_context *ctx,
19591967

19601968
static void fill_oids_from_all_packs(struct write_commit_graph_context *ctx)
19611969
{
1970+
struct odb_source *source;
1971+
enum object_type type;
1972+
struct object_info oi = {
1973+
.typep = &type,
1974+
};
1975+
19621976
if (ctx->report_progress)
19631977
ctx->progress = start_delayed_progress(
19641978
ctx->r,
19651979
_("Finding commits for commit graph among packed objects"),
19661980
ctx->approx_nr_objects);
1967-
for_each_packed_object(ctx->r, add_packed_commits, ctx,
1968-
FOR_EACH_OBJECT_PACK_ORDER);
1981+
1982+
odb_prepare_alternates(ctx->r->objects);
1983+
for (source = ctx->r->objects->sources; source; source = source->next)
1984+
packfile_store_for_each_object(source->packfiles, &oi, add_packed_commits_oi,
1985+
ctx, ODB_FOR_EACH_OBJECT_PACK_ORDER);
1986+
19691987
if (ctx->progress_done < ctx->approx_nr_objects)
19701988
display_progress(ctx->progress, ctx->approx_nr_objects);
19711989
stop_progress(&ctx->progress);

0 commit comments

Comments
 (0)