548
free(step->csum);
549
}
550
551
+/*
552
+ * Build an append-only MIDX plan: a single WRITE step for the freshly
553
+ * written packs, plus COPY steps for every existing layer. No
554
+ * compaction or merging is performed.
555
+ */
556
+static void repack_make_midx_append_plan(struct repack_write_midx_opts *opts,
557
+ struct midx_compaction_step **steps_p,
558
+ size_t *steps_nr_p)
559
+{
560
+ struct multi_pack_index *m;
561
+ struct midx_compaction_step *steps = NULL;
562
+ struct midx_compaction_step *step;
563
+ size_t steps_nr = 0, steps_alloc = 0;
564
+
565
+ odb_reprepare(opts->existing->repo->objects);
566
+ m = get_multi_pack_index(opts->existing->source);
567
+
568
+ if (opts->names->nr) {
569
+ struct strbuf buf = STRBUF_INIT;
570
+ uint32_t i;
571
+
572
+ ALLOC_GROW(steps, st_add(steps_nr, 1), steps_alloc);
573
+
574
+ step = &steps[steps_nr++];
575
+ memset(step, 0, sizeof(*step));
576
+
577
+ step->type = MIDX_COMPACTION_STEP_WRITE;
578
+ string_list_init_dup(&step->u.write);
579
+
580
+ for (i = 0; i < opts->names->nr; i++) {
581
+ strbuf_reset(&buf);
582
+ strbuf_addf(&buf, "pack-%s.idx",
583
+ opts->names->items[i].string);
584
+ string_list_append(&step->u.write, buf.buf);
585
+ }
586
+
587
+ strbuf_release(&buf);
588
+ }
589
+
590
+ for (; m; m = m->base_midx) {
591
+ ALLOC_GROW(steps, st_add(steps_nr, 1), steps_alloc);
592
+
593
+ step = &steps[steps_nr++];
594
+ memset(step, 0, sizeof(*step));
595
+
596
+ step->type = MIDX_COMPACTION_STEP_COPY;
597
+ step->u.copy = m;
598
+ step->objects_nr = m->num_objects;
599
+ }
600
+
601
+ *steps_p = steps;
602
+ *steps_nr_p = steps_nr;
603
+}
604
+
605
static int repack_make_midx_compaction_plan(struct repack_write_midx_opts *opts,
606
struct midx_compaction_step **steps_p,
607
size_t *steps_nr_p)
958
goto done;
959
}
960
907
- if (repack_make_midx_compaction_plan(opts, &steps, &steps_nr) < 0) {
908
- ret = error(_("unable to generate compaction plan"));
909
- goto done;
961
+ if (opts->geometry->split_factor) {
962
+ if (repack_make_midx_compaction_plan(opts, &steps, &steps_nr) < 0) {
963
+ ret = error(_("unable to generate compaction plan"));
964
+ goto done;
965
+ }
966
+ } else {
967
+ repack_make_midx_append_plan(opts, &steps, &steps_nr);
968
}
969
970
for (i = 0; i < steps_nr; i++) {