this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

all: sunset CUE_EXPERIMENT=modules

The experiment was introduced in late 2023, and enabled by default
in v0.9.0 released in June 2024. Given that there were no more known
regressions or issues with the new modules implementation,
v0.11.0 was released in November 2024 with CUE_EXPERIMENT=modules=0
being deprecated and no longer allowed.

The upcoming v0.12 release can then remove all the code supporting
the modules experiment, as we can now start assuming that the new
modules implementation will always be used.

This first change removes all direct uses of the experiment flag.
A follow-up change will do some cleanups in cue/load.
We don't remove the flag definition itself yet, as lots of CUE users
were (and still may be) setting CUE_EXPERIMENT=modules,
so there's no hurry to break them. Moreover, using tools like
`git bisect` is easier if the same env var can be used across a wider
range of CUE versions.

Signed-off-by: Daniel Martí <mvdan@mvdan.cc>
Change-Id: I4083977be6433b91a17a66705ac28749d262a14e
Reviewed-on: https://review.gerrithub.io/c/cue-lang/cue/+/1205858
Reviewed-by: Roger Peppe <rogpeppe@gmail.com>
TryBot-Result: CUEcueckoo <cueckoo@cuelang.org>

+16 -107
+2 -8
cmd/cue/cmd/login.go
··· 63 63 Args: cobra.MaximumNArgs(1), 64 64 RunE: mkRunE(c, func(cmd *Command, args []string) error { 65 65 var locResolver modresolve.LocationResolver 66 + var err error 66 67 if len(args) > 0 { 67 - var err error 68 68 locResolver, err = modresolve.ParseCUERegistry(args[0], "") 69 69 if err != nil { 70 70 return err 71 71 } 72 72 } else { 73 - resolver, err := getRegistryResolver() 73 + locResolver, err = getRegistryResolver() 74 74 if err != nil { 75 75 return err 76 76 } 77 - // We need to do this nil check before we assign to locResolver, 78 - // otherwise the interface gets filled with a typed nil, which is not nil. 79 - if resolver == nil { 80 - return fmt.Errorf("cannot log in when modules are not enabled") 81 - } 82 - locResolver = resolver 83 77 } 84 78 registryHosts := locResolver.AllHosts() 85 79 if len(registryHosts) > 1 {
-3
cmd/cue/cmd/modget.go
··· 68 68 if err != nil { 69 69 return err 70 70 } 71 - if reg == nil { 72 - return fmt.Errorf("modules experiment not enabled (enable with CUE_EXPERIMENT=modules)") 73 - } 74 71 ctx := backgroundContext() 75 72 modRoot, err := findModuleRoot() 76 73 if err != nil {
-3
cmd/cue/cmd/modpublish.go
··· 91 91 if err != nil { 92 92 return err 93 93 } 94 - if resolver0 == nil { 95 - return fmt.Errorf("modules experiment not enabled (enable with CUE_EXPERIMENT=modules)") 96 - } 97 94 dryRun := flagDryRun.Bool(cmd) 98 95 outDir := flagOut.String(cmd) 99 96 useJSON := flagJSON.Bool(cmd)
-3
cmd/cue/cmd/modresolve.go
··· 57 57 if err != nil { 58 58 return err 59 59 } 60 - if resolver == nil { 61 - return fmt.Errorf("modules experiment not enabled (enable with CUE_EXPERIMENT=modules)") 62 - } 63 60 var mf *modfile.File 64 61 if len(args) == 0 { 65 62 // Use the current module if no arguments are provided.
-3
cmd/cue/cmd/modtidy.go
··· 58 58 if err != nil { 59 59 return err 60 60 } 61 - if reg == nil { 62 - return fmt.Errorf("modules experiment not enabled (enable with CUE_EXPERIMENT=modules)") 63 - } 64 61 ctx := backgroundContext() 65 62 modRoot, err := findModuleRoot() 66 63 if err != nil {
-27
cmd/cue/cmd/registry.go
··· 1 1 package cmd 2 2 3 3 import ( 4 - "fmt" 5 4 "log/slog" 6 5 "net/http" 7 6 "os" 8 - "sync" 9 7 10 8 "cuelang.org/go/internal/cuedebug" 11 - "cuelang.org/go/internal/cueexperiment" 12 9 "cuelang.org/go/internal/httplog" 13 10 "cuelang.org/go/internal/mod/modload" 14 11 "cuelang.org/go/mod/modconfig" 15 12 ) 16 13 17 - var ignoringCUERegistryOnce sync.Once 18 - 19 14 // getRegistryResolver returns an implementation of [modregistry.Resolver] 20 15 // that resolves to registries as specified in the configuration. 21 - // 22 - // If external modules are disabled and there's no other issue, 23 - // it returns (nil, nil). 24 16 func getRegistryResolver() (*modconfig.Resolver, error) { 25 - if !modulesExperimentEnabled() { 26 - return nil, nil 27 - } 28 17 return modconfig.NewResolver(newModConfig()) 29 18 } 30 19 31 20 func getCachedRegistry() (modload.Registry, error) { 32 - if !modulesExperimentEnabled() { 33 - return nil, nil 34 - } 35 21 return modconfig.NewRegistry(newModConfig()) 36 22 } 37 23 ··· 55 41 }, 56 42 }) 57 43 } 58 - 59 - func modulesExperimentEnabled() bool { 60 - if cueexperiment.Flags.Modules { 61 - return true 62 - } 63 - if os.Getenv("CUE_REGISTRY") != "" { 64 - ignoringCUERegistryOnce.Do(func() { 65 - fmt.Fprintf(os.Stderr, "warning: ignoring CUE_REGISTRY because modules experiment is not enabled. Set CUE_EXPERIMENT=modules to enable it.\n") 66 - }) 67 - } 68 - return false 69 - 70 - }
-1
cmd/cue/cmd/script_test.go
··· 267 267 if err != nil { 268 268 return fmt.Errorf("cannot read workdir: %v", err) 269 269 } 270 - // As modules are enabled by default, we always want a cache directory. 271 270 // Since os.UserCacheDir relies on OS-specific env vars that we don't set, 272 271 // explicitly set up the cache directory somewhere predictable. 273 272 e.Vars = append(e.Vars, "CUE_CACHE_DIR="+filepath.Join(e.WorkDir, ".tmp/cache"))
-7
cmd/cue/cmd/testdata/script/modinit_majorversion.txtar
··· 1 1 env-fill want-module.cue 2 2 env-fill want-module-experiment.cue 3 3 4 - # No way of disabling the modules experiment. 5 - env CUE_EXPERIMENT=modules=0 6 - ! exec cue mod init foo.com/bar@v1 7 - stderr 'cannot change default value of deprecated flag "modules"' 8 - 9 - # With the experiment, it works as expected. 10 - env CUE_EXPERIMENT=modules 11 4 rm cue.mod 12 5 exec cue mod init foo.com/bar@v1 13 6 cmp cue.mod/module.cue want-module-experiment.cue
+2 -9
cmd/cue/cmd/testdata/script/modinit_nomajorversion.txtar
··· 1 1 env-fill want-module.cue 2 2 env-fill want-module-experiment.cue 3 3 4 - # No way of disabling the modules experiment. 5 - env CUE_EXPERIMENT=modules=0 6 - ! exec cue mod init foo.com/bar 7 - stderr 'cannot change default value of deprecated flag "modules"' 8 - 9 - # With the experiment, although the major version will be implied 10 - # as v0, it's still omitted so that there's a possibility of compatibility 4 + # Although the major version will be implied as v0, 5 + # it's still omitted so that there's a possibility of compatibility 11 6 # with earlier cue versions. 12 - env CUE_EXPERIMENT=modules 13 - rm cue.mod 14 7 exec cue mod init foo.com/bar 15 8 cmp cue.mod/module.cue want-module-experiment.cue 16 9 exists cue.mod/usr
-5
cmd/cue/cmd/testdata/script/modtidy_default_modules_mode.txtar
··· 1 - # Check that modules are enabled by default. 2 - exec cue mod tidy 3 - -- cue.mod/module.cue -- 4 - module: "test.example" 5 - language: version: "v0.9.0"
-5
cmd/cue/cmd/testdata/script/registry_modules_disabled.txtar
··· 1 - # When CUE_EXPERIMENT is disabled, we cannot use the cue command. 2 - 3 - env CUE_EXPERIMENT=modules=false 4 - ! exec cue export . 5 - stderr 'cannot change default value of deprecated flag "modules"'
+10 -16
cue/load/config.go
··· 26 26 "cuelang.org/go/cue/errors" 27 27 "cuelang.org/go/cue/token" 28 28 "cuelang.org/go/internal" 29 - "cuelang.org/go/internal/cueexperiment" 30 29 "cuelang.org/go/mod/modconfig" 31 30 "cuelang.org/go/mod/modfile" 32 31 "cuelang.org/go/mod/module" ··· 371 370 // We should never use the registry in SkipImports mode 372 371 // but nil it out to be sure. 373 372 c.Registry = nil 374 - } else { 375 - // Note: if cueexperiment.Flags.Modules _isn't_ set but c.Registry 376 - // is, we consider that a good enough hint that modules support 377 - // should be enabled and hence don't return an error in that case. 378 - if cueexperiment.Flags.Modules && c.Registry == nil { 379 - registry, err := modconfig.NewRegistry(&modconfig.Config{ 380 - Env: c.Env, 381 - }) 382 - if err != nil { 383 - // If there's an error in the registry configuration, 384 - // don't error immediately, but only when we actually 385 - // need to resolve modules. 386 - registry = errorRegistry{err} 387 - } 388 - c.Registry = registry 373 + } else if c.Registry == nil { 374 + registry, err := modconfig.NewRegistry(&modconfig.Config{ 375 + Env: c.Env, 376 + }) 377 + if err != nil { 378 + // If there's an error in the registry configuration, 379 + // don't error immediately, but only when we actually 380 + // need to resolve modules. 381 + registry = errorRegistry{err} 389 382 } 383 + c.Registry = registry 390 384 } 391 385 if err := c.loadModule(); err != nil { 392 386 return nil, err
-6
cue/load/instances.go
··· 24 24 25 25 "cuelang.org/go/cue/ast" 26 26 "cuelang.org/go/cue/build" 27 - "cuelang.org/go/internal/cueexperiment" 28 27 "cuelang.org/go/internal/filetypes" 29 28 "cuelang.org/go/internal/mod/modimports" 30 29 "cuelang.org/go/internal/mod/modpkgload" ··· 41 40 ctx := context.TODO() 42 41 if c == nil { 43 42 c = &Config{} 44 - } 45 - // We want to consult the CUE_EXPERIMENT flag to see whether 46 - // consult external registries by default. 47 - if err := cueexperiment.Init(); err != nil { 48 - return []*build.Instance{c.newErrInstance(err)} 49 43 } 50 44 newC, err := c.complete() 51 45 if err != nil {
-9
cue/load/loader_test.go
··· 31 31 "cuelang.org/go/cue/cuecontext" 32 32 "cuelang.org/go/cue/errors" 33 33 "cuelang.org/go/cue/format" 34 - "cuelang.org/go/internal/cueexperiment" 35 34 "cuelang.org/go/internal/tdtest" 36 35 ) 37 36 38 37 func init() { 39 - // Ignore the value of CUE_EXPERIMENT for the purposes of these tests, 40 - // as we want them to start off with the default experiment values. 41 - os.Setenv("CUE_EXPERIMENT", "") 42 - 43 - // Once we've called cueexperiment.Init, cueexperiment.Vars 44 - // will not be touched again, so we can set fields in it for the tests. 45 - cueexperiment.Init() 46 - 47 38 // The user running `go test` might have a broken environment, 48 39 // such as an invalid $CUE_REGISTRY like the one below, 49 40 // or a broken $DOCKER_CONFIG/config.json due to syntax errors.
-2
cue/load/module_test.go
··· 80 80 qt.Assert(t, qt.IsNil(err)) 81 81 defer r.Close() 82 82 83 - // We're testing that the default modconfig-based behavour works 84 - // as expected when the modules experiment is enabled. 85 83 tmpDir := t.TempDir() 86 84 t.LoadConfig.Env = []string{ 87 85 "CUE_CACHE_DIR=" + filepath.Join(tmpDir, "cache"),
+2
internal/cueexperiment/exp.go
··· 11 11 // When adding, deleting, or modifying entries below, 12 12 // update cmd/cue/cmd/help.go as well for `cue help environment`. 13 13 var Flags struct { 14 + // TODO(mvdan): remove in December 2025; leaving it around for now 15 + // so that we delay breaking any users enabling this experiment. 14 16 Modules bool `envflag:"deprecated,default:true"` 15 17 16 18 // EvalV3 enables the new evaluator. The new evaluator addresses various