@@ -105,6 +105,24 @@ static void push_to_stack(struct path_walk_context *ctx,
105
105
prio_queue_put (& ctx -> path_stack , xstrdup (path ));
106
106
}
107
107
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
+
108
126
static int add_tree_entries (struct path_walk_context * ctx ,
109
127
const char * base_path ,
110
128
struct object_id * oid )
@@ -129,7 +147,6 @@ static int add_tree_entries(struct path_walk_context *ctx,
129
147
130
148
init_tree_desc (& desc , & tree -> object .oid , tree -> buffer , tree -> size );
131
149
while (tree_entry (& desc , & entry )) {
132
- struct type_and_oid_list * list ;
133
150
struct object * o ;
134
151
/* Not actually true, but we will ignore submodules later. */
135
152
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,
190
207
continue ;
191
208
}
192
209
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 ));
202
212
203
- oid_array_append ( & list -> oids , & entry . oid );
213
+ push_to_stack ( ctx , path . buf );
204
214
}
205
215
206
216
free_tree_buffer (tree );
@@ -377,15 +387,9 @@ static int setup_pending_objects(struct path_walk_info *info,
377
387
if (!info -> trees )
378
388
continue ;
379
389
if (pending -> path ) {
380
- struct type_and_oid_list * list ;
381
390
char * path = * pending -> path ? xstrfmt ("%s/" , pending -> path )
382
391
: 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 );
389
393
free (path );
390
394
} else {
391
395
/* assume a root tree, such as a lightweight tag. */
@@ -396,19 +400,10 @@ static int setup_pending_objects(struct path_walk_info *info,
396
400
case OBJ_BLOB :
397
401
if (!info -> blobs )
398
402
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
410
406
oid_array_append (& tagged_blobs -> oids , & obj -> oid );
411
- }
412
407
break ;
413
408
414
409
case OBJ_COMMIT :
0 commit comments