Skip to content

Commit beef9d8

Browse files
authored
Merge pull request #5480 from camilamacedo86/flags-edit
🐛 (go/v4): preserve existing PROJECT values for unset edit flags
2 parents 58ae358 + 7c9eeb5 commit beef9d8

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

pkg/plugins/golang/v4/edit.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ type editSubcommand struct {
3535
multigroup bool
3636
namespaced bool
3737
force bool
38+
39+
// fs stores the FlagSet to check if flags were explicitly set
40+
fs *pflag.FlagSet
3841
}
3942

4043
func (p *editSubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) {
@@ -80,6 +83,7 @@ Note: To add optional plugins after initialization, use 'kubebuilder edit --plug
8083
}
8184

8285
func (p *editSubcommand) BindFlags(fs *pflag.FlagSet) {
86+
p.fs = fs
8387
fs.BoolVar(&p.multigroup, "multigroup", false, "enable or disable multigroup layout")
8488
fs.BoolVar(&p.namespaced, "namespaced", false, "enable or disable namespace-scoped deployment")
8589
fs.BoolVar(&p.force, "force", false, "overwrite scaffolded files to apply changes (manual edits may be lost)")
@@ -91,6 +95,19 @@ func (p *editSubcommand) InjectConfig(c config.Config) error {
9195
return nil
9296
}
9397

98+
func (p *editSubcommand) PreScaffold(machinery.Filesystem) error {
99+
// If flags were not explicitly set, preserve existing PROJECT file values
100+
// This prevents one flag from clearing another when using default values
101+
if !p.fs.Changed("multigroup") {
102+
p.multigroup = p.config.IsMultiGroup()
103+
}
104+
if !p.fs.Changed("namespaced") {
105+
p.namespaced = p.config.IsNamespaced()
106+
}
107+
108+
return nil
109+
}
110+
94111
func (p *editSubcommand) Scaffold(fs machinery.Filesystem) error {
95112
scaffolder := scaffolds.NewEditScaffolder(p.config, p.multigroup, p.namespaced, p.force)
96113
scaffolder.InjectFS(fs)

pkg/plugins/golang/v4/edit_test.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@ package v4
1919
import (
2020
. "github.com/onsi/ginkgo/v2"
2121
. "github.com/onsi/gomega"
22+
"github.com/spf13/afero"
23+
"github.com/spf13/pflag"
2224

2325
"sigs.k8s.io/kubebuilder/v4/pkg/config"
2426
cfgv3 "sigs.k8s.io/kubebuilder/v4/pkg/config/v3"
27+
"sigs.k8s.io/kubebuilder/v4/pkg/machinery"
2528
)
2629

2730
var _ = Describe("editSubcommand", func() {
@@ -39,4 +42,96 @@ var _ = Describe("editSubcommand", func() {
3942
Expect(subCmd.InjectConfig(cfg)).To(Succeed())
4043
Expect(subCmd.config).To(Equal(cfg))
4144
})
45+
46+
Context("PreScaffold", func() {
47+
var (
48+
fs *pflag.FlagSet
49+
mockFS machinery.Filesystem
50+
)
51+
52+
BeforeEach(func() {
53+
fs = pflag.NewFlagSet("test", pflag.ContinueOnError)
54+
subCmd.BindFlags(fs)
55+
Expect(subCmd.InjectConfig(cfg)).To(Succeed())
56+
mockFS = machinery.Filesystem{FS: afero.NewMemMapFs()}
57+
})
58+
59+
It("should preserve existing multigroup setting when only namespaced flag is set", func() {
60+
// Set multigroup in PROJECT file
61+
Expect(cfg.SetMultiGroup()).To(Succeed())
62+
Expect(cfg.IsMultiGroup()).To(BeTrue())
63+
64+
// Only set namespaced flag (multigroup not set, so it defaults to false)
65+
Expect(fs.Set("namespaced", "true")).To(Succeed())
66+
67+
// PreScaffold should preserve the existing multigroup value
68+
Expect(subCmd.PreScaffold(mockFS)).To(Succeed())
69+
70+
// Both should be true
71+
Expect(subCmd.multigroup).To(BeTrue(), "multigroup should be preserved from PROJECT file")
72+
Expect(subCmd.namespaced).To(BeTrue(), "namespaced should be set from flag")
73+
})
74+
75+
It("should preserve existing namespaced setting when only multigroup flag is set", func() {
76+
// Set namespaced in PROJECT file
77+
Expect(cfg.SetNamespaced()).To(Succeed())
78+
Expect(cfg.IsNamespaced()).To(BeTrue())
79+
80+
// Only set multigroup flag (namespaced not set, so it defaults to false)
81+
Expect(fs.Set("multigroup", "true")).To(Succeed())
82+
83+
// PreScaffold should preserve the existing namespaced value
84+
Expect(subCmd.PreScaffold(mockFS)).To(Succeed())
85+
86+
// Both should be true
87+
Expect(subCmd.multigroup).To(BeTrue(), "multigroup should be set from flag")
88+
Expect(subCmd.namespaced).To(BeTrue(), "namespaced should be preserved from PROJECT file")
89+
})
90+
91+
It("should allow explicitly disabling a flag", func() {
92+
// Set both in PROJECT file
93+
Expect(cfg.SetMultiGroup()).To(Succeed())
94+
Expect(cfg.SetNamespaced()).To(Succeed())
95+
96+
// Explicitly disable multigroup
97+
Expect(fs.Set("multigroup", "false")).To(Succeed())
98+
99+
// PreScaffold should respect the explicit false
100+
Expect(subCmd.PreScaffold(mockFS)).To(Succeed())
101+
102+
// multigroup should be false (explicitly set), namespaced should be true (from PROJECT)
103+
Expect(subCmd.multigroup).To(BeFalse(), "multigroup should be explicitly disabled")
104+
Expect(subCmd.namespaced).To(BeTrue(), "namespaced should be preserved from PROJECT file")
105+
})
106+
107+
It("should use flag values when both flags are explicitly set", func() {
108+
// Set different values in PROJECT file
109+
Expect(cfg.SetMultiGroup()).To(Succeed())
110+
Expect(cfg.ClearNamespaced()).To(Succeed())
111+
112+
// Explicitly set both flags to opposite values
113+
Expect(fs.Set("multigroup", "false")).To(Succeed())
114+
Expect(fs.Set("namespaced", "true")).To(Succeed())
115+
116+
// PreScaffold should use the explicit flag values
117+
Expect(subCmd.PreScaffold(mockFS)).To(Succeed())
118+
119+
Expect(subCmd.multigroup).To(BeFalse(), "multigroup should use explicit flag value")
120+
Expect(subCmd.namespaced).To(BeTrue(), "namespaced should use explicit flag value")
121+
})
122+
123+
It("should preserve PROJECT file values when no flags are set", func() {
124+
// Set values in PROJECT file
125+
Expect(cfg.SetMultiGroup()).To(Succeed())
126+
Expect(cfg.SetNamespaced()).To(Succeed())
127+
128+
// Don't set any flags
129+
130+
// PreScaffold should preserve both values from PROJECT file
131+
Expect(subCmd.PreScaffold(mockFS)).To(Succeed())
132+
133+
Expect(subCmd.multigroup).To(BeTrue(), "multigroup should be preserved from PROJECT file")
134+
Expect(subCmd.namespaced).To(BeTrue(), "namespaced should be preserved from PROJECT file")
135+
})
136+
})
42137
})

0 commit comments

Comments
 (0)