From 415686e208192b29c367c4d2c8a2787b3f1f5225 Mon Sep 17 00:00:00 2001 From: Paul Stephan <214502986+pstephan-geico-external@users.noreply.github.com> Date: Mon, 9 Jun 2025 10:48:27 -0400 Subject: [PATCH 1/4] Add --envrc-dir flag to allow specifying location of direnv config --- internal/boxcli/generate.go | 66 +++++++++++++++++-- internal/devbox/devbox.go | 16 ++--- internal/devbox/devopt/devboxopts.go | 6 ++ internal/devbox/generate/devcontainer_util.go | 16 +++-- internal/devbox/generate/tmpl/envrc.tmpl | 2 +- .../devbox/generate/tmpl/envrcContent.tmpl | 5 +- .../direnv-envrcdir-config-sibling.test.txt | 10 +++ .../direnv-envrcdir-config-subdir.test.txt | 9 +++ ...irenv-envrcdir-current-config-sub.test.txt | 9 +++ testscripts/generate/direnv-envrcdir.test.txt | 9 +++ .../direnv-printenvrc-config.test.txt | 11 ++++ .../direnv-printenvrc-envrcdir.test.txt | 6 ++ .../generate/direnv-printenvrc.test.txt | 8 +++ testscripts/generate/direnv.test.txt | 5 +- 14 files changed, 155 insertions(+), 23 deletions(-) create mode 100644 testscripts/generate/direnv-envrcdir-config-sibling.test.txt create mode 100644 testscripts/generate/direnv-envrcdir-config-subdir.test.txt create mode 100644 testscripts/generate/direnv-envrcdir-current-config-sub.test.txt create mode 100644 testscripts/generate/direnv-envrcdir.test.txt create mode 100644 testscripts/generate/direnv-printenvrc-config.test.txt create mode 100644 testscripts/generate/direnv-printenvrc-envrcdir.test.txt create mode 100644 testscripts/generate/direnv-printenvrc.test.txt diff --git a/internal/boxcli/generate.go b/internal/boxcli/generate.go index 3c9b5b265ab..a86d0944c12 100644 --- a/internal/boxcli/generate.go +++ b/internal/boxcli/generate.go @@ -6,6 +6,7 @@ package boxcli import ( "cmp" "fmt" + "path/filepath" "regexp" "github.com/pkg/errors" @@ -24,6 +25,7 @@ type generateCmdFlags struct { force bool printEnvrcContent bool rootUser bool + envrcDir string // only used by generate direnv command } type generateDockerfileCmdFlags struct { @@ -151,6 +153,15 @@ func direnvCmd() *cobra.Command { // this command marks a flag as hidden. Error handling for it is not necessary. _ = command.Flags().MarkHidden("print-envrc") + // --envrc-dir allows users to specify a directory where the .envrc file should be generated + // separately from the devbox config directory. Without this flag, the .envrc file + // will be generated in the same directory as the devbox config file (i.e., either the current + // directory or the directory specified by --config). This is useful for users who want to keep + // their .envrc and devbox config files in different locations. + command.Flags().StringVar( + &flags.envrcDir, "envrc-dir", "", "path to directory where the .envrc file should be generated. "+ + "If not specified, the .envrc file will be generated in the current working directory.") + flags.config.register(command) return command } @@ -266,13 +277,32 @@ func runGenerateCmd(cmd *cobra.Command, flags *generateCmdFlags) error { } func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) error { + // --print-envrc is used within the .envrc file and therefore doesn't make sense to also + // use it with --envrc-dir, which specifies a directory where the .envrc file should be generated. + if flags.printEnvrcContent && flags.envrcDir != "" { + return usererr.New( + "Cannot use --print-envrc with --envrc-dir. " + + "Use --envrc-dir to specify the directory where the .envrc file should be generated.") + } + + // Determine the directories for .envrc and config + configDir, envrcDir, err := determineDirenvDirs(flags.config.path, flags.envrcDir) + if err != nil { + return errors.WithStack(err) + } + + generateOpts := devopt.EnvrcOpts{ + EnvrcDir: envrcDir, + ConfigDir: configDir, + EnvFlags: devopt.EnvFlags(flags.envFlag), + } + if flags.printEnvrcContent { - return devbox.PrintEnvrcContent( - cmd.OutOrStdout(), devopt.EnvFlags(flags.envFlag)) + return devbox.PrintEnvrcContent(cmd.OutOrStdout(), generateOpts) } box, err := devbox.Open(&devopt.Opts{ - Dir: flags.config.path, + Dir: filepath.Join(envrcDir, configDir), Environment: flags.config.environment, Stderr: cmd.ErrOrStderr(), }) @@ -281,5 +311,33 @@ func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) error { } return box.GenerateEnvrcFile( - cmd.Context(), flags.force, devopt.EnvFlags(flags.envFlag)) + cmd.Context(), flags.force, generateOpts) +} + +// Returns cononical paths for configDir and envrcDir. Both locations are relative to the current +// working directory when provided to this function. However, since the config file will ultimately +// be relative to the .envrc file, we need to determine the relative path from envrcDir to configDir. +func determineDirenvDirs(configDir, envrcDir string) (string, string, error) { + // If envrcDir is specified, use it as the directory for .envrc and + // then determine configDir relative to that. + if envrcDir != "" { + if configDir == "" { + return "", envrcDir, nil + } + + relativeConfigDir, err := filepath.Rel(envrcDir, configDir) + if err != nil { + return "", "", errors.Wrapf(err, "failed to determine relative path from %s to %s", envrcDir, configDir) + } + + // If the relative path is ".", it means configDir is the same as envrcDir. + if relativeConfigDir == "." { + relativeConfigDir = "" + } + + return relativeConfigDir, envrcDir, nil + } + // If envrcDir is not specified, we will use the configDir as the location for .envrc. This is + // for backward compatibility (prior to the --envrc-dir flag being introduced). + return "", configDir, nil } diff --git a/internal/devbox/devbox.go b/internal/devbox/devbox.go index 22a1d22e3de..d54de1a8851 100644 --- a/internal/devbox/devbox.go +++ b/internal/devbox/devbox.go @@ -527,21 +527,21 @@ func (d *Devbox) GenerateDockerfile(ctx context.Context, generateOpts devopt.Gen })) } -func PrintEnvrcContent(w io.Writer, envFlags devopt.EnvFlags) error { - return generate.EnvrcContent(w, envFlags) +func PrintEnvrcContent(w io.Writer, opts devopt.EnvrcOpts) error { + return generate.EnvrcContent(w, opts) } // GenerateEnvrcFile generates a .envrc file that makes direnv integration convenient -func (d *Devbox) GenerateEnvrcFile(ctx context.Context, force bool, envFlags devopt.EnvFlags) error { +func (d *Devbox) GenerateEnvrcFile(ctx context.Context, force bool, opts devopt.EnvrcOpts) error { ctx, task := trace.NewTask(ctx, "devboxGenerateEnvrc") defer task.End() - envrcfilePath := filepath.Join(d.projectDir, ".envrc") + envrcfilePath := filepath.Join(opts.EnvrcDir, ".envrc") filesExist := fileutil.Exists(envrcfilePath) if !force && filesExist { return usererr.New( - "A .envrc is already present in the current directory. " + - "Remove it or use --force to overwrite it.", + "A .envrc is already present in %q. Remove it or use --force to overwrite it.", + opts.EnvrcDir, ) } @@ -551,11 +551,11 @@ func (d *Devbox) GenerateEnvrcFile(ctx context.Context, force bool, envFlags dev } // .envrc file creation - err := generate.CreateEnvrc(ctx, d.projectDir, envFlags) + err := generate.CreateEnvrc(ctx, opts) if err != nil { return errors.WithStack(err) } - ux.Fsuccessf(d.stderr, "generated .envrc file\n") + ux.Fsuccessf(d.stderr, "generated .envrc file in %q.\n", opts.EnvrcDir) if cmdutil.Exists("direnv") { cmd := exec.Command("direnv", "allow") err := cmd.Run() diff --git a/internal/devbox/devopt/devboxopts.go b/internal/devbox/devopt/devboxopts.go index b59759fe567..07ff21792b5 100644 --- a/internal/devbox/devopt/devboxopts.go +++ b/internal/devbox/devopt/devboxopts.go @@ -34,6 +34,12 @@ type EnvFlags struct { EnvFile string } +type EnvrcOpts struct { + EnvFlags + EnvrcDir string + ConfigDir string +} + type PullboxOpts struct { Overwrite bool URL string diff --git a/internal/devbox/generate/devcontainer_util.go b/internal/devbox/generate/devcontainer_util.go index 7a99372f35f..4e9616d96f6 100644 --- a/internal/devbox/generate/devcontainer_util.go +++ b/internal/devbox/generate/devcontainer_util.go @@ -140,11 +140,11 @@ func (g *Options) CreateDevcontainer(ctx context.Context) error { return err } -func CreateEnvrc(ctx context.Context, path string, envFlags devopt.EnvFlags) error { +func CreateEnvrc(ctx context.Context, opts devopt.EnvrcOpts) error { defer trace.StartRegion(ctx, "createEnvrc").End() // create .envrc file - file, err := os.Create(filepath.Join(path, ".envrc")) + file, err := os.Create(filepath.Join(opts.EnvrcDir, ".envrc")) if err != nil { return err } @@ -152,13 +152,13 @@ func CreateEnvrc(ctx context.Context, path string, envFlags devopt.EnvFlags) err flags := []string{} - if len(envFlags.EnvMap) > 0 { - for k, v := range envFlags.EnvMap { + if len(opts.EnvMap) > 0 { + for k, v := range opts.EnvFlags.EnvMap { flags = append(flags, fmt.Sprintf("--env %s=%s", k, v)) } } - if envFlags.EnvFile != "" { - flags = append(flags, fmt.Sprintf("--env-file %s", envFlags.EnvFile)) + if opts.EnvFile != "" { + flags = append(flags, fmt.Sprintf("--env-file %s", opts.EnvFlags.EnvFile)) } t := template.Must(template.ParseFS(tmplFS, "tmpl/envrc.tmpl")) @@ -166,6 +166,7 @@ func CreateEnvrc(ctx context.Context, path string, envFlags devopt.EnvFlags) err // write content into file return t.Execute(file, map[string]string{ "Flags": strings.Join(flags, " "), + "Dir": opts.ConfigDir, }) } @@ -219,7 +220,7 @@ func (g *Options) getDevcontainerContent() *devcontainerObject { return devcontainerContent } -func EnvrcContent(w io.Writer, envFlags devopt.EnvFlags) error { +func EnvrcContent(w io.Writer, envFlags devopt.EnvrcOpts) error { tmplName := "envrcContent.tmpl" t := template.Must(template.ParseFS(tmplFS, "tmpl/"+tmplName)) envFlag := "" @@ -231,5 +232,6 @@ func EnvrcContent(w io.Writer, envFlags devopt.EnvFlags) error { return t.Execute(w, map[string]string{ "EnvFlag": envFlag, "EnvFile": envFlags.EnvFile, + "Dir": envFlags.EnvrcDir, }) } diff --git a/internal/devbox/generate/tmpl/envrc.tmpl b/internal/devbox/generate/tmpl/envrc.tmpl index 98d6c927a85..fc16cc1ad7f 100644 --- a/internal/devbox/generate/tmpl/envrc.tmpl +++ b/internal/devbox/generate/tmpl/envrc.tmpl @@ -3,7 +3,7 @@ # Automatically sets up your devbox environment whenever you cd into this # directory via our direnv integration: -eval "$(devbox generate direnv --print-envrc{{ if .Flags}} {{ .Flags }}{{ end }})" +eval "$(devbox generate direnv --print-envrc{{ if .Flags}} {{ .Flags }}{{ end }}{{ if .Dir }} --config {{ .Dir -}}{{ end }})" # check out https://www.jetpack.io/devbox/docs/ide_configuration/direnv/ # for more details diff --git a/internal/devbox/generate/tmpl/envrcContent.tmpl b/internal/devbox/generate/tmpl/envrcContent.tmpl index 80538b81d46..3eae552dafb 100644 --- a/internal/devbox/generate/tmpl/envrcContent.tmpl +++ b/internal/devbox/generate/tmpl/envrcContent.tmpl @@ -1,6 +1,7 @@ +{{define "DirPrefix"}}{{ if .Dir }}{{ .Dir }}/{{ end }}{{end}} use_devbox() { - watch_file devbox.json devbox.lock - eval "$(devbox shellenv --init-hook --install --no-refresh-alias{{ if .EnvFlag }} {{ .EnvFlag }}{{ end }})" + watch_file {{template "DirPrefix" .}}devbox.json {{template "DirPrefix" .}}devbox.lock + eval "$(devbox shellenv --init-hook --install --no-refresh-alias {{ if .EnvFlag }}{{ .EnvFlag }}{{ end }} {{- if .Dir }}--config {{ .Dir -}}{{ end }})" } use devbox {{ if .EnvFile }} diff --git a/testscripts/generate/direnv-envrcdir-config-sibling.test.txt b/testscripts/generate/direnv-envrcdir-config-sibling.test.txt new file mode 100644 index 00000000000..27451e0f54c --- /dev/null +++ b/testscripts/generate/direnv-envrcdir-config-sibling.test.txt @@ -0,0 +1,10 @@ +# Testscript to validate generating a direnv .envrc in a specified location (./dir) that also +# references a devbox config in another dir (./cfg) that is a sibling to the first. + +mkdir cfg +exec devbox init cfg +exists cfg/devbox.json + +mkdir dir +exec devbox generate direnv --envrc-dir dir --config cfg +grep 'eval "\$\(devbox generate direnv --print-envrc --config ../cfg\)"' dir/.envrc diff --git a/testscripts/generate/direnv-envrcdir-config-subdir.test.txt b/testscripts/generate/direnv-envrcdir-config-subdir.test.txt new file mode 100644 index 00000000000..de7a798bf63 --- /dev/null +++ b/testscripts/generate/direnv-envrcdir-config-subdir.test.txt @@ -0,0 +1,9 @@ +# Testscript to validate generating a direnv .envrc in a specified location (./dir) that also +# references a devbox config in another dir (./cfg) that is a subdir of the first. + +mkdir dir/cfg +exec devbox init dir/cfg +exists dir/cfg/devbox.json + +exec devbox generate direnv --envrc-dir dir --config dir/cfg +grep 'eval "\$\(devbox generate direnv --print-envrc --config cfg\)"' dir/.envrc diff --git a/testscripts/generate/direnv-envrcdir-current-config-sub.test.txt b/testscripts/generate/direnv-envrcdir-current-config-sub.test.txt new file mode 100644 index 00000000000..d6ab9bfe96d --- /dev/null +++ b/testscripts/generate/direnv-envrcdir-current-config-sub.test.txt @@ -0,0 +1,9 @@ +# Testscript to validate generating a direnv .envrc in the current location that +# references a devbox config in a subdir (./cfg). + +mkdir cfg +exec devbox init cfg +exists cfg/devbox.json + +exec devbox generate direnv --envrc-dir . --config cfg +grep 'eval "\$\(devbox generate direnv --print-envrc --config cfg\)"' ./.envrc diff --git a/testscripts/generate/direnv-envrcdir.test.txt b/testscripts/generate/direnv-envrcdir.test.txt new file mode 100644 index 00000000000..a8f939c1066 --- /dev/null +++ b/testscripts/generate/direnv-envrcdir.test.txt @@ -0,0 +1,9 @@ +# Testscript to validate generating a direnv .envrc in a specified location (./cfg) that also +# references a devbox config in the same location (no --config needed) + +mkdir cfg +exec devbox init cfg +exists cfg/devbox.json + +exec devbox generate direnv --envrc-dir cfg +grep 'eval "\$\(devbox generate direnv --print-envrc\)"' cfg/.envrc diff --git a/testscripts/generate/direnv-printenvrc-config.test.txt b/testscripts/generate/direnv-printenvrc-config.test.txt new file mode 100644 index 00000000000..16eec3f3d43 --- /dev/null +++ b/testscripts/generate/direnv-printenvrc-config.test.txt @@ -0,0 +1,11 @@ +# Testscript to validate generating the contents of the .envrc file. In this case the +# config location is ignored because there is no --envrc-dir param. + +exec devbox init +exec devbox generate direnv --print-envrc --config config-dir +cp stdout results.txt +grep 'watch_file config-dir/devbox.json config-dir/devbox.lock' results.txt +grep 'eval "\$\(devbox shellenv --init-hook --install --no-refresh-alias --config config-dir\)"' results.txt +! exists .envrc +! exists config-dir +! exists config-dir/.envrc \ No newline at end of file diff --git a/testscripts/generate/direnv-printenvrc-envrcdir.test.txt b/testscripts/generate/direnv-printenvrc-envrcdir.test.txt new file mode 100644 index 00000000000..4bc0aae416a --- /dev/null +++ b/testscripts/generate/direnv-printenvrc-envrcdir.test.txt @@ -0,0 +1,6 @@ +# Testscript to validate that the --print-envrc and --envrc-dir params are not allowed +# to be used at the same time. + +exec devbox init +! exec devbox generate direnv --print-envrc --envrc-dir dir +stderr 'Cannot use --print-envrc with --envrc-dir' \ No newline at end of file diff --git a/testscripts/generate/direnv-printenvrc.test.txt b/testscripts/generate/direnv-printenvrc.test.txt new file mode 100644 index 00000000000..a38f11e7da9 --- /dev/null +++ b/testscripts/generate/direnv-printenvrc.test.txt @@ -0,0 +1,8 @@ +# Testscript to validate teh output of --print-envrc + +exec devbox init +exec devbox generate direnv --print-envrc +cp stdout results.txt +grep 'watch_file devbox.json devbox.lock' results.txt +grep 'eval "\$\(devbox shellenv --init-hook --install --no-refresh-alias \)"' results.txt +! exists .envrc \ No newline at end of file diff --git a/testscripts/generate/direnv.test.txt b/testscripts/generate/direnv.test.txt index 3863a7915e8..9c0c53692d0 100644 --- a/testscripts/generate/direnv.test.txt +++ b/testscripts/generate/direnv.test.txt @@ -1,4 +1,7 @@ +# Testscript to validate generating the contents of the .envrc file. + exec devbox init exec devbox generate direnv exists .envrc - +exists devbox.json +grep 'eval "\$\(devbox generate direnv --print-envrc\)"' .envrc From 6da0d572e648fa38aa207aeb45bdc582b76cfebb Mon Sep 17 00:00:00 2001 From: Paul Stephan <214502986+pstephan-geico-external@users.noreply.github.com> Date: Thu, 12 Jun 2025 10:47:51 -0400 Subject: [PATCH 2/4] Updates in response to code review --- internal/boxcli/generate.go | 44 ++++++++++--------- internal/devbox/devbox.go | 2 +- internal/devbox/generate/devcontainer_util.go | 4 +- .../generate/direnv-printenvrc.test.txt | 2 +- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/internal/boxcli/generate.go b/internal/boxcli/generate.go index a86d0944c12..b331e847e09 100644 --- a/internal/boxcli/generate.go +++ b/internal/boxcli/generate.go @@ -318,26 +318,30 @@ func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) error { // working directory when provided to this function. However, since the config file will ultimately // be relative to the .envrc file, we need to determine the relative path from envrcDir to configDir. func determineDirenvDirs(configDir, envrcDir string) (string, string, error) { - // If envrcDir is specified, use it as the directory for .envrc and - // then determine configDir relative to that. - if envrcDir != "" { - if configDir == "" { - return "", envrcDir, nil - } - - relativeConfigDir, err := filepath.Rel(envrcDir, configDir) - if err != nil { - return "", "", errors.Wrapf(err, "failed to determine relative path from %s to %s", envrcDir, configDir) - } - - // If the relative path is ".", it means configDir is the same as envrcDir. - if relativeConfigDir == "." { - relativeConfigDir = "" - } - - return relativeConfigDir, envrcDir, nil - } // If envrcDir is not specified, we will use the configDir as the location for .envrc. This is // for backward compatibility (prior to the --envrc-dir flag being introduced). - return "", configDir, nil + if envrcDir == "" { + return "", configDir, nil + } + + // If no configDir is specified, it will be assumed to be in the same directory as the .envrc file + // which means we can just return an empty configDir. + if configDir == "" { + return "", envrcDir, nil + } + + relativeConfigDir, err := filepath.Rel(envrcDir, configDir) + if err != nil { + return "", "", errors.Wrapf(err, "failed to determine relative path from %s to %s", envrcDir, configDir) + } + + // If the relative path is ".", it means configDir is the same as envrcDir. Leaving it as "." + // will result in the .envrc containing "--config .", which is fine, but unnecessary and also + // a change from the previous behavior. So we will return an empty string for relativeConfigDir + // which will result in the .envrc file not containing the "--config" flag at all. + if relativeConfigDir == "." { + relativeConfigDir = "" + } + + return relativeConfigDir, envrcDir, nil } diff --git a/internal/devbox/devbox.go b/internal/devbox/devbox.go index d54de1a8851..0f87f46c02a 100644 --- a/internal/devbox/devbox.go +++ b/internal/devbox/devbox.go @@ -555,7 +555,7 @@ func (d *Devbox) GenerateEnvrcFile(ctx context.Context, force bool, opts devopt. if err != nil { return errors.WithStack(err) } - ux.Fsuccessf(d.stderr, "generated .envrc file in %q.\n", opts.EnvrcDir) + ux.Fsuccessf(d.stderr, "generated .envrc file\n") if cmdutil.Exists("direnv") { cmd := exec.Command("direnv", "allow") err := cmd.Run() diff --git a/internal/devbox/generate/devcontainer_util.go b/internal/devbox/generate/devcontainer_util.go index 4e9616d96f6..0e9257a2455 100644 --- a/internal/devbox/generate/devcontainer_util.go +++ b/internal/devbox/generate/devcontainer_util.go @@ -153,12 +153,12 @@ func CreateEnvrc(ctx context.Context, opts devopt.EnvrcOpts) error { flags := []string{} if len(opts.EnvMap) > 0 { - for k, v := range opts.EnvFlags.EnvMap { + for k, v := range opts.EnvMap { flags = append(flags, fmt.Sprintf("--env %s=%s", k, v)) } } if opts.EnvFile != "" { - flags = append(flags, fmt.Sprintf("--env-file %s", opts.EnvFlags.EnvFile)) + flags = append(flags, fmt.Sprintf("--env-file %s", opts.EnvFile)) } t := template.Must(template.ParseFS(tmplFS, "tmpl/envrc.tmpl")) diff --git a/testscripts/generate/direnv-printenvrc.test.txt b/testscripts/generate/direnv-printenvrc.test.txt index a38f11e7da9..c3dfbe404a2 100644 --- a/testscripts/generate/direnv-printenvrc.test.txt +++ b/testscripts/generate/direnv-printenvrc.test.txt @@ -1,4 +1,4 @@ -# Testscript to validate teh output of --print-envrc +# Testscript to validate the output of --print-envrc exec devbox init exec devbox generate direnv --print-envrc From df12f6879c2a8edbef37b588216264c2a8adb229 Mon Sep 17 00:00:00 2001 From: Paul Stephan <214502986+pstephan-geico-external@users.noreply.github.com> Date: Thu, 12 Jun 2025 14:22:26 -0400 Subject: [PATCH 3/4] Corrected the allow command --- internal/devbox/devbox.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/devbox/devbox.go b/internal/devbox/devbox.go index 0f87f46c02a..69a65709b93 100644 --- a/internal/devbox/devbox.go +++ b/internal/devbox/devbox.go @@ -555,14 +555,14 @@ func (d *Devbox) GenerateEnvrcFile(ctx context.Context, force bool, opts devopt. if err != nil { return errors.WithStack(err) } - ux.Fsuccessf(d.stderr, "generated .envrc file\n") + ux.Fsuccessf(d.stderr, "generated .envrc file in %q.\n", opts.EnvrcDir) if cmdutil.Exists("direnv") { - cmd := exec.Command("direnv", "allow") + cmd := exec.Command("direnv", "allow", opts.EnvrcDir) err := cmd.Run() if err != nil { return errors.WithStack(err) } - ux.Fsuccessf(d.stderr, "ran `direnv allow`\n") + ux.Fsuccessf(d.stderr, "ran `direnv allow %s`\n", opts.EnvrcDir) } return nil } From d005a8d59f5778b02a2d0ea634abe4f6592cafc9 Mon Sep 17 00:00:00 2001 From: Paul Stephan <214502986+pstephan-geico-external@users.noreply.github.com> Date: Tue, 17 Jun 2025 16:41:42 -0400 Subject: [PATCH 4/4] More review tweaks --- internal/boxcli/generate.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/internal/boxcli/generate.go b/internal/boxcli/generate.go index b331e847e09..0a250dc1566 100644 --- a/internal/boxcli/generate.go +++ b/internal/boxcli/generate.go @@ -149,7 +149,8 @@ func direnvCmd() *cobra.Command { command.Flags().BoolVarP( &flags.force, "force", "f", false, "force overwrite existing files") command.Flags().BoolVarP( - &flags.printEnvrcContent, "print-envrc", "p", false, "output contents of devbox configuration to use in .envrc") + &flags.printEnvrcContent, "print-envrc", "p", false, + "output contents of devbox configuration to use in .envrc") // this command marks a flag as hidden. Error handling for it is not necessary. _ = command.Flags().MarkHidden("print-envrc") @@ -159,8 +160,10 @@ func direnvCmd() *cobra.Command { // directory or the directory specified by --config). This is useful for users who want to keep // their .envrc and devbox config files in different locations. command.Flags().StringVar( - &flags.envrcDir, "envrc-dir", "", "path to directory where the .envrc file should be generated. "+ - "If not specified, the .envrc file will be generated in the current working directory.") + &flags.envrcDir, "envrc-dir", "", + "path to directory where the .envrc file should be generated. "+ + "If not specified, the .envrc file will be generated in "+ + "the current working directory.") flags.config.register(command) return command