Skip to content

Commit d3c064a

Browse files
authored
[config] Refactor config to prepare for imports (#1817)
## Summary Currently we use config fields on the Config struct directly. This makes it really hard to track what we use to modify the file vs what we are using as the representation of the config. This was not a problem in the past because the config and the `devbox.json` file are one in the same. Since we are hoping to introduce imports, we need to make it more clear what each field/function refers to. In this PR, I split config into 2 structs: * `configFile` which represents a single JSON file and is not exported directly. * `Config` a wrapper around a `Root` `configFile` and in the future possible imports. The root is exported so that we don't have to wrap every `configFile` field. Note: `Config` has a bunch of functions that will need to be re-implemented in order to support imports. Other changes: * Rename `Packages` struct to `PackagesMutator` and removed all non-mutating functions. This makes the struct more purposeful. * Made a few structs not-exported. * Moved some tests around. Note: Github diff UI doesn't do a great job with file name changes in this PR so to make this PR easier to read I named the new Config file `config2.go` while keeping the previous `config.go`. Before merging I'll rename `config.go file.go` and `config2.go -> config.go`. This code change should have no functional change on devbox. ## How was it tested? builds, tests
1 parent 1dbcad2 commit d3c064a

File tree

21 files changed

+446
-389
lines changed

21 files changed

+446
-389
lines changed

internal/boxcli/midcobra/telemetry.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,5 +108,5 @@ func getPackagesAndCommitHash(c *cobra.Command) ([]string, string) {
108108
return []string{}, ""
109109
}
110110

111-
return box.Config().Packages.VersionedNames(), box.Config().NixPkgsCommitHash()
111+
return box.Config().PackagesVersionedNames(), box.Config().NixPkgsCommitHash()
112112
}

internal/boxcli/secrets.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ func secretsInitFunc(
247247
secrets := box.UninitializedSecrets(ctx)
248248

249249
if _, err := secrets.ProjectConfig(); err == nil &&
250-
box.Config().EnvFrom != "jetpack-cloud" {
250+
!box.Config().IsEnvsecEnabled() {
251251
// Handle edge case where directory is already set up, but devbox.json is
252252
// not configured to use jetpack-cloud.
253253
ux.Finfo(
@@ -257,6 +257,6 @@ func secretsInitFunc(
257257
} else if err := secrets.NewProject(ctx, flags.force); err != nil {
258258
return errors.WithStack(err)
259259
}
260-
box.Config().SetStringField("EnvFrom", "jetpack-cloud")
261-
return box.Config().SaveTo(box.ProjectDir())
260+
box.Config().Root.SetStringField("EnvFrom", "jetpack-cloud")
261+
return box.Config().Root.SaveTo(box.ProjectDir())
262262
}

internal/devbox/devbox.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -522,11 +522,11 @@ func (d *Devbox) GenerateEnvrcFile(ctx context.Context, force bool, envFlags dev
522522

523523
// saveCfg writes the config file to the devbox directory.
524524
func (d *Devbox) saveCfg() error {
525-
return d.cfg.SaveTo(d.ProjectDir())
525+
return d.cfg.Root.SaveTo(d.ProjectDir())
526526
}
527527

528528
func (d *Devbox) Services() (services.Services, error) {
529-
pluginSvcs, err := d.pluginManager.GetServices(d.InstallablePackages(), d.cfg.Include)
529+
pluginSvcs, err := d.pluginManager.GetServices(d.InstallablePackages(), d.cfg.Include())
530530
if err != nil {
531531
return nil, err
532532
}
@@ -881,7 +881,7 @@ func (d *Devbox) computeEnv(ctx context.Context, usePrintDevEnvCache bool) (map[
881881
// We still need to be able to add env variables to non-service binaries
882882
// (e.g. ruby). This would involve understanding what binaries are associated
883883
// to a given plugin.
884-
pluginEnv, err := d.pluginManager.Env(d.InstallablePackages(), d.cfg.Include, env)
884+
pluginEnv, err := d.pluginManager.Env(d.InstallablePackages(), d.cfg.Include(), env)
885885
if err != nil {
886886
return nil, err
887887
}
@@ -1008,7 +1008,7 @@ func (d *Devbox) flakeDir() string {
10081008
func (d *Devbox) PackageNames() []string {
10091009
// TODO savil: centralize implementation by calling d.configPackages and getting pkg.Raw
10101010
// Skipping for now to avoid propagating the error value.
1011-
return d.cfg.Packages.VersionedNames()
1011+
return d.cfg.PackagesVersionedNames()
10121012
}
10131013

10141014
// ConfigPackages returns the packages that are defined in devbox.json
@@ -1033,7 +1033,7 @@ func (d *Devbox) AllInstallablePackages() ([]*devpkg.Package, error) {
10331033

10341034
func (d *Devbox) Includes() []plugin.Includable {
10351035
includes := []plugin.Includable{}
1036-
for _, includePath := range d.cfg.Include {
1036+
for _, includePath := range d.cfg.Include() {
10371037
if include, err := d.pluginManager.ParseInclude(includePath); err == nil {
10381038
includes = append(includes, include)
10391039
}
@@ -1140,14 +1140,14 @@ func (d *Devbox) configEnvs(
11401140
}
11411141
}
11421142
}
1143-
} else if d.cfg.EnvFrom != "" {
1143+
} else if d.cfg.Root.EnvFrom != "" {
11441144
return nil, usererr.New(
11451145
"unknown from_env value: %s. Supported value is: %q.",
1146-
d.cfg.EnvFrom,
1146+
d.cfg.Root.EnvFrom,
11471147
"jetpack-cloud",
11481148
)
11491149
}
1150-
for k, v := range d.cfg.Env {
1150+
for k, v := range d.cfg.Env() {
11511151
env[k] = v
11521152
}
11531153
return conf.OSExpandEnvMap(env, existingEnv, d.ProjectDir()), nil

internal/devbox/dir_test.go

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -139,30 +139,3 @@ func TestFindParentDirAtPath(t *testing.T) {
139139
})
140140
}
141141
}
142-
143-
func TestNixpkgsValidation(t *testing.T) {
144-
testCases := map[string]struct {
145-
commit string
146-
isErrant bool
147-
}{
148-
"invalid_nixpkg_commit": {"1234545", true},
149-
"valid_nixpkg_commit": {"af9e00071d0971eb292fd5abef334e66eda3cb69", false},
150-
}
151-
152-
for name, testCase := range testCases {
153-
t.Run(name, func(t *testing.T) {
154-
assert := assert.New(t)
155-
156-
err := devconfig.ValidateNixpkg(&devconfig.Config{
157-
Nixpkgs: &devconfig.NixpkgsConfig{
158-
Commit: testCase.commit,
159-
},
160-
})
161-
if testCase.isErrant {
162-
assert.Error(err)
163-
} else {
164-
assert.NoError(err)
165-
}
166-
})
167-
}
168-
}

internal/devbox/docgen/docgen.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ func GenerateReadme(
5151
}
5252

5353
return tmpl.Execute(f, map[string]any{
54-
"Name": devbox.Config().Name,
55-
"Description": devbox.Config().Description,
54+
"Name": devbox.Config().Root.Name,
55+
"Description": devbox.Config().Root.Description,
5656
"Scripts": devbox.Config().Scripts(),
57-
"EnvVars": devbox.Config().Env,
57+
"EnvVars": devbox.Config().Env(),
5858
"InitHook": devbox.Config().InitHook(),
5959
"Packages": devbox.ConfigPackages(),
6060
})

internal/devbox/packages.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func (d *Devbox) Add(ctx context.Context, pkgsNames []string, opts devopt.AddOpt
9898
}
9999

100100
ux.Finfo(d.stderr, "Adding package %q to devbox.json\n", packageNameForConfig)
101-
d.cfg.Packages.Add(packageNameForConfig)
101+
d.cfg.PackageMutator().Add(packageNameForConfig)
102102
addedPackageNames = append(addedPackageNames, packageNameForConfig)
103103
}
104104

@@ -120,27 +120,27 @@ func (d *Devbox) Add(ctx context.Context, pkgsNames []string, opts devopt.AddOpt
120120

121121
func (d *Devbox) setPackageOptions(pkgs []string, opts devopt.AddOpts) error {
122122
for _, pkg := range pkgs {
123-
if err := d.cfg.Packages.AddPlatforms(
123+
if err := d.cfg.PackageMutator().AddPlatforms(
124124
d.stderr, pkg, opts.Platforms); err != nil {
125125
return err
126126
}
127-
if err := d.cfg.Packages.ExcludePlatforms(
127+
if err := d.cfg.PackageMutator().ExcludePlatforms(
128128
d.stderr, pkg, opts.ExcludePlatforms); err != nil {
129129
return err
130130
}
131-
if err := d.cfg.Packages.SetDisablePlugin(
131+
if err := d.cfg.PackageMutator().SetDisablePlugin(
132132
pkg, opts.DisablePlugin); err != nil {
133133
return err
134134
}
135-
if err := d.cfg.Packages.SetPatchGLibc(
135+
if err := d.cfg.PackageMutator().SetPatchGLibc(
136136
pkg, opts.PatchGlibc); err != nil {
137137
return err
138138
}
139-
if err := d.cfg.Packages.SetOutputs(
139+
if err := d.cfg.PackageMutator().SetOutputs(
140140
d.stderr, pkg, opts.Outputs); err != nil {
141141
return err
142142
}
143-
if err := d.cfg.Packages.SetAllowInsecure(
143+
if err := d.cfg.PackageMutator().SetAllowInsecure(
144144
d.stderr, pkg, opts.AllowInsecure); err != nil {
145145
return err
146146
}
@@ -191,7 +191,7 @@ func (d *Devbox) Remove(ctx context.Context, pkgs ...string) error {
191191
found, _ := d.findPackageByName(pkg)
192192
if found != nil {
193193
packagesToUninstall = append(packagesToUninstall, found.Raw)
194-
d.cfg.Packages.Remove(found.Raw)
194+
d.cfg.PackageMutator().Remove(found.Raw)
195195
} else {
196196
missingPkgs = append(missingPkgs, pkg)
197197
}
@@ -553,7 +553,7 @@ func (d *Devbox) moveAllowInsecureFromLockfile(writer io.Writer, lockfile *lock.
553553
if err != nil {
554554
return fmt.Errorf("failed to get package's store name for package %q with error %w", versionedName, err)
555555
}
556-
if err := cfg.Packages.SetAllowInsecure(writer, versionedName, []string{storeName}); err != nil {
556+
if err := cfg.PackageMutator().SetAllowInsecure(writer, versionedName, []string{storeName}); err != nil {
557557
return fmt.Errorf("failed to set allow_insecure in devbox.json for package %q with error %w", versionedName, err)
558558
}
559559
}

internal/devbox/update.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func (d *Devbox) Update(ctx context.Context, opts devopt.UpdateOpts) error {
3131
fmt.Fprintf(d.stderr, "Updating %s -> %s\n", pkg.Raw, pkg.LegacyToVersioned())
3232

3333
// Get the package from the config to get the Platforms and ExcludedPlatforms later
34-
cfgPackage, ok := d.cfg.Packages.Get(pkg.Raw)
34+
cfgPackage, ok := d.cfg.Root.GetPackage(pkg.Raw)
3535
if !ok {
3636
return fmt.Errorf("package %s not found in config", pkg.Raw)
3737
}

0 commit comments

Comments
 (0)