@@ -2223,12 +2223,17 @@ int for_each_packed_object(each_packed_object_fn cb, void *data,
22232223 return r ? r : pack_errors ;
22242224}
22252225
2226+ struct promisor_objects {
2227+ struct oidset promisor_pack_objects ;
2228+ struct oidset promisor_pack_referenced_objects ;
2229+ };
2230+
22262231static int add_promisor_object (const struct object_id * oid ,
22272232 struct packed_git * pack UNUSED ,
22282233 uint32_t pos UNUSED ,
22292234 void * set_ )
22302235{
2231- struct oidset * set = set_ ;
2236+ struct promisor_objects * set = set_ ;
22322237 struct object * obj ;
22332238 int we_parsed_object ;
22342239
@@ -2243,7 +2248,7 @@ static int add_promisor_object(const struct object_id *oid,
22432248 if (!obj )
22442249 return 1 ;
22452250
2246- oidset_insert (set , oid );
2251+ oidset_insert (& set -> promisor_pack_objects , oid );
22472252
22482253 /*
22492254 * If this is a tree, commit, or tag, the objects it refers
@@ -2261,26 +2266,26 @@ static int add_promisor_object(const struct object_id *oid,
22612266 */
22622267 return 0 ;
22632268 while (tree_entry_gently (& desc , & entry ))
2264- oidset_insert (set , & entry .oid );
2269+ oidset_insert (& set -> promisor_pack_referenced_objects , & entry .oid );
22652270 if (we_parsed_object )
22662271 free_tree_buffer (tree );
22672272 } else if (obj -> type == OBJ_COMMIT ) {
22682273 struct commit * commit = (struct commit * ) obj ;
22692274 struct commit_list * parents = commit -> parents ;
22702275
2271- oidset_insert (set , get_commit_tree_oid (commit ));
2276+ oidset_insert (& set -> promisor_pack_referenced_objects , get_commit_tree_oid (commit ));
22722277 for (; parents ; parents = parents -> next )
2273- oidset_insert (set , & parents -> item -> object .oid );
2278+ oidset_insert (& set -> promisor_pack_referenced_objects , & parents -> item -> object .oid );
22742279 } else if (obj -> type == OBJ_TAG ) {
22752280 struct tag * tag = (struct tag * ) obj ;
2276- oidset_insert (set , get_tagged_oid (tag ));
2281+ oidset_insert (& set -> promisor_pack_referenced_objects , get_tagged_oid (tag ));
22772282 }
22782283 return 0 ;
22792284}
22802285
2281- int is_promisor_object (const struct object_id * oid )
2286+ int is_in_promisor_pack (const struct object_id * oid , int referenced )
22822287{
2283- static struct oidset promisor_objects ;
2288+ static struct promisor_objects promisor_objects ;
22842289 static int promisor_objects_prepared ;
22852290
22862291 if (!promisor_objects_prepared ) {
@@ -2292,5 +2297,6 @@ int is_promisor_object(const struct object_id *oid)
22922297 }
22932298 promisor_objects_prepared = 1 ;
22942299 }
2295- return oidset_contains (& promisor_objects , oid );
2300+ return oidset_contains (& promisor_objects .promisor_pack_objects , oid ) ||
2301+ (referenced && oidset_contains (& promisor_objects .promisor_pack_referenced_objects , oid ));
22962302}
0 commit comments