@@ -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 ());
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 );
@@ -1254,8 +1273,8 @@ static void increment_totals(struct survey_context *ctx,
12541273 ctx -> report .reachable_objects .commits .parent_cnt_pbin [k ]++ ;
12551274 base = & ctx -> report .reachable_objects .commits .base ;
12561275
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 );
1276+ maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_nr_parents , k , & commit -> object .oid , NULL , & commit -> object . oid );
1277+ maybe_insert_large_item (ctx -> report .reachable_objects .commits .vec_largest_by_size_bytes , object_length , & commit -> object .oid , NULL , & commit -> object . oid );
12591278 break ;
12601279 }
12611280 case OBJ_TREE : {
@@ -1275,8 +1294,8 @@ static void increment_totals(struct survey_context *ctx,
12751294
12761295 pst -> sum_entries += nr_entries ;
12771296
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 );
1297+ maybe_insert_large_item (pst -> vec_largest_by_nr_entries , nr_entries , & tree -> object .oid , path , NULL );
1298+ maybe_insert_large_item (pst -> vec_largest_by_size_bytes , object_length , & tree -> object .oid , path , NULL );
12801299
12811300 qb = qbin (nr_entries );
12821301 incr_obj_hist_bin (& pst -> entry_qbin [qb ], object_length , disk_sizep );
@@ -1287,7 +1306,7 @@ static void increment_totals(struct survey_context *ctx,
12871306 case OBJ_BLOB :
12881307 base = & ctx -> report .reachable_objects .blobs .base ;
12891308
1290- maybe_insert_large_item (ctx -> report .reachable_objects .blobs .vec_largest_by_size_bytes , object_length , & oids -> oid [i ], path );
1309+ maybe_insert_large_item (ctx -> report .reachable_objects .blobs .vec_largest_by_size_bytes , object_length , & oids -> oid [i ], path , NULL );
12911310 break ;
12921311 default :
12931312 continue ;
0 commit comments