Skip to content

Commit ff5dbb0

Browse files
authored
fix: cleanup xgenny runner to avoid duplicated generators (#4863)
* FIX: xgenny runner cleanup to avoid duplicated generators * add changelog * fix ts tests * rollback ts files
1 parent 31d447a commit ff5dbb0

File tree

3 files changed

+62
-4
lines changed

3 files changed

+62
-4
lines changed

changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Fixes
6+
7+
- [#4735](https://github.com/ignite/cli/issues/4735) Cleanup `xgenny` runner to avoid duplicated generators.
8+
59
## [`v29.7.0`](https://github.com/ignite/cli/releases/tag/v29.7.0)
610

711
## Changes

ignite/pkg/xgenny/runner.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ type Runner struct {
1919
tracer *placeholder.Tracer
2020
results []genny.File
2121
tmpPath string
22+
root string
2223
}
2324

2425
// NewRunner is a xgenny Runner with a logger.
@@ -34,11 +35,21 @@ func NewRunner(ctx context.Context, root string) *Runner {
3435
tmpPath: tmpPath,
3536
tracer: placeholder.New(),
3637
results: make([]genny.File, 0),
38+
root: root,
3739
}
3840
runner.FileFn = wetFileFn(r)
3941
return r
4042
}
4143

44+
// cleanup clears the underlying genny runner state so previously executed
45+
// generators are not re-run on subsequent calls.
46+
func (r *Runner) cleanup() {
47+
runner := genny.WetRunner(r.ctx)
48+
runner.Root = r.root
49+
runner.FileFn = wetFileFn(r)
50+
r.Runner = runner
51+
}
52+
4253
func (r *Runner) Tracer() *placeholder.Tracer {
4354
return r.tracer
4455
}
@@ -139,16 +150,24 @@ func (r *Runner) RunAndApply(gens *genny.Generator, options ...ApplyOption) (Sou
139150

140151
// Run all generators into a temp folder for we can apply the modifications later.
141152
func (r *Runner) Run(gens ...*genny.Generator) error {
142-
// execute the modification with a wet runner
153+
// ensure the underlying genny runner starts clean to avoid re-running previous generators
154+
r.cleanup()
155+
143156
for _, gen := range gens {
144157
if err := r.Runner.With(gen); err != nil {
145158
return err
146159
}
147-
if err := r.Runner.Run(); err != nil {
148-
return err
149-
}
150160
}
161+
162+
if err := r.Runner.Run(); err != nil {
163+
return err
164+
}
165+
151166
r.results = append(r.results, r.Results().Files...)
167+
168+
// reset again so a future Run call starts fresh
169+
r.cleanup()
170+
152171
return r.tracer.Err()
153172
}
154173

ignite/pkg/xgenny/runner_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package xgenny_test
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/gobuffalo/genny/v2"
8+
"github.com/stretchr/testify/require"
9+
10+
"github.com/ignite/cli/v29/ignite/pkg/xgenny"
11+
)
12+
13+
func TestMultipleGen(t *testing.T) {
14+
var (
15+
runner = xgenny.NewRunner(context.Background(), t.TempDir())
16+
firstGen = genny.New()
17+
secondGen = genny.New()
18+
firstRunCount int
19+
secondRunCount int
20+
)
21+
22+
firstGen.RunFn(func(_ *genny.Runner) error {
23+
firstRunCount++
24+
return nil
25+
})
26+
27+
secondGen.RunFn(func(_ *genny.Runner) error {
28+
secondRunCount++
29+
return nil
30+
})
31+
32+
require.NoError(t, runner.Run(firstGen, secondGen))
33+
require.Equal(t, 1, firstRunCount, "first generator should run only once")
34+
require.Equal(t, 1, secondRunCount, "second generator should run only once")
35+
}

0 commit comments

Comments
 (0)