From 7607718d3a3f999a1e0524d5654574f222e160d7 Mon Sep 17 00:00:00 2001 From: grokspawn Date: Thu, 21 Aug 2025 14:46:23 -0500 Subject: [PATCH] switch tactics Signed-off-by: grokspawn --- alpha/model/model.go | 4 ++++ alpha/model/model_test.go | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/alpha/model/model.go b/alpha/model/model.go index 9b4e3ae85..af6c391e6 100644 --- a/alpha/model/model.go +++ b/alpha/model/model.go @@ -288,6 +288,10 @@ func (c *Channel) validateReplacesChain() error { if _, ok := chainFrom[cur.Name]; !ok { chainFrom[cur.Name] = []string{cur.Name} } + // if the replaces edge is known to be skipped, disregard it + if skippedBundles.Has(cur.Replaces) { + break + } for k := range chainFrom { chainFrom[k] = append(chainFrom[k], cur.Replaces) } diff --git a/alpha/model/model_test.go b/alpha/model/model_test.go index 11391b74c..248de9c85 100644 --- a/alpha/model/model_test.go +++ b/alpha/model/model_test.go @@ -164,7 +164,15 @@ func TestValidReplacesChain(t *testing.T) { }}, assertion: hasError(`channel contains one or more stranded bundles: anakin.v0.0.1`), }, - } + { + name: "Error/SkippedReplacesStranded", + ch: Channel{Bundles: map[string]*Bundle{ + "anakin.v0.0.1": {Name: "anakin.v0.0.1"}, + "anakin.v0.0.2": {Name: "anakin.v0.0.2", Replaces: "anakin.v0.0.1"}, + "anakin.v0.0.3": {Name: "anakin.v0.0.3", Replaces: "anakin.v0.0.2", Skips: []string{"anakin.v0.0.2"}}, + }}, + assertion: hasError(`channel contains one or more stranded bundles: anakin.v0.0.1`), + }} for _, s := range specs { t.Run(s.name, func(t *testing.T) { err := s.ch.validateReplacesChain()