From 1c01cc1794ebece3b5633eee3957dcc81d16228d Mon Sep 17 00:00:00 2001 From: "Marc J. Schmidt" Date: Mon, 29 Jan 2024 18:32:52 +0100 Subject: [PATCH] fix(topsort): circular reference detection adds a fix for circular reference detection to correctly restore the parent list before going deeper. --- packages/topsort/src/group-array-sort.ts | 2 +- packages/topsort/tests/group-sort.spec.ts | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/topsort/src/group-array-sort.ts b/packages/topsort/src/group-array-sort.ts index f0c76a458..1ee500a1c 100644 --- a/packages/topsort/src/group-array-sort.ts +++ b/packages/topsort/src/group-array-sort.ts @@ -60,7 +60,7 @@ export class GroupArraySort extends BaseImplementatio let minLevel = -1; if (element.dependencies.length) { - parents = parents || new Set(); + parents = parents ? new Set(parents) : new Set(); parents.add(element.item); for (const dependency of element.dependencies) { diff --git a/packages/topsort/tests/group-sort.spec.ts b/packages/topsort/tests/group-sort.spec.ts index 520ebb87a..d1cc9221e 100644 --- a/packages/topsort/tests/group-sort.spec.ts +++ b/packages/topsort/tests/group-sort.spec.ts @@ -19,7 +19,7 @@ test('bench', () => { const count = 10_000; const items = getElementsGroup(count); - bench(10, `ArraySort Warmup ${count}`, () => { + bench(10, `GroupArraySort Warmup ${count}`, () => { const sorter = new GroupArraySort(); sorter.set(items); sorter.sort(); @@ -61,6 +61,18 @@ test('circular exception', () => { } }); +test('parent circular', () => { + const sorter = new GroupArraySort(); + + sorter.add('service1', 'service', ['account1']); + sorter.add('account1', 'account', []); + sorter.add('deploy1', 'deploy', ['node1', 'node1', 'service1']); + sorter.add('node1', 'node', ['account1']); + + // this must not fail + sorter.sort(); +}); + test('dependency in same', () => { const sorter = new GroupArraySort(); sorter.add('car1', 'car', ['brand1']);