path-walk API: avoid adding a root tree more than once

When adding tree objects, we are very careful to avoid adding the same
tree object more than once. There was one small gap in that logic,
though: when adding a root tree object. Two refs can easily share the
same root tree object, and we should still not add it more than once.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
Johannes Schindelin 2024-10-07 18:33:51 +02:00
parent cd6e3a6b2f
commit 8b02eeb9dd
2 changed files with 31 additions and 3 deletions

View File

@ -278,9 +278,11 @@ int walk_objects_by_path(struct path_walk_info *info)
struct object_array_entry *pending = info->revs->pending.objects + i;
struct object *obj = pending->item;
if (obj->type == OBJ_COMMIT)
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);
@ -340,9 +342,13 @@ int walk_objects_by_path(struct path_walk_info *info)
oid = get_commit_tree_oid(c);
t = lookup_tree(info->revs->repo, oid);
if (t->object.flags & SEEN)
continue;
t->object.flags |= SEEN;
if (t) {
oidset_insert(&root_tree_set, oid);
oid_array_append(&root_tree_list->oids, oid);
if (!oidset_insert(&root_tree_set, oid))
oid_array_append(&root_tree_list->oids, oid);
} else {
warning("could not find tree %s", oid_to_hex(oid));
}

View File

@ -276,4 +276,26 @@ test_expect_success 'topic, not base, boundary with pruning' '
test_cmp expect.sorted out.sorted
'
test_expect_success 'trees are reported exactly once' '
test_when_finished "rm -rf unique-trees" &&
test_create_repo unique-trees &&
(
cd unique-trees &&
mkdir initial &&
test_commit initial/file &&
git switch -c move-to-top &&
git mv initial/file.t ./ &&
test_tick &&
git commit -m moved &&
git update-ref refs/heads/other HEAD
) &&
test-tool -C unique-trees path-walk -- --all >out &&
tree=$(git -C unique-trees rev-parse HEAD:) &&
grep "$tree" out >out-filtered &&
test_line_count = 1 out-filtered
'
test_done