midx: write multi-pack indices via their source
Similar to the preceding commit, refactor the writing side of multi-pack indices so that we pass in the object database source where the index should be written to. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Aug 11, 2025 at 15:46 UTC
c3f5d251469525a52074b0373671a588f0e5b972
4 files changed
+47
-49
builtin/multi-pack-index.c
+11
-8
@@ -147,6 +147,7 @@ static int cmd_multi_pack_index_write(int argc, const char **argv,
147
N_("refs snapshot for selecting bitmap commits")),
148
OPT_END(),
149
};
150
+ struct odb_source *source;
151
int ret;
152
153
opts.flags |= MIDX_WRITE_BITMAP_HASH_CACHE;
@@ -165,7 +166,7 @@ static int cmd_multi_pack_index_write(int argc, const char **argv,
166
if (argc)
167
usage_with_options(builtin_multi_pack_index_write_usage,
168
options);
168
- handle_object_dir_option(repo);
169
+ source = handle_object_dir_option(repo);
170
171
FREE_AND_NULL(options);
172
@@ -174,7 +175,7 @@ static int cmd_multi_pack_index_write(int argc, const char **argv,
175
176
read_packs_from_stdin(&packs);
177
177
- ret = write_midx_file_only(repo, opts.object_dir, &packs,
178
+ ret = write_midx_file_only(source, &packs,
179
opts.preferred_pack,
180
opts.refs_snapshot, opts.flags);
181
@@ -185,7 +186,7 @@ static int cmd_multi_pack_index_write(int argc, const char **argv,
186
187
}
188
188
- ret = write_midx_file(repo, opts.object_dir, opts.preferred_pack,
189
+ ret = write_midx_file(source, opts.preferred_pack,
190
opts.refs_snapshot, opts.flags);
191
192
free(opts.refs_snapshot);
@@ -233,6 +234,8 @@ static int cmd_multi_pack_index_expire(int argc, const char **argv,
234
N_("force progress reporting"), MIDX_PROGRESS),
235
OPT_END(),
236
};
237
+ struct odb_source *source;
238
+
239
options = add_common_options(builtin_multi_pack_index_expire_options);
240
241
trace2_cmd_mode(argv[0]);
@@ -245,11 +248,11 @@ static int cmd_multi_pack_index_expire(int argc, const char **argv,
248
if (argc)
249
usage_with_options(builtin_multi_pack_index_expire_usage,
250
options);
248
- handle_object_dir_option(the_repository);
251
+ source = handle_object_dir_option(the_repository);
252
253
FREE_AND_NULL(options);
254
252
- return expire_midx_packs(the_repository, opts.object_dir, opts.flags);
255
+ return expire_midx_packs(source, opts.flags);
256
}
257
258
static int cmd_multi_pack_index_repack(int argc, const char **argv,
@@ -264,6 +267,7 @@ static int cmd_multi_pack_index_repack(int argc, const char **argv,
267
N_("force progress reporting"), MIDX_PROGRESS),
268
OPT_END(),
269
};
270
+ struct odb_source *source;
271
272
options = add_common_options(builtin_multi_pack_index_repack_options);
273
@@ -278,12 +282,11 @@ static int cmd_multi_pack_index_repack(int argc, const char **argv,
282
if (argc)
283
usage_with_options(builtin_multi_pack_index_repack_usage,
284
options);
281
- handle_object_dir_option(the_repository);
285
+ source = handle_object_dir_option(the_repository);
286
287
FREE_AND_NULL(options);
288
285
- return midx_repack(the_repository, opts.object_dir,
286
- (size_t)opts.batch_size, opts.flags);
289
+ return midx_repack(source, (size_t)opts.batch_size, opts.flags);
290
}
291
292
int cmd_multi_pack_index(int argc,
builtin/repack.c
+1
-1
@@ -1711,7 +1711,7 @@ int cmd_repack(int argc,
1711
unsigned flags = 0;
1712
if (git_env_bool(GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL, 0))
1713
flags |= MIDX_WRITE_INCREMENTAL;
1714
- write_midx_file(the_repository, repo_get_object_directory(the_repository),
1714
+ write_midx_file(the_repository->objects->sources,
1715
NULL, NULL, flags);
1716
}
1717
midx-write.c
+31
-36
@@ -913,13 +913,6 @@ cleanup:
913
return ret;
914
}
915
916
-static struct multi_pack_index *lookup_multi_pack_index(struct repository *r,
917
- const char *object_dir)
918
-{
919
- struct odb_source *source = odb_find_source_or_die(r->objects, object_dir);
920
- return get_multi_pack_index(source);
921
-}
922
-
916
static int fill_packs_from_midx(struct write_midx_context *ctx,
917
const char *preferred_pack_name, uint32_t flags)
918
{
@@ -1010,7 +1003,7 @@ done:
1003
return ret;
1004
}
1005
1013
-static void clear_midx_files(struct repository *r, const char *object_dir,
1006
+static void clear_midx_files(struct odb_source *source,
1007
const char **hashes, uint32_t hashes_nr,
1008
unsigned incremental)
1009
{
@@ -1029,16 +1022,16 @@ static void clear_midx_files(struct repository *r, const char *object_dir,
1022
uint32_t i, j;
1023
1024
for (i = 0; i < ARRAY_SIZE(exts); i++) {
1032
- clear_incremental_midx_files_ext(object_dir, exts[i],
1025
+ clear_incremental_midx_files_ext(source->path, exts[i],
1026
hashes, hashes_nr);
1027
for (j = 0; j < hashes_nr; j++)
1035
- clear_midx_files_ext(object_dir, exts[i], hashes[j]);
1028
+ clear_midx_files_ext(source->path, exts[i], hashes[j]);
1029
}
1030
1031
if (incremental)
1039
- get_midx_filename(r->hash_algo, &buf, object_dir);
1032
+ get_midx_filename(source->odb->repo->hash_algo, &buf, source->path);
1033
else
1041
- get_midx_chain_filename(&buf, object_dir);
1034
+ get_midx_chain_filename(&buf, source->path);
1035
1036
if (unlink(buf.buf) && errno != ENOENT)
1037
die_errno(_("failed to clear multi-pack-index at %s"), buf.buf);
@@ -1046,13 +1039,14 @@ static void clear_midx_files(struct repository *r, const char *object_dir,
1039
strbuf_release(&buf);
1040
}
1041
1049
-static int write_midx_internal(struct repository *r, const char *object_dir,
1042
+static int write_midx_internal(struct odb_source *source,
1043
struct string_list *packs_to_include,
1044
struct string_list *packs_to_drop,
1045
const char *preferred_pack_name,
1046
const char *refs_snapshot,
1047
unsigned flags)
1048
{
1049
+ struct repository *r = source->odb->repo;
1050
struct strbuf midx_name = STRBUF_INIT;
1051
unsigned char midx_hash[GIT_MAX_RAWSZ];
1052
uint32_t i, start_pack;
@@ -1076,15 +1070,15 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1070
if (ctx.incremental)
1071
strbuf_addf(&midx_name,
1072
"%s/pack/multi-pack-index.d/tmp_midx_XXXXXX",
1079
- object_dir);
1073
+ source->path);
1074
else
1081
- get_midx_filename(r->hash_algo, &midx_name, object_dir);
1075
+ get_midx_filename(r->hash_algo, &midx_name, source->path);
1076
if (safe_create_leading_directories(r, midx_name.buf))
1077
die_errno(_("unable to create leading directories of %s"),
1078
midx_name.buf);
1079
1080
if (!packs_to_include || ctx.incremental) {
1087
- struct multi_pack_index *m = lookup_multi_pack_index(r, object_dir);
1081
+ struct multi_pack_index *m = get_multi_pack_index(source);
1082
if (m && !midx_checksum_valid(m)) {
1083
warning(_("ignoring existing multi-pack-index; checksum mismatch"));
1084
m = NULL;
@@ -1138,7 +1132,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1132
1133
ctx.to_include = packs_to_include;
1134
1141
- for_each_file_in_pack_dir(object_dir, add_pack_to_midx, &ctx);
1135
+ for_each_file_in_pack_dir(source->path, add_pack_to_midx, &ctx);
1136
stop_progress(&ctx.progress);
1137
1138
if ((ctx.m && ctx.nr == ctx.m->num_packs + ctx.m->num_packs_in_base) &&
@@ -1158,7 +1152,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1152
* corresponding bitmap (or one wasn't requested).
1153
*/
1154
if (!want_bitmap)
1161
- clear_midx_files_ext(object_dir, "bitmap", NULL);
1155
+ clear_midx_files_ext(source->path, "bitmap", NULL);
1156
goto cleanup;
1157
}
1158
}
@@ -1326,7 +1320,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1320
if (ctx.incremental) {
1321
struct strbuf lock_name = STRBUF_INIT;
1322
1329
- get_midx_chain_filename(&lock_name, object_dir);
1323
+ get_midx_chain_filename(&lock_name, source->path);
1324
hold_lock_file_for_update(&lk, lock_name.buf, LOCK_DIE_ON_ERROR);
1325
strbuf_release(&lock_name);
1326
@@ -1389,7 +1383,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1383
1384
if (flags & MIDX_WRITE_REV_INDEX &&
1385
git_env_bool("GIT_TEST_MIDX_WRITE_REV", 0))
1392
- write_midx_reverse_index(&ctx, object_dir, midx_hash);
1386
+ write_midx_reverse_index(&ctx, source->path, midx_hash);
1387
1388
if (flags & MIDX_WRITE_BITMAP) {
1389
struct packing_data pdata;
@@ -1412,7 +1406,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1406
FREE_AND_NULL(ctx.entries);
1407
ctx.entries_nr = 0;
1408
1415
- if (write_midx_bitmap(&ctx, object_dir,
1409
+ if (write_midx_bitmap(&ctx, source->path,
1410
midx_hash, &pdata, commits, commits_nr,
1411
flags) < 0) {
1412
error(_("could not write multi-pack bitmap"));
@@ -1446,7 +1440,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1440
return -1;
1441
1442
get_split_midx_filename_ext(r->hash_algo, &final_midx_name,
1449
- object_dir, midx_hash, MIDX_EXT_MIDX);
1443
+ source->path, midx_hash, MIDX_EXT_MIDX);
1444
1445
if (rename_tempfile(&incr, final_midx_name.buf) < 0) {
1446
error_errno(_("unable to rename new multi-pack-index layer"));
@@ -1479,7 +1473,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1473
if (commit_lock_file(&lk) < 0)
1474
die_errno(_("could not write multi-pack-index"));
1475
1482
- clear_midx_files(r, object_dir, keep_hashes,
1476
+ clear_midx_files(source, keep_hashes,
1477
ctx.num_multi_pack_indexes_before + 1,
1478
ctx.incremental);
1479
@@ -1508,29 +1502,29 @@ cleanup:
1502
return result;
1503
}
1504
1511
-int write_midx_file(struct repository *r, const char *object_dir,
1505
+int write_midx_file(struct odb_source *source,
1506
const char *preferred_pack_name,
1507
const char *refs_snapshot, unsigned flags)
1508
{
1515
- return write_midx_internal(r, object_dir, NULL, NULL,
1509
+ return write_midx_internal(source, NULL, NULL,
1510
preferred_pack_name, refs_snapshot,
1511
flags);
1512
}
1513
1520
-int write_midx_file_only(struct repository *r, const char *object_dir,
1514
+int write_midx_file_only(struct odb_source *source,
1515
struct string_list *packs_to_include,
1516
const char *preferred_pack_name,
1517
const char *refs_snapshot, unsigned flags)
1518
{
1525
- return write_midx_internal(r, object_dir, packs_to_include, NULL,
1519
+ return write_midx_internal(source, packs_to_include, NULL,
1520
preferred_pack_name, refs_snapshot, flags);
1521
}
1522
1529
-int expire_midx_packs(struct repository *r, const char *object_dir, unsigned flags)
1523
+int expire_midx_packs(struct odb_source *source, unsigned flags)
1524
{
1525
uint32_t i, *count, result = 0;
1526
struct string_list packs_to_drop = STRING_LIST_INIT_DUP;
1533
- struct multi_pack_index *m = lookup_multi_pack_index(r, object_dir);
1527
+ struct multi_pack_index *m = get_multi_pack_index(source);
1528
struct progress *progress = NULL;
1529
1530
if (!m)
@@ -1543,7 +1537,7 @@ int expire_midx_packs(struct repository *r, const char *object_dir, unsigned fla
1537
1538
if (flags & MIDX_PROGRESS)
1539
progress = start_delayed_progress(
1546
- r,
1540
+ source->odb->repo,
1541
_("Counting referenced objects"),
1542
m->num_objects);
1543
for (i = 0; i < m->num_objects; i++) {
@@ -1555,7 +1549,7 @@ int expire_midx_packs(struct repository *r, const char *object_dir, unsigned fla
1549
1550
if (flags & MIDX_PROGRESS)
1551
progress = start_delayed_progress(
1558
- r,
1552
+ source->odb->repo,
1553
_("Finding and deleting unreferenced packfiles"),
1554
m->num_packs);
1555
for (i = 0; i < m->num_packs; i++) {
@@ -1583,7 +1577,7 @@ int expire_midx_packs(struct repository *r, const char *object_dir, unsigned fla
1577
free(count);
1578
1579
if (packs_to_drop.nr)
1586
- result = write_midx_internal(r, object_dir, NULL,
1580
+ result = write_midx_internal(source, NULL,
1581
&packs_to_drop, NULL, NULL, flags);
1582
1583
string_list_clear(&packs_to_drop, 0);
@@ -1708,14 +1702,15 @@ static void fill_included_packs_batch(struct repository *r,
1702
free(pack_info);
1703
}
1704
1711
-int midx_repack(struct repository *r, const char *object_dir, size_t batch_size, unsigned flags)
1705
+int midx_repack(struct odb_source *source, size_t batch_size, unsigned flags)
1706
{
1707
+ struct repository *r = source->odb->repo;
1708
int result = 0;
1709
uint32_t i, packs_to_repack = 0;
1710
unsigned char *include_pack;
1711
struct child_process cmd = CHILD_PROCESS_INIT;
1712
FILE *cmd_in;
1718
- struct multi_pack_index *m = lookup_multi_pack_index(r, object_dir);
1713
+ struct multi_pack_index *m = get_multi_pack_index(source);
1714
1715
/*
1716
* When updating the default for these configuration
@@ -1749,7 +1744,7 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
1744
1745
strvec_push(&cmd.args, "pack-objects");
1746
1752
- strvec_pushf(&cmd.args, "%s/pack/pack", object_dir);
1747
+ strvec_pushf(&cmd.args, "%s/pack/pack", source->path);
1748
1749
if (delta_base_offset)
1750
strvec_push(&cmd.args, "--delta-base-offset");
@@ -1790,7 +1785,7 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
1785
goto cleanup;
1786
}
1787
1793
- result = write_midx_internal(r, object_dir, NULL, NULL, NULL, NULL,
1788
+ result = write_midx_internal(source, NULL, NULL, NULL, NULL,
1789
flags);
1790
1791
cleanup:
midx.h
+4
-4
@@ -126,17 +126,17 @@ int prepare_multi_pack_index_one(struct odb_source *source);
126
* Variant of write_midx_file which writes a MIDX containing only the packs
127
* specified in packs_to_include.
128
*/
129
-int write_midx_file(struct repository *r, const char *object_dir,
129
+int write_midx_file(struct odb_source *source,
130
const char *preferred_pack_name, const char *refs_snapshot,
131
unsigned flags);
132
-int write_midx_file_only(struct repository *r, const char *object_dir,
132
+int write_midx_file_only(struct odb_source *source,
133
struct string_list *packs_to_include,
134
const char *preferred_pack_name,
135
const char *refs_snapshot, unsigned flags);
136
void clear_midx_file(struct repository *r);
137
int verify_midx_file(struct odb_source *source, unsigned flags);
138
-int expire_midx_packs(struct repository *r, const char *object_dir, unsigned flags);
139
-int midx_repack(struct repository *r, const char *object_dir, size_t batch_size, unsigned flags);
138
+int expire_midx_packs(struct odb_source *source, unsigned flags);
139
+int midx_repack(struct odb_source *source, size_t batch_size, unsigned flags);
140
141
void close_midx(struct multi_pack_index *m);
142