@@ -15,10 +15,9 @@ import (
15
15
"runtime/trace"
16
16
"strings"
17
17
"text/tabwriter"
18
+ "text/template"
18
19
19
- "github.com/AlecAivazis/survey/v2"
20
20
"github.com/fatih/color"
21
- "github.com/mattn/go-isatty"
22
21
"github.com/pkg/errors"
23
22
"github.com/samber/lo"
24
23
"golang.org/x/exp/slices"
@@ -42,6 +41,7 @@ import (
42
41
"go.jetpack.io/devbox/internal/searcher"
43
42
"go.jetpack.io/devbox/internal/services"
44
43
"go.jetpack.io/devbox/internal/telemetry"
44
+ "go.jetpack.io/devbox/internal/ux"
45
45
"go.jetpack.io/devbox/internal/wrapnix"
46
46
)
47
47
@@ -142,7 +142,12 @@ func (d *Devbox) ConfigHash() (string, error) {
142
142
}
143
143
144
144
func (d * Devbox ) NixPkgsCommitHash () string {
145
- return d .cfg .Nixpkgs .Commit
145
+ if hash := d .cfg .Nixpkgs .Commit ; hash != "" {
146
+ return hash
147
+ }
148
+ // Tests don't have a nixpkgs commit, so we use the default one.
149
+ // Not sure if users ever run into this.
150
+ return plansdk .DefaultNixpkgsCommit
146
151
}
147
152
148
153
func (d * Devbox ) ShellPlan () (* plansdk.ShellPlan , error ) {
@@ -197,10 +202,10 @@ func (d *Devbox) Shell(ctx context.Context) error {
197
202
return err
198
203
}
199
204
200
- shellStartTime := os . Getenv ( envir .DevboxShellStartTime )
201
- if shellStartTime == "" {
202
- shellStartTime = telemetry .UnixTimestampFromTime (telemetry .CommandStartTime ())
203
- }
205
+ shellStartTime := envir .GetValueOrDefault (
206
+ envir . DevboxShellStartTime ,
207
+ telemetry .UnixTimestampFromTime (telemetry .CommandStartTime ()),
208
+ )
204
209
205
210
opts := []ShellOption {
206
211
WithHooksFilePath (d .scriptPath (hooksFilename )),
@@ -383,8 +388,15 @@ func (d *Devbox) GenerateDockerfile(force bool) error {
383
388
return errors .WithStack (generate .CreateDockerfile (tmplFS , d .projectDir ))
384
389
}
385
390
386
- // GenerateEnvrc generates a .envrc file that makes direnv integration convenient
387
- func (d * Devbox ) GenerateEnvrc (force bool , source string ) error {
391
+ func (d * Devbox ) PrintEnvrcContent (w io.Writer ) error {
392
+ tmplName := "envrcContent.tmpl"
393
+ t := template .Must (template .ParseFS (tmplFS , "tmpl/" + tmplName ))
394
+ // write content into file
395
+ return t .Execute (w , nil )
396
+ }
397
+
398
+ // GenerateEnvrcFile generates a .envrc file that makes direnv integration convenient
399
+ func (d * Devbox ) GenerateEnvrcFile (force bool ) error {
388
400
ctx , task := trace .NewTask (context .Background (), "devboxGenerateEnvrc" )
389
401
defer task .End ()
390
402
@@ -397,48 +409,31 @@ func (d *Devbox) GenerateEnvrc(force bool, source string) error {
397
409
)
398
410
}
399
411
// confirm .envrc doesn't exist and don't overwrite an existing .envrc
400
- if cmdutil .Exists ("direnv" ) {
401
- // prompt for direnv allow
402
- var result string
403
- isInteractiveMode := isatty .IsTerminal (os .Stdin .Fd ())
404
- if isInteractiveMode {
405
- prompt := & survey.Input {
406
- Message : "Do you want to enable direnv integration for this devbox project? [y/N]" ,
407
- }
408
- err := survey .AskOne (prompt , & result )
409
- if err != nil {
410
- return errors .WithStack (err )
411
- }
412
- }
413
-
414
- if strings .ToLower (result ) == "y" || ! isInteractiveMode || source == "generate" {
415
- if err := nix .EnsureNixInstalled (
416
- d .writer , func () * bool { return lo .ToPtr (false ) },
417
- ); err != nil {
418
- return err
419
- }
420
-
421
- // generate all shell files to ensure we can refer to them in the .envrc script
422
- if err := d .ensurePackagesAreInstalled (ctx , ensure ); err != nil {
423
- return err
424
- }
412
+ if err := nix .EnsureNixInstalled (
413
+ d .writer , func () * bool { return lo .ToPtr (false ) },
414
+ ); err != nil {
415
+ return err
416
+ }
425
417
426
- // .envrc file creation
427
- err := generate .CreateEnvrc (tmplFS , d .projectDir )
428
- if err != nil {
429
- return errors .WithStack (err )
430
- }
431
- }
418
+ // generate all shell files to ensure we can refer to them in the .envrc script
419
+ if err := d .ensurePackagesAreInstalled (ctx , ensure ); err != nil {
420
+ return err
421
+ }
432
422
433
- if strings .ToLower (result ) == "y" || ! isInteractiveMode {
434
- cmd := exec .Command ("direnv" , "allow" )
435
- err := cmd .Run ()
436
- if err != nil {
437
- return errors .WithStack (err )
438
- }
423
+ // .envrc file creation
424
+ err := generate .CreateEnvrc (tmplFS , d .projectDir )
425
+ if err != nil {
426
+ return errors .WithStack (err )
427
+ }
428
+ ux .Fsuccess (d .writer , "generated .envrc file\n " )
429
+ if cmdutil .Exists ("direnv" ) {
430
+ cmd := exec .Command ("direnv" , "allow" )
431
+ err := cmd .Run ()
432
+ if err != nil {
433
+ return errors .WithStack (err )
439
434
}
435
+ ux .Fsuccess (d .writer , "ran `direnv allow`\n " )
440
436
}
441
-
442
437
return nil
443
438
}
444
439
0 commit comments