mirror of
https://github.com/git-for-windows/git.git
synced 2026-03-04 02:16:16 -06:00
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:
parent
cd6e3a6b2f
commit
8b02eeb9dd
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