Skip to content

Commit cc5d335

Browse files
committed
Merge branch 'main' into landau/fix-prerelease-job
2 parents d627226 + 3cd4dbf commit cc5d335

File tree

16 files changed

+95
-91
lines changed

16 files changed

+95
-91
lines changed

devbox.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@ type Devbox interface {
2727
Generate() error
2828
GenerateDevcontainer(force bool) error
2929
GenerateDockerfile(force bool) error
30-
GenerateEnvrc(force bool, source string) error
30+
GenerateEnvrcFile(force bool) error
3131
Info(pkg string, markdown bool) error
3232
ListScripts() []string
3333
PrintEnv(ctx context.Context, includeHooks bool) (string, error)
3434
PrintGlobalList() error
35+
PrintEnvrcContent(w io.Writer) error
3536
PullGlobal(path string) error
3637
// Remove removes Nix packages from the config so that it no longer exists in
3738
// the devbox environment.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package featureflag
22

3-
var LockFile = disabled("LOCKFILE")
3+
var LockFile = enabled("LOCKFILE")

internal/boxcli/generate.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
package boxcli
55

66
import (
7-
"os"
8-
97
"github.com/pkg/errors"
108
"github.com/spf13/cobra"
119

@@ -14,9 +12,10 @@ import (
1412
)
1513

1614
type generateCmdFlags struct {
17-
config configFlags
18-
force bool
19-
githubUsername string
15+
config configFlags
16+
force bool
17+
printEnvrcContent bool
18+
githubUsername string
2019
}
2120

2221
func generateCmd() *cobra.Command {
@@ -98,6 +97,11 @@ func direnvCmd() *cobra.Command {
9897
}
9998
command.Flags().BoolVarP(
10099
&flags.force, "force", "f", false, "force overwrite existing files")
100+
command.Flags().BoolVarP(
101+
&flags.printEnvrcContent, "print-envrc", "p", false, "output contents of devbox configuration to use in .envrc")
102+
// this command marks a flag as hidden. Error handling for it is not necessary.
103+
_ = command.Flags().MarkHidden("print-envrc")
104+
101105
flags.config.register(command)
102106
return command
103107
}
@@ -125,7 +129,7 @@ func sshConfigCmd() *cobra.Command {
125129

126130
func runGenerateCmd(cmd *cobra.Command, flags *generateCmdFlags) error {
127131
// Check the directory exists.
128-
box, err := devbox.Open(flags.config.path, os.Stdout)
132+
box, err := devbox.Open(flags.config.path, cmd.ErrOrStderr())
129133
if err != nil {
130134
return errors.WithStack(err)
131135
}
@@ -137,7 +141,10 @@ func runGenerateCmd(cmd *cobra.Command, flags *generateCmdFlags) error {
137141
case "dockerfile":
138142
return box.GenerateDockerfile(flags.force)
139143
case "direnv":
140-
return box.GenerateEnvrc(flags.force, "generate")
144+
if flags.printEnvrcContent {
145+
return box.PrintEnvrcContent(cmd.OutOrStdout())
146+
}
147+
return box.GenerateEnvrcFile(flags.force)
141148
}
142149
return nil
143150
}

internal/boxcli/init.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,6 @@ func runInitCmd(cmd *cobra.Command, args []string) error {
3232
if err != nil {
3333
return errors.WithStack(err)
3434
}
35-
box, err := devbox.Open(path, cmd.ErrOrStderr())
36-
if err != nil {
37-
return errors.WithStack(err)
38-
}
3935

40-
return errors.WithStack(box.GenerateEnvrc(false, "init"))
36+
return nil
4137
}

internal/envir/util.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,14 @@ func IsCI() bool {
4747
ci, err := strconv.ParseBool(os.Getenv("CI"))
4848
return ci && err == nil
4949
}
50+
51+
// GetValueOrDefault gets the value of an environment variable.
52+
// If it's empty, it will return the given default value instead.
53+
func GetValueOrDefault(key, def string) string {
54+
val := os.Getenv(key)
55+
if val == "" {
56+
val = def
57+
}
58+
59+
return val
60+
}

internal/impl/devbox.go

Lines changed: 42 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ import (
1515
"runtime/trace"
1616
"strings"
1717
"text/tabwriter"
18+
"text/template"
1819

19-
"github.com/AlecAivazis/survey/v2"
2020
"github.com/fatih/color"
21-
"github.com/mattn/go-isatty"
2221
"github.com/pkg/errors"
2322
"github.com/samber/lo"
2423
"golang.org/x/exp/slices"
@@ -42,6 +41,7 @@ import (
4241
"go.jetpack.io/devbox/internal/searcher"
4342
"go.jetpack.io/devbox/internal/services"
4443
"go.jetpack.io/devbox/internal/telemetry"
44+
"go.jetpack.io/devbox/internal/ux"
4545
"go.jetpack.io/devbox/internal/wrapnix"
4646
)
4747

@@ -142,7 +142,12 @@ func (d *Devbox) ConfigHash() (string, error) {
142142
}
143143

144144
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
146151
}
147152

148153
func (d *Devbox) ShellPlan() (*plansdk.ShellPlan, error) {
@@ -197,10 +202,10 @@ func (d *Devbox) Shell(ctx context.Context) error {
197202
return err
198203
}
199204

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+
)
204209

205210
opts := []ShellOption{
206211
WithHooksFilePath(d.scriptPath(hooksFilename)),
@@ -383,8 +388,15 @@ func (d *Devbox) GenerateDockerfile(force bool) error {
383388
return errors.WithStack(generate.CreateDockerfile(tmplFS, d.projectDir))
384389
}
385390

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 {
388400
ctx, task := trace.NewTask(context.Background(), "devboxGenerateEnvrc")
389401
defer task.End()
390402

@@ -397,48 +409,31 @@ func (d *Devbox) GenerateEnvrc(force bool, source string) error {
397409
)
398410
}
399411
// 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+
}
425417

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+
}
432422

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)
439434
}
435+
ux.Fsuccess(d.writer, "ran `direnv allow`\n")
440436
}
441-
442437
return nil
443438
}
444439

internal/impl/tmpl/envrc.tmpl

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
11
# Automatically sets up your devbox environment whenever you cd into this
22
# directory via our direnv integration:
33

4-
use_devbox() {
5-
watch_file devbox.json
6-
if [ -f .devbox/gen/flake/flake.nix ]; then
7-
DEVBOX_SHELL_ENABLED_BACKUP=$DEVBOX_SHELL_ENABLED
8-
eval "$(devbox shellenv --init-hook)"
9-
export DEVBOX_SHELL_ENABLED=$DEVBOX_SHELL_ENABLED_BACKUP
10-
fi
11-
}
12-
use devbox
4+
eval "$(devbox generate direnv --print-envrc)"
135

146
# check out https://www.jetpack.io/devbox/docs/ide_configuration/direnv/
157
# for more details
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
use_devbox() {
2+
watch_file devbox.json
3+
eval "$(devbox shellenv --init-hook)"
4+
}
5+
use devbox

internal/initrec/recommenders/javascript/nodejs.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ type Recommender struct {
2020
var _ recommenders.Recommender = (*Recommender)(nil)
2121

2222
func (r *Recommender) IsRelevant() bool {
23-
packageJSONPath := filepath.Join(r.SrcDir, "package.json")
24-
return fileutil.Exists(packageJSONPath)
23+
return fileutil.Exists(filepath.Join(r.SrcDir, "package.json"))
2524
}
2625

2726
func (r *Recommender) Packages() []string {
@@ -74,8 +73,7 @@ func (r *Recommender) nodeVersion(project *nodeProject) *plansdk.Version {
7473
}
7574

7675
func (r *Recommender) packageManager() string {
77-
yarnPkgLockPath := filepath.Join(r.SrcDir, "yarn.lock")
78-
if fileutil.Exists(yarnPkgLockPath) {
76+
if fileutil.Exists(filepath.Join(r.SrcDir, "yarn.lock")) {
7977
return "yarn"
8078
}
8179
return "npm"

internal/initrec/recommenders/python/python_poetry.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (r *RecommenderPoetry) Packages() []string {
3939
// TODO: This can be generalized to all python planners
4040
func (r *RecommenderPoetry) PythonVersion() *plansdk.Version {
4141
defaultVersion, _ := plansdk.NewVersion("3.10.6")
42-
project := r.PyProject()
42+
project := r.pyProject()
4343

4444
if project == nil {
4545
return defaultVersion
@@ -67,7 +67,7 @@ type pyProject struct {
6767
} `toml:"tool"`
6868
}
6969

70-
func (r *RecommenderPoetry) PyProject() *pyProject {
70+
func (r *RecommenderPoetry) pyProject() *pyProject {
7171
pyProjectPath := filepath.Join(r.SrcDir, "pyproject.toml")
7272
content, err := os.ReadFile(pyProjectPath)
7373
if err != nil {

0 commit comments

Comments
 (0)