@@ -156,7 +156,21 @@ static void incr_obj_hist_bin(struct obj_hist_bin *pbin,
156156struct large_item {
157157 uint64_t size ;
158158 struct object_id oid ;
159+
160+ /*
161+ * For blobs and trees the name field is the pathname of the
162+ * file or directory. Root trees will have a zero-length
163+ * name. The name field is not currenly used for commits.
164+ */
159165 struct strbuf name ;
166+
167+ /*
168+ * For blobs and trees remember the transient commit from
169+ * the treewalk so that we can say that this large item
170+ * first appeared in this commit (relative to the treewalk
171+ * order).
172+ */
173+ struct object_id containing_commit_oid ;
160174};
161175
162176struct large_item_vec {
@@ -204,7 +218,8 @@ static void free_large_item_vec(struct large_item_vec *vec)
204218static void maybe_insert_large_item (struct large_item_vec * vec ,
205219 uint64_t size ,
206220 struct object_id * oid ,
207- const char * name )
221+ const char * name ,
222+ const struct object_id * containing_commit_oid )
208223{
209224 size_t rest_len ;
210225 size_t k ;
@@ -240,6 +255,7 @@ static void maybe_insert_large_item(struct large_item_vec *vec,
240255 memset (& vec -> items [k ], 0 , sizeof (struct large_item ));
241256 vec -> items [k ].size = size ;
242257 oidcpy (& vec -> items [k ].oid , oid );
258+ oidcpy (& vec -> items [k ].containing_commit_oid , containing_commit_oid ? containing_commit_oid : null_oid (the_hash_algo ));
243259 strbuf_init (& vec -> items [k ].name , 0 );
244260 if (name && * name )
245261 strbuf_addstr (& vec -> items [k ].name , name );
@@ -748,15 +764,18 @@ static void survey_report_largest_vec(struct large_item_vec *vec)
748764 return ;
749765
750766 table .table_name = vec -> dimension_label ;
751- strvec_pushl (& table .header , "Size" , "OID" , "Name" , NULL );
767+ strvec_pushl (& table .header , "Size" , "OID" , "Name" , "Commit" , NULL );
752768
753769 for (size_t k = 0 ; k < vec -> nr_items ; k ++ ) {
754770 struct large_item * pk = & vec -> items [k ];
755771 if (!is_null_oid (& pk -> oid )) {
756772 strbuf_reset (& size );
757773 strbuf_addf (& size , "%" PRIuMAX , (uintmax_t )pk -> size );
758774
759- insert_table_rowv (& table , size .buf , oid_to_hex (& pk -> oid ), pk -> name .buf , NULL );
775+ insert_table_rowv (& table , size .buf , oid_to_hex (& pk -> oid ), pk -> name .buf ,
776+ is_null_oid (& pk -> containing_commit_oid ) ?
777+ "" : oid_to_hex (& pk -> containing_commit_oid ),
778+ NULL );
760779 }
761780 }
762781 strbuf_release (& size );
@@ -1256,8 +1275,8 @@ static void increment_totals(struct survey_context *ctx,
12561275 ctx -> report .reachable_objects .commits .parent_cnt_pbin [k ]++ ;
12571276 base = & ctx -> report .reachable_objects .commits .base ;
12581277
1259- maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_nr_parents , k , & commit -> object .oid , NULL );
1260- maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_size_bytes , object_length , & commit -> object .oid , NULL );
1278+ maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_nr_parents , k , & commit -> object .oid , NULL , & commit -> object . oid );
1279+ maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_size_bytes , object_length , & commit -> object .oid , NULL , & commit -> object . oid );
12611280 break ;
12621281 }
12631282 case OBJ_TREE : {
@@ -1277,8 +1296,8 @@ static void increment_totals(struct survey_context *ctx,
12771296
12781297 pst -> sum_entries += nr_entries ;
12791298
1280- maybe_insert_large_item (pst -> vec_largest_by_nr_entries , nr_entries , & tree -> object .oid , path );
1281- maybe_insert_large_item (pst -> vec_largest_by_size_bytes , object_length , & tree -> object .oid , path );
1299+ maybe_insert_large_item (pst -> vec_largest_by_nr_entries , nr_entries , & tree -> object .oid , path , NULL );
1300+ maybe_insert_large_item (pst -> vec_largest_by_size_bytes , object_length , & tree -> object .oid , path , NULL );
12821301
12831302 qb = qbin (nr_entries );
12841303 incr_obj_hist_bin (& pst -> entry_qbin [qb ], object_length , disk_sizep );
@@ -1289,7 +1308,7 @@ static void increment_totals(struct survey_context *ctx,
12891308 case OBJ_BLOB :
12901309 base = & ctx -> report .reachable_objects .blobs .base ;
12911310
1292- maybe_insert_large_item (ctx -> report .reachable_objects .blobs .vec_largest_by_size_bytes , object_length , & oids -> oid [i ], path );
1311+ maybe_insert_large_item (ctx -> report .reachable_objects .blobs .vec_largest_by_size_bytes , object_length , & oids -> oid [i ], path , NULL );
12931312 break ;
12941313 default :
12951314 continue ;
0 commit comments