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)