path-walk: improve path-walk speed with many tags

In the presence of many tags, the use of oid_array_lookup() can become
extremely slow. We should rely upon the SEEN bit instead.

This affects the tag-peeling walk as well as the switch statement for
adding the peeled object to the correct oid_array.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
Derrick Stolee 2024-10-09 09:57:32 -04:00 committed by Johannes Schindelin
parent 67178432dd
commit cd5965ae62

View File

@ -299,26 +299,28 @@ int walk_objects_by_path(struct path_walk_info *info)
if (obj->type == OBJ_COMMIT || obj->flags & SEEN)
continue;
obj->flags |= SEEN;
while (obj->type == OBJ_TAG) {
struct tag *tag = lookup_tag(info->revs->repo,
&obj->oid);
if (oid_array_lookup(&tags, &obj->oid) < 0)
if (!(obj->flags & SEEN)) {
obj->flags |= SEEN;
oid_array_append(&tags, &obj->oid);
}
obj = tag->tagged;
}
if ((obj->flags & SEEN))
continue;
obj->flags |= SEEN;
switch (obj->type) {
case OBJ_TREE:
if (info->trees &&
oid_array_lookup(&root_tree_list->oids, &obj->oid) < 0)
if (info->trees)
oid_array_append(&root_tree_list->oids, &obj->oid);
break;
case OBJ_BLOB:
if (info->blobs &&
oid_array_lookup(&tagged_blob_list, &obj->oid) < 0)
if (info->blobs)
oid_array_append(&tagged_blob_list, &obj->oid);
break;