From 134a50d93646d17bcece93824ebc9bf1bbfefd58 Mon Sep 17 00:00:00 2001 From: Derrick Stolee Date: Wed, 9 Oct 2024 09:57:32 -0400 Subject: [PATCH] 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 --- path-walk.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/path-walk.c b/path-walk.c index 10c6dedbab82b1..c0be95922c1615 100644 --- a/path-walk.c +++ b/path-walk.c @@ -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;