@@ -105,6 +105,24 @@ static void push_to_stack(struct path_walk_context *ctx,
105105 prio_queue_put (& ctx -> path_stack , xstrdup (path ));
106106}
107107
108+ static void add_path_to_list (struct path_walk_context * ctx ,
109+ const char * path ,
110+ enum object_type type ,
111+ struct object_id * oid ,
112+ int interesting )
113+ {
114+ struct type_and_oid_list * list = strmap_get (& ctx -> paths_to_lists , path );
115+
116+ if (!list ) {
117+ CALLOC_ARRAY (list , 1 );
118+ list -> type = type ;
119+ strmap_put (& ctx -> paths_to_lists , path , list );
120+ }
121+
122+ list -> maybe_interesting |= interesting ;
123+ oid_array_append (& list -> oids , oid );
124+ }
125+
108126static int add_tree_entries (struct path_walk_context * ctx ,
109127 const char * base_path ,
110128 struct object_id * oid )
@@ -129,7 +147,6 @@ static int add_tree_entries(struct path_walk_context *ctx,
129147
130148 init_tree_desc (& desc , & tree -> object .oid , tree -> buffer , tree -> size );
131149 while (tree_entry (& desc , & entry )) {
132- struct type_and_oid_list * list ;
133150 struct object * o ;
134151 /* Not actually true, but we will ignore submodules later. */
135152 enum object_type type = S_ISDIR (entry .mode ) ? OBJ_TREE : OBJ_BLOB ;
@@ -190,17 +207,10 @@ static int add_tree_entries(struct path_walk_context *ctx,
190207 continue ;
191208 }
192209
193- if (!(list = strmap_get (& ctx -> paths_to_lists , path .buf ))) {
194- CALLOC_ARRAY (list , 1 );
195- list -> type = type ;
196- strmap_put (& ctx -> paths_to_lists , path .buf , list );
197- }
198- push_to_stack (ctx , path .buf );
199-
200- if (!(o -> flags & UNINTERESTING ))
201- list -> maybe_interesting = 1 ;
210+ add_path_to_list (ctx , path .buf , type , & entry .oid ,
211+ !(o -> flags & UNINTERESTING ));
202212
203- oid_array_append ( & list -> oids , & entry . oid );
213+ push_to_stack ( ctx , path . buf );
204214 }
205215
206216 free_tree_buffer (tree );
@@ -377,15 +387,9 @@ static int setup_pending_objects(struct path_walk_info *info,
377387 if (!info -> trees )
378388 continue ;
379389 if (pending -> path ) {
380- struct type_and_oid_list * list ;
381390 char * path = * pending -> path ? xstrfmt ("%s/" , pending -> path )
382391 : xstrdup ("" );
383- if (!(list = strmap_get (& ctx -> paths_to_lists , path ))) {
384- CALLOC_ARRAY (list , 1 );
385- list -> type = OBJ_TREE ;
386- strmap_put (& ctx -> paths_to_lists , path , list );
387- }
388- oid_array_append (& list -> oids , & obj -> oid );
392+ add_path_to_list (ctx , path , OBJ_TREE , & obj -> oid , 1 );
389393 free (path );
390394 } else {
391395 /* assume a root tree, such as a lightweight tag. */
@@ -396,19 +400,10 @@ static int setup_pending_objects(struct path_walk_info *info,
396400 case OBJ_BLOB :
397401 if (!info -> blobs )
398402 continue ;
399- if (pending -> path ) {
400- struct type_and_oid_list * list ;
401- char * path = pending -> path ;
402- if (!(list = strmap_get (& ctx -> paths_to_lists , path ))) {
403- CALLOC_ARRAY (list , 1 );
404- list -> type = OBJ_BLOB ;
405- strmap_put (& ctx -> paths_to_lists , path , list );
406- }
407- oid_array_append (& list -> oids , & obj -> oid );
408- } else {
409- /* assume a root tree, such as a lightweight tag. */
403+ if (pending -> path )
404+ add_path_to_list (ctx , pending -> path , OBJ_BLOB , & obj -> oid , 1 );
405+ else
410406 oid_array_append (& tagged_blobs -> oids , & obj -> oid );
411- }
412407 break ;
413408
414409 case OBJ_COMMIT :
0 commit comments