@@ -156,6 +156,7 @@ static void incr_obj_hist_bin(struct obj_hist_bin *pbin,
156
156
struct large_item {
157
157
uint64_t size ;
158
158
struct object_id oid ;
159
+ struct strbuf name ;
159
160
};
160
161
161
162
struct large_item_vec {
@@ -171,6 +172,7 @@ static struct large_item_vec *alloc_large_item_vec(const char *dimension_label,
171
172
{
172
173
struct large_item_vec * vec ;
173
174
size_t flex_len = nr_items * sizeof (struct large_item );
175
+ size_t k ;
174
176
175
177
if (!nr_items )
176
178
return NULL ;
@@ -180,6 +182,9 @@ static struct large_item_vec *alloc_large_item_vec(const char *dimension_label,
180
182
vec -> item_label = strdup (item_label );
181
183
vec -> nr_items = nr_items ;
182
184
185
+ for (k = 0 ; k < nr_items ; k ++ )
186
+ strbuf_init (& vec -> items [k ].name , 0 );
187
+
183
188
return vec ;
184
189
}
185
190
@@ -188,14 +193,18 @@ static void free_large_item_vec(struct large_item_vec *vec)
188
193
if (!vec )
189
194
return ;
190
195
196
+ for (size_t k = 0 ; k < vec -> nr_items ; k ++ )
197
+ strbuf_release (& vec -> items [k ].name );
198
+
191
199
free (vec -> dimension_label );
192
200
free (vec -> item_label );
193
201
free (vec );
194
202
}
195
203
196
204
static void maybe_insert_large_item (struct large_item_vec * vec ,
197
205
uint64_t size ,
198
- struct object_id * oid )
206
+ struct object_id * oid ,
207
+ const char * name )
199
208
{
200
209
size_t rest_len ;
201
210
size_t k ;
@@ -215,7 +224,14 @@ static void maybe_insert_large_item(struct large_item_vec *vec,
215
224
if (size < vec -> items [k ].size )
216
225
continue ;
217
226
218
- /* push items[k..] down one and insert it here */
227
+ /*
228
+ * The last large_item in the vector is about to be
229
+ * overwritten by the previous one during the shift.
230
+ * Steal its allocated strbuf and reuse it.
231
+ */
232
+ strbuf_release (& vec -> items [vec -> nr_items - 1 ].name );
233
+
234
+ /* push items[k..] down one and insert data for this item here */
219
235
220
236
rest_len = (vec -> nr_items - k - 1 ) * sizeof (struct large_item );
221
237
if (rest_len )
@@ -224,6 +240,10 @@ static void maybe_insert_large_item(struct large_item_vec *vec,
224
240
memset (& vec -> items [k ], 0 , sizeof (struct large_item ));
225
241
vec -> items [k ].size = size ;
226
242
oidcpy (& vec -> items [k ].oid , oid );
243
+ strbuf_init (& vec -> items [k ].name , 0 );
244
+ if (name && * name )
245
+ strbuf_addstr (& vec -> items [k ].name , name );
246
+
227
247
return ;
228
248
}
229
249
}
@@ -728,15 +748,15 @@ static void survey_report_largest_vec(struct large_item_vec *vec)
728
748
return ;
729
749
730
750
table .table_name = vec -> dimension_label ;
731
- strvec_pushl (& table .header , "Size" , "OID" , NULL );
751
+ strvec_pushl (& table .header , "Size" , "OID" , "Name" , NULL );
732
752
733
753
for (size_t k = 0 ; k < vec -> nr_items ; k ++ ) {
734
754
struct large_item * pk = & vec -> items [k ];
735
755
if (!is_null_oid (& pk -> oid )) {
736
756
strbuf_reset (& size );
737
757
strbuf_addf (& size , "%" PRIuMAX , (uintmax_t )pk -> size );
738
758
739
- insert_table_rowv (& table , size .buf , oid_to_hex (& pk -> oid ), NULL );
759
+ insert_table_rowv (& table , size .buf , oid_to_hex (& pk -> oid ), pk -> name . buf , NULL );
740
760
}
741
761
}
742
762
strbuf_release (& size );
@@ -1197,7 +1217,8 @@ static void increment_object_counts(
1197
1217
1198
1218
static void increment_totals (struct survey_context * ctx ,
1199
1219
struct oid_array * oids ,
1200
- struct survey_report_object_size_summary * summary )
1220
+ struct survey_report_object_size_summary * summary ,
1221
+ const char * path )
1201
1222
{
1202
1223
for (size_t i = 0 ; i < oids -> nr ; i ++ ) {
1203
1224
struct object_info oi = OBJECT_INFO_INIT ;
@@ -1233,8 +1254,8 @@ static void increment_totals(struct survey_context *ctx,
1233
1254
ctx -> report .reachable_objects .commits .parent_cnt_pbin [k ]++ ;
1234
1255
base = & ctx -> report .reachable_objects .commits .base ;
1235
1256
1236
- maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_nr_parents , k , & commit -> object .oid );
1237
- maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_size_bytes , object_length , & commit -> object .oid );
1257
+ maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_nr_parents , k , & commit -> object .oid , NULL );
1258
+ maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_size_bytes , object_length , & commit -> object .oid , NULL );
1238
1259
break ;
1239
1260
}
1240
1261
case OBJ_TREE : {
@@ -1254,8 +1275,8 @@ static void increment_totals(struct survey_context *ctx,
1254
1275
1255
1276
pst -> sum_entries += nr_entries ;
1256
1277
1257
- maybe_insert_large_item (pst -> vec_largest_by_nr_entries , nr_entries , & tree -> object .oid );
1258
- maybe_insert_large_item (pst -> vec_largest_by_size_bytes , object_length , & tree -> object .oid );
1278
+ maybe_insert_large_item (pst -> vec_largest_by_nr_entries , nr_entries , & tree -> object .oid , path );
1279
+ maybe_insert_large_item (pst -> vec_largest_by_size_bytes , object_length , & tree -> object .oid , path );
1259
1280
1260
1281
qb = qbin (nr_entries );
1261
1282
incr_obj_hist_bin (& pst -> entry_qbin [qb ], object_length , disk_sizep );
@@ -1266,7 +1287,7 @@ static void increment_totals(struct survey_context *ctx,
1266
1287
case OBJ_BLOB :
1267
1288
base = & ctx -> report .reachable_objects .blobs .base ;
1268
1289
1269
- maybe_insert_large_item (ctx -> report .reachable_objects .blobs .vec_largest_by_size_bytes , object_length , & oids -> oid [i ]);
1290
+ maybe_insert_large_item (ctx -> report .reachable_objects .blobs .vec_largest_by_size_bytes , object_length , & oids -> oid [i ], path );
1270
1291
break ;
1271
1292
default :
1272
1293
continue ;
@@ -1306,7 +1327,7 @@ static void increment_object_totals(struct survey_context *ctx,
1306
1327
struct survey_report_object_size_summary * total ;
1307
1328
struct survey_report_object_size_summary summary = { 0 };
1308
1329
1309
- increment_totals (ctx , oids , & summary );
1330
+ increment_totals (ctx , oids , & summary , path );
1310
1331
1311
1332
switch (type ) {
1312
1333
case OBJ_COMMIT :
0 commit comments