From d5a01543159a89a792923da7f86f21bf88b662d9 Mon Sep 17 00:00:00 2001 From: Falk Harrison Date: Tue, 29 Sep 2026 10:46:31 +0200 Subject: [PATCH] fix(headless): refresh scope during automatic resolution --- internal/headless/scope_test.go | 37 +++++++++++++++++++++++++++++++++ internal/headless/vars.go | 1 + 2 files changed, 38 insertions(+) create mode 100644 internal/headless/scope_test.go diff --git a/internal/headless/scope_test.go b/internal/headless/scope_test.go new file mode 100644 index 0000000..64c7f29 --- /dev/null +++ b/internal/headless/scope_test.go @@ -0,0 +1,37 @@ +package headless + +import ( + "reflect" + "testing" + + "github.com/cheatmd-dev/cheatmd/pkg/config" + "github.com/cheatmd-dev/cheatmd/pkg/parser" +) + +func TestLiteralChainSeesEarlierResolvedValues(t *testing.T) { + old := config.Get().VarSyntax + t.Cleanup(func() { config.Get().VarSyntax = old }) + config.Get().VarSyntax = "dollar" + for _, name := range []string{"a", "b", "c"} { + t.Setenv(name, "") + } + cheat := &parser.Cheat{ + Command: "echo $c", + Vars: []parser.VarDef{ + {Name: "a", Literal: "alpha"}, + {Name: "b", Literal: "$a-beta"}, + {Name: "c", Literal: "$b-gamma"}, + }, + } + session := &RunnerSession{Cheat: cheat, Index: parser.NewCheatIndex()} + session.initializeVariables() + + if err := session.resolveInteractively(); err != nil { + t.Fatal(err) + } + + want := map[string]string{"a": "alpha", "b": "alpha-beta", "c": "alpha-beta-gamma"} + if !reflect.DeepEqual(cheat.Scope, want) { + t.Fatalf("resolved scope = %v, want %v", cheat.Scope, want) + } +} diff --git a/internal/headless/vars.go b/internal/headless/vars.go index 1e63b51..3f0b872 100644 --- a/internal/headless/vars.go +++ b/internal/headless/vars.go @@ -87,6 +87,7 @@ func (s *RunnerSession) attemptAutoResolvePass() bool { for i := range s.Vars { if s.tryResolveVariable(&s.Vars[i], scope) { progress = true + scope[s.Vars[i].Def.Name] = s.Vars[i].Value } }