@@ -2270,12 +2270,17 @@ int for_each_packed_object(each_packed_object_fn cb, void *data,
22702270 return r ? r : pack_errors ;
22712271}
22722272
2273+ struct promisor_objects {
2274+ struct oidset promisor_pack_objects ;
2275+ struct oidset promisor_pack_referenced_objects ;
2276+ };
2277+
22732278static int add_promisor_object (const struct object_id * oid ,
22742279 struct packed_git * pack UNUSED ,
22752280 uint32_t pos UNUSED ,
22762281 void * set_ )
22772282{
2278- struct oidset * set = set_ ;
2283+ struct promisor_objects * set = set_ ;
22792284 struct object * obj ;
22802285 int we_parsed_object ;
22812286
@@ -2290,7 +2295,7 @@ static int add_promisor_object(const struct object_id *oid,
22902295 if (!obj )
22912296 return 1 ;
22922297
2293- oidset_insert (set , oid );
2298+ oidset_insert (& set -> promisor_pack_objects , oid );
22942299
22952300 /*
22962301 * If this is a tree, commit, or tag, the objects it refers
@@ -2308,26 +2313,26 @@ static int add_promisor_object(const struct object_id *oid,
23082313 */
23092314 return 0 ;
23102315 while (tree_entry_gently (& desc , & entry ))
2311- oidset_insert (set , & entry .oid );
2316+ oidset_insert (& set -> promisor_pack_referenced_objects , & entry .oid );
23122317 if (we_parsed_object )
23132318 free_tree_buffer (tree );
23142319 } else if (obj -> type == OBJ_COMMIT ) {
23152320 struct commit * commit = (struct commit * ) obj ;
23162321 struct commit_list * parents = commit -> parents ;
23172322
2318- oidset_insert (set , get_commit_tree_oid (commit ));
2323+ oidset_insert (& set -> promisor_pack_referenced_objects , get_commit_tree_oid (commit ));
23192324 for (; parents ; parents = parents -> next )
2320- oidset_insert (set , & parents -> item -> object .oid );
2325+ oidset_insert (& set -> promisor_pack_referenced_objects , & parents -> item -> object .oid );
23212326 } else if (obj -> type == OBJ_TAG ) {
23222327 struct tag * tag = (struct tag * ) obj ;
2323- oidset_insert (set , get_tagged_oid (tag ));
2328+ oidset_insert (& set -> promisor_pack_referenced_objects , get_tagged_oid (tag ));
23242329 }
23252330 return 0 ;
23262331}
23272332
2328- int is_promisor_object (const struct object_id * oid )
2333+ int is_in_promisor_pack (const struct object_id * oid , int referenced )
23292334{
2330- static struct oidset promisor_objects ;
2335+ static struct promisor_objects promisor_objects ;
23312336 static int promisor_objects_prepared ;
23322337
23332338 if (!promisor_objects_prepared ) {
@@ -2339,5 +2344,6 @@ int is_promisor_object(const struct object_id *oid)
23392344 }
23402345 promisor_objects_prepared = 1 ;
23412346 }
2342- return oidset_contains (& promisor_objects , oid );
2347+ return oidset_contains (& promisor_objects .promisor_pack_objects , oid ) ||
2348+ (referenced && oidset_contains (& promisor_objects .promisor_pack_referenced_objects , oid ));
23432349}
0 commit comments