mirror of
https://github.com/git-for-windows/git.git
synced 2026-03-02 15:04:09 -06:00
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:
commit
a0b4e5401b
12
path-walk.c
12
path-walk.c
@ -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));
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user