path-walk API: avoid adding a root tree more than once (#5195)

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.
This commit is contained in:
Johannes Schindelin 2024-10-08 08:15:03 +02:00
commit a0b4e5401b
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