Skip to content

Commit 8472f87

Browse files
committed
detect self-reference and better report depends_on cycles
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent 60aa640 commit 8472f87

File tree

4 files changed

+24
-4
lines changed

4 files changed

+24
-4
lines changed

graph/cycle.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ func (g *graph[T]) checkCycle() error {
5050
func searchCycle[T any](path []string, v *vertex[T]) error {
5151
names := utils.MapKeys(v.children)
5252
for _, name := range names {
53-
if i := slices.Index(path, name); i > 0 {
54-
return fmt.Errorf("dependency cycle detected: %s", strings.Join(path[i:], " -> "))
53+
if i := slices.Index(path, name); i >= 0 {
54+
return fmt.Errorf("dependency cycle detected: %s -> %s", strings.Join(path[i:], " -> "), name)
5555
}
5656
ch := v.children[name]
5757
err := searchCycle(append(path, name), ch)

graph/graph_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ func Test_detectCycle(t *testing.T) {
325325
graph := exampleGraph()
326326
graph.addEdge("B", "D")
327327
err := graph.checkCycle()
328-
assert.Error(t, err, "dependency cycle detected: D -> C -> B")
328+
assert.Error(t, err, "dependency cycle detected: B -> D -> C -> B")
329329
}
330330

331331
func TestWith_RootNodesAndUp(t *testing.T) {

loader/loader_test.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2625,7 +2625,21 @@ func TestLoadDependsOnCycle(t *testing.T) {
26252625
},
26262626
},
26272627
})
2628-
assert.Error(t, err, "dependency cycle detected: service2 -> service3 -> service1", err)
2628+
assert.Error(t, err, "dependency cycle detected: service1 -> service2 -> service3 -> service1", err)
2629+
}
2630+
2631+
func TestLoadDependsOnSelf(t *testing.T) {
2632+
workingDir, err := os.Getwd()
2633+
assert.NilError(t, err)
2634+
_, err = LoadWithContext(context.Background(), types.ConfigDetails{
2635+
WorkingDir: filepath.Join(workingDir, "testdata"),
2636+
ConfigFiles: []types.ConfigFile{
2637+
{
2638+
Filename: filepath.Join(workingDir, "testdata", "compose-depends-on-self.yaml"),
2639+
},
2640+
},
2641+
})
2642+
assert.Error(t, err, "dependency cycle detected: service1 -> service1", err)
26292643
}
26302644

26312645
func TestLoadWithDependsOn(t *testing.T) {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
name : depends-on-cycle
2+
services:
3+
service1:
4+
image: service1
5+
depends_on:
6+
- service1

0 commit comments

Comments
 (0)