repack-geometry: extract function to compute repacking split

We're about to add a second caller that wants to compute the repacking split for a set of packfiles. Split out the function that computes this split to prepare for that. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Jan 5, 2026 at 14:16 UTC 861248b946b68822375d2fe3cdffa174bf73104c
1 file changed +21 -18
repack-geometry.c
+21 -18
@@ -78,33 +78,32 @@ void pack_geometry_init(struct pack_geometry *geometry,
78 strbuf_release(&buf);
79 }
80
81 -void pack_geometry_split(struct pack_geometry *geometry)
81 +static uint32_t compute_pack_geometry_split(struct packed_git **pack, size_t pack_nr,
82 + int split_factor)
83 {
84 uint32_t i;
85 uint32_t split;
86 off_t total_size = 0;
87
87 - if (!geometry->pack_nr) {
88 - geometry->split = geometry->pack_nr;
89 - return;
90 - }
88 + if (!pack_nr)
89 + return 0;
90
91 /*
92 * First, count the number of packs (in descending order of size) which
93 * already form a geometric progression.
94 */
96 - for (i = geometry->pack_nr - 1; i > 0; i--) {
97 - struct packed_git *ours = geometry->pack[i];
98 - struct packed_git *prev = geometry->pack[i - 1];
95 + for (i = pack_nr - 1; i > 0; i--) {
96 + struct packed_git *ours = pack[i];
97 + struct packed_git *prev = pack[i - 1];
98
100 - if (unsigned_mult_overflows(geometry->split_factor,
99 + if (unsigned_mult_overflows(split_factor,
100 pack_geometry_weight(prev)))
101 die(_("pack %s too large to consider in geometric "
102 "progression"),
103 prev->pack_name);
104
105 if (pack_geometry_weight(ours) <
107 - geometry->split_factor * pack_geometry_weight(prev))
106 + split_factor * pack_geometry_weight(prev))
107 break;
108 }
109
@@ -130,21 +129,19 @@ void pack_geometry_split(struct pack_geometry *geometry)
129 * the geometric progression.
130 */
131 for (i = 0; i < split; i++) {
133 - struct packed_git *p = geometry->pack[i];
132 + struct packed_git *p = pack[i];
133
134 if (unsigned_add_overflows(total_size, pack_geometry_weight(p)))
135 die(_("pack %s too large to roll up"), p->pack_name);
136 total_size += pack_geometry_weight(p);
137 }
139 - for (i = split; i < geometry->pack_nr; i++) {
140 - struct packed_git *ours = geometry->pack[i];
138 + for (i = split; i < pack_nr; i++) {
139 + struct packed_git *ours = pack[i];
140
142 - if (unsigned_mult_overflows(geometry->split_factor,
143 - total_size))
141 + if (unsigned_mult_overflows(split_factor, total_size))
142 die(_("pack %s too large to roll up"), ours->pack_name);
143
146 - if (pack_geometry_weight(ours) <
147 - geometry->split_factor * total_size) {
144 + if (pack_geometry_weight(ours) < split_factor * total_size) {
145 if (unsigned_add_overflows(total_size,
146 pack_geometry_weight(ours)))
147 die(_("pack %s too large to roll up"),
@@ -156,7 +153,13 @@ void pack_geometry_split(struct pack_geometry *geometry)
153 break;
154 }
155
159 - geometry->split = split;
156 + return split;
157 +}
158 +
159 +void pack_geometry_split(struct pack_geometry *geometry)
160 +{
161 + geometry->split = compute_pack_geometry_split(geometry->pack, geometry->pack_nr,
162 + geometry->split_factor);
163 }
164
165 struct packed_git *pack_geometry_preferred_pack(struct pack_geometry *geometry)