@@ -481,8 +481,7 @@ static void add_root_refs(struct files_ref_store *refs,
481481 for_each_root_ref (refs , fill_root_ref , & data );
482482}
483483
484- static struct ref_cache * get_loose_ref_cache (struct files_ref_store * refs ,
485- unsigned int flags )
484+ static struct ref_cache * get_loose_ref_cache (struct files_ref_store * refs )
486485{
487486 if (!refs -> loose ) {
488487 struct ref_dir * dir ;
@@ -499,9 +498,6 @@ static struct ref_cache *get_loose_ref_cache(struct files_ref_store *refs,
499498
500499 dir = get_ref_dir (refs -> loose -> root );
501500
502- if (flags & REFS_FOR_EACH_INCLUDE_ROOT_REFS )
503- add_root_refs (refs , dir );
504-
505501 /*
506502 * Add an incomplete entry for "refs/" (to be filled
507503 * lazily):
@@ -511,6 +507,19 @@ static struct ref_cache *get_loose_ref_cache(struct files_ref_store *refs,
511507 return refs -> loose ;
512508}
513509
510+ /*
511+ * Root refs are kept out of the loose ref cache because ref iterators must
512+ * only include them when requested with REFS_FOR_EACH_INCLUDE_ROOT_REFS.
513+ */
514+ static struct ref_cache * create_root_ref_cache (struct files_ref_store * refs )
515+ {
516+ struct ref_cache * cache = create_ref_cache (& refs -> base , NULL );
517+
518+ cache -> root -> flag &= ~REF_INCOMPLETE ;
519+ add_root_refs (refs , get_ref_dir (cache -> root ));
520+ return cache ;
521+ }
522+
514523static int read_ref_internal (struct ref_store * ref_store , const char * refname ,
515524 struct object_id * oid , struct strbuf * referent ,
516525 unsigned int * type , int * failure_errno , int skip_packed_refs )
@@ -1004,6 +1013,7 @@ struct files_ref_iterator {
10041013 struct ref_iterator base ;
10051014
10061015 struct ref_iterator * iter0 ;
1016+ struct ref_cache * root_refs ;
10071017 struct repository * repo ;
10081018 unsigned int flags ;
10091019};
@@ -1053,6 +1063,7 @@ static void files_ref_iterator_release(struct ref_iterator *ref_iterator)
10531063 struct files_ref_iterator * iter =
10541064 (struct files_ref_iterator * )ref_iterator ;
10551065 ref_iterator_free (iter -> iter0 );
1066+ free_ref_cache (iter -> root_refs );
10561067}
10571068
10581069static struct ref_iterator_vtable files_ref_iterator_vtable = {
@@ -1068,6 +1079,7 @@ static struct ref_iterator *files_ref_iterator_begin(
10681079{
10691080 struct files_ref_store * refs ;
10701081 struct ref_iterator * loose_iter , * packed_iter , * overlay_iter ;
1082+ struct ref_cache * root_refs = NULL ;
10711083 struct files_ref_iterator * iter ;
10721084 struct ref_iterator * ref_iterator ;
10731085 unsigned int required_flags = REF_STORE_READ ;
@@ -1094,9 +1106,17 @@ static struct ref_iterator *files_ref_iterator_begin(
10941106 * disk, and re-reads it if not.
10951107 */
10961108
1097- loose_iter = cache_ref_iterator_begin (get_loose_ref_cache (refs , flags ),
1109+ loose_iter = cache_ref_iterator_begin (get_loose_ref_cache (refs ),
10981110 prefix , ref_store -> repo , 1 );
10991111
1112+ if (flags & REFS_FOR_EACH_INCLUDE_ROOT_REFS ) {
1113+ root_refs = create_root_ref_cache (refs );
1114+ loose_iter = overlay_ref_iterator_begin (
1115+ cache_ref_iterator_begin (root_refs , prefix ,
1116+ ref_store -> repo , 0 ),
1117+ loose_iter );
1118+ }
1119+
11001120 /*
11011121 * The packed-refs file might contain broken references, for
11021122 * example an old version of a reference that points at an
@@ -1118,6 +1138,7 @@ static struct ref_iterator *files_ref_iterator_begin(
11181138 ref_iterator = & iter -> base ;
11191139 base_ref_iterator_init (ref_iterator , & files_ref_iterator_vtable );
11201140 iter -> iter0 = overlay_iter ;
1141+ iter -> root_refs = root_refs ;
11211142 iter -> repo = ref_store -> repo ;
11221143 iter -> flags = flags ;
11231144
@@ -1490,7 +1511,7 @@ static int should_pack_refs(struct files_ref_store *refs,
14901511 if (limit < 16 )
14911512 limit = 16 ;
14921513
1493- iter = cache_ref_iterator_begin (get_loose_ref_cache (refs , 0 ), NULL ,
1514+ iter = cache_ref_iterator_begin (get_loose_ref_cache (refs ), NULL ,
14941515 refs -> base .repo , 0 );
14951516 while ((ret = ref_iterator_advance (iter )) == ITER_OK ) {
14961517 if (should_pack_ref (refs , & iter -> ref , opts ))
@@ -1530,7 +1551,7 @@ static int files_optimize(struct ref_store *ref_store,
15301551
15311552 packed_refs_lock (refs -> packed_ref_store , LOCK_DIE_ON_ERROR , & err );
15321553
1533- iter = cache_ref_iterator_begin (get_loose_ref_cache (refs , 0 ), NULL ,
1554+ iter = cache_ref_iterator_begin (get_loose_ref_cache (refs ), NULL ,
15341555 refs -> base .repo , 0 );
15351556 while ((ok = ref_iterator_advance (iter )) == ITER_OK ) {
15361557 /*
0 commit comments