@@ -62,6 +62,7 @@ struct upload_pack_data {
6262 struct object_array have_obj ;
6363 struct oid_array haves ; /* v2 only */
6464 struct string_list wanted_refs ; /* v2 only */
65+ struct string_list hidden_refs ;
6566
6667 struct object_array shallows ;
6768 struct string_list deepen_not ;
@@ -118,6 +119,7 @@ static void upload_pack_data_init(struct upload_pack_data *data)
118119{
119120 struct string_list symref = STRING_LIST_INIT_DUP ;
120121 struct string_list wanted_refs = STRING_LIST_INIT_DUP ;
122+ struct string_list hidden_refs = STRING_LIST_INIT_DUP ;
121123 struct object_array want_obj = OBJECT_ARRAY_INIT ;
122124 struct object_array have_obj = OBJECT_ARRAY_INIT ;
123125 struct oid_array haves = OID_ARRAY_INIT ;
@@ -130,6 +132,7 @@ static void upload_pack_data_init(struct upload_pack_data *data)
130132 memset (data , 0 , sizeof (* data ));
131133 data -> symref = symref ;
132134 data -> wanted_refs = wanted_refs ;
135+ data -> hidden_refs = hidden_refs ;
133136 data -> want_obj = want_obj ;
134137 data -> have_obj = have_obj ;
135138 data -> haves = haves ;
@@ -151,6 +154,7 @@ static void upload_pack_data_clear(struct upload_pack_data *data)
151154{
152155 string_list_clear (& data -> symref , 1 );
153156 string_list_clear (& data -> wanted_refs , 1 );
157+ string_list_clear (& data -> hidden_refs , 0 );
154158 object_array_clear (& data -> want_obj );
155159 object_array_clear (& data -> have_obj );
156160 oid_array_clear (& data -> haves );
@@ -842,8 +846,8 @@ static void deepen(struct upload_pack_data *data, int depth)
842846 * Checking for reachable shallows requires that our refs be
843847 * marked with OUR_REF.
844848 */
845- head_ref_namespaced (check_ref , NULL );
846- for_each_namespaced_ref (check_ref , NULL );
849+ head_ref_namespaced (check_ref , data );
850+ for_each_namespaced_ref (check_ref , data );
847851
848852 get_reachable_list (data , & reachable_shallows );
849853 result = get_shallow_commits (& reachable_shallows ,
@@ -1158,11 +1162,11 @@ static void receive_needs(struct upload_pack_data *data,
11581162
11591163/* return non-zero if the ref is hidden, otherwise 0 */
11601164static int mark_our_ref (const char * refname , const char * refname_full ,
1161- const struct object_id * oid )
1165+ const struct object_id * oid , const struct string_list * hidden_refs )
11621166{
11631167 struct object * o = lookup_unknown_object (the_repository , oid );
11641168
1165- if (ref_is_hidden (refname , refname_full )) {
1169+ if (ref_is_hidden (refname , refname_full , hidden_refs )) {
11661170 o -> flags |= HIDDEN_REF ;
11671171 return 1 ;
11681172 }
@@ -1171,11 +1175,12 @@ static int mark_our_ref(const char *refname, const char *refname_full,
11711175}
11721176
11731177static int check_ref (const char * refname_full , const struct object_id * oid ,
1174- int flag UNUSED , void * cb_data UNUSED )
1178+ int flag UNUSED , void * cb_data )
11751179{
11761180 const char * refname = strip_namespace (refname_full );
1181+ struct upload_pack_data * data = cb_data ;
11771182
1178- mark_our_ref (refname , refname_full , oid );
1183+ mark_our_ref (refname , refname_full , oid , & data -> hidden_refs );
11791184 return 0 ;
11801185}
11811186
@@ -1204,7 +1209,7 @@ static int send_ref(const char *refname, const struct object_id *oid,
12041209 struct object_id peeled ;
12051210 struct upload_pack_data * data = cb_data ;
12061211
1207- if (mark_our_ref (refname_nons , refname , oid ))
1212+ if (mark_our_ref (refname_nons , refname , oid , & data -> hidden_refs ))
12081213 return 0 ;
12091214
12101215 if (capabilities ) {
@@ -1327,7 +1332,7 @@ static int upload_pack_config(const char *var, const char *value, void *cb_data)
13271332 if (parse_object_filter_config (var , value , data ) < 0 )
13281333 return -1 ;
13291334
1330- return parse_hide_refs_config (var , value , "uploadpack" );
1335+ return parse_hide_refs_config (var , value , "uploadpack" , & data -> hidden_refs );
13311336}
13321337
13331338static int upload_pack_protected_config (const char * var , const char * value , void * cb_data )
@@ -1375,8 +1380,8 @@ void upload_pack(const int advertise_refs, const int stateless_rpc,
13751380 advertise_shallow_grafts (1 );
13761381 packet_flush (1 );
13771382 } else {
1378- head_ref_namespaced (check_ref , NULL );
1379- for_each_namespaced_ref (check_ref , NULL );
1383+ head_ref_namespaced (check_ref , & data );
1384+ for_each_namespaced_ref (check_ref , & data );
13801385 }
13811386
13821387 if (!advertise_refs ) {
@@ -1441,6 +1446,7 @@ static int parse_want(struct packet_writer *writer, const char *line,
14411446
14421447static int parse_want_ref (struct packet_writer * writer , const char * line ,
14431448 struct string_list * wanted_refs ,
1449+ struct string_list * hidden_refs ,
14441450 struct object_array * want_obj )
14451451{
14461452 const char * refname_nons ;
@@ -1451,7 +1457,7 @@ static int parse_want_ref(struct packet_writer *writer, const char *line,
14511457 struct strbuf refname = STRBUF_INIT ;
14521458
14531459 strbuf_addf (& refname , "%s%s" , get_git_namespace (), refname_nons );
1454- if (ref_is_hidden (refname_nons , refname .buf ) ||
1460+ if (ref_is_hidden (refname_nons , refname .buf , hidden_refs ) ||
14551461 read_ref (refname .buf , & oid )) {
14561462 packet_writer_error (writer , "unknown ref %s" , refname_nons );
14571463 die ("unknown ref %s" , refname_nons );
@@ -1508,7 +1514,7 @@ static void process_args(struct packet_reader *request,
15081514 continue ;
15091515 if (data -> allow_ref_in_want &&
15101516 parse_want_ref (& data -> writer , arg , & data -> wanted_refs ,
1511- & data -> want_obj ))
1517+ & data -> hidden_refs , & data -> want_obj ))
15121518 continue ;
15131519 /* process have line */
15141520 if (parse_have (arg , & data -> haves ))
0 commit comments