Skip to content

Commit

Permalink
Use dotenv_if_exists
Browse files Browse the repository at this point in the history
  • Loading branch information
mikeland73 committed Aug 10, 2023
1 parent 60a4480 commit 00fceb6
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 37 deletions.
6 changes: 3 additions & 3 deletions devbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type Devbox interface {
Generate(ctx context.Context) error
GenerateDevcontainer(ctx context.Context, force bool) error
GenerateDockerfile(ctx context.Context, force bool) error
GenerateEnvrcFile(ctx context.Context, force bool, additionalFlags []string) error
GenerateEnvrcFile(ctx context.Context, force bool, envFlags devopt.EnvFlags) error
Info(ctx context.Context, pkg string, markdown bool) error
Install(ctx context.Context) error
IsEnvEnabled() bool
Expand Down Expand Up @@ -67,8 +67,8 @@ func GlobalDataPath() (string, error) {
return impl.GlobalDataPath()
}

func PrintEnvrcContent(w io.Writer, additionalFlags []string) error {
return impl.PrintEnvrcContent(w, additionalFlags)
func PrintEnvrcContent(w io.Writer, envFlags devopt.EnvFlags) error {
return impl.PrintEnvrcContent(w, envFlags)
}

// ExportifySystemPathWithoutWrappers reads $PATH, removes `virtenv/.wrappers/bin` paths,
Expand Down
16 changes: 7 additions & 9 deletions internal/boxcli/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,26 @@ import (
"github.com/joho/godotenv"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"go.jetpack.io/devbox/internal/impl/devopt"
)

// to be composed into xyzCmdFlags structs
type envFlag struct {
env map[string]string
envFile string
}
type envFlag devopt.EnvFlags

func (f *envFlag) register(cmd *cobra.Command) {
cmd.PersistentFlags().StringToStringVarP(
&f.env, "env", "e", nil, "environment variables to set in the devbox environment",
&f.EnvMap, "env", "e", nil, "environment variables to set in the devbox environment",
)
cmd.PersistentFlags().StringVar(
&f.envFile, "env-file", "", "path to a file containing environment variables to set in the devbox environment",
&f.EnvFile, "env-file", "", "path to a file containing environment variables to set in the devbox environment",
)
}

func (f *envFlag) Env(path string) (map[string]string, error) {
envs := map[string]string{}
var err error
if f.envFile != "" {
envPath := f.envFile
if f.EnvFile != "" {
envPath := f.EnvFile
if !filepath.IsAbs(envPath) {
envPath = filepath.Join(path, envPath)
}
Expand All @@ -40,7 +38,7 @@ func (f *envFlag) Env(path string) (map[string]string, error) {
}
}

for k, v := range f.env {
for k, v := range f.EnvMap {
envs[k] = v
}

Expand Down
16 changes: 4 additions & 12 deletions internal/boxcli/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,18 +151,9 @@ func runGenerateCmd(cmd *cobra.Command, flags *generateCmdFlags) error {
}

func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) error {
additionalFlags := []string{}
if flags.envFile != "" {
additionalFlags = append(additionalFlags, "--env-file", flags.envFile)
}
if len(flags.env) > 0 {
for k, v := range flags.env {
additionalFlags = append(additionalFlags, "--env", k+"="+v)
}
}

if flags.printEnvrcContent {
return devbox.PrintEnvrcContent(cmd.OutOrStdout(), additionalFlags)
return devbox.PrintEnvrcContent(
cmd.OutOrStdout(), devopt.EnvFlags(flags.envFlag))
}

box, err := devbox.Open(&devopt.Opts{
Expand All @@ -173,5 +164,6 @@ func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) error {
return errors.WithStack(err)
}

return box.GenerateEnvrcFile(cmd.Context(), flags.force, additionalFlags)
return box.GenerateEnvrcFile(
cmd.Context(), flags.force, devopt.EnvFlags(flags.envFlag))
}
8 changes: 4 additions & 4 deletions internal/impl/devbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -431,12 +431,12 @@ func (d *Devbox) GenerateDockerfile(ctx context.Context, force bool) error {
d.projectDir, d.getLocalFlakesDirs(), false /* isDevcontainer */))
}

func PrintEnvrcContent(w io.Writer, additionalFlags []string) error {
return generate.EnvrcContent(w, additionalFlags)
func PrintEnvrcContent(w io.Writer, envFlags devopt.EnvFlags) error {
return generate.EnvrcContent(w, envFlags)
}

// GenerateEnvrcFile generates a .envrc file that makes direnv integration convenient
func (d *Devbox) GenerateEnvrcFile(ctx context.Context, force bool, additionaFlags []string) error {
func (d *Devbox) GenerateEnvrcFile(ctx context.Context, force bool, envFlags devopt.EnvFlags) error {
ctx, task := trace.NewTask(ctx, "devboxGenerateEnvrc")
defer task.End()

Expand All @@ -461,7 +461,7 @@ func (d *Devbox) GenerateEnvrcFile(ctx context.Context, force bool, additionaFla
}

// .envrc file creation
err := generate.CreateEnvrc(ctx, d.projectDir, additionaFlags)
err := generate.CreateEnvrc(ctx, d.projectDir, envFlags)
if err != nil {
return errors.WithStack(err)
}
Expand Down
5 changes: 5 additions & 0 deletions internal/impl/devopt/devboxopts.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,8 @@ type Opts struct {
CustomProcessComposeFile string
Writer io.Writer
}

type EnvFlags struct {
EnvMap map[string]string
EnvFile string
}
34 changes: 27 additions & 7 deletions internal/impl/generate/devcontainer_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"context"
"embed"
"encoding/json"
"fmt"
"html/template"
"io"
"os"
Expand All @@ -18,6 +19,7 @@ import (
"strings"

"go.jetpack.io/devbox/internal/debug"
"go.jetpack.io/devbox/internal/impl/devopt"
)

//go:embed tmpl/*
Expand Down Expand Up @@ -90,7 +92,7 @@ func CreateDevcontainer(ctx context.Context, path string, pkgs []string) error {
return err
}

func CreateEnvrc(ctx context.Context, path string, additionalFlags []string) error {
func CreateEnvrc(ctx context.Context, path string, envFlags devopt.EnvFlags) error {
defer trace.StartRegion(ctx, "createEnvrc").End()

// create .envrc file
Expand All @@ -99,12 +101,23 @@ func CreateEnvrc(ctx context.Context, path string, additionalFlags []string) err
return err
}
defer file.Close()
// get .envrc content
tmplName := "envrc.tmpl"
t := template.Must(template.ParseFS(tmplFS, "tmpl/"+tmplName))

flags := []string{}

if len(envFlags.EnvMap) > 0 {
for k, v := range 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))
}

t := template.Must(template.ParseFS(tmplFS, "tmpl/envrc.tmpl"))

// write content into file
return t.Execute(file, map[string]string{
"AdditionalFlags": strings.Join(additionalFlags, " "),
"Flags": strings.Join(flags, " "),
})
}

Expand Down Expand Up @@ -158,10 +171,17 @@ func getDevcontainerContent(pkgs []string) *devcontainerObject {
return devcontainerContent
}

func EnvrcContent(w io.Writer, additionalFlags []string) error {
func EnvrcContent(w io.Writer, envFlags devopt.EnvFlags) error {
tmplName := "envrcContent.tmpl"
t := template.Must(template.ParseFS(tmplFS, "tmpl/"+tmplName))
envFlag := ""
if len(envFlags.EnvMap) > 0 {
for k, v := range envFlags.EnvMap {
envFlag += fmt.Sprintf("--env %s=%s ", k, v)
}
}
return t.Execute(w, map[string]string{
"AdditionalFlags": strings.Join(additionalFlags, " "),
"EnvFlag": envFlag,
"EnvFile": envFlags.EnvFile,
})
}
2 changes: 1 addition & 1 deletion internal/impl/generate/tmpl/envrc.tmpl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Automatically sets up your devbox environment whenever you cd into this
# directory via our direnv integration:

eval "$(devbox generate direnv --print-envrc{{ if .AdditionalFlags}} {{ .AdditionalFlags }}{{ end }})"
eval "$(devbox generate direnv --print-envrc{{ if .Flags}} {{ .Flags }}{{ end }})"

# check out https://www.jetpack.io/devbox/docs/ide_configuration/direnv/
# for more details
5 changes: 4 additions & 1 deletion internal/impl/generate/tmpl/envrcContent.tmpl
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use_devbox() {
watch_file devbox.json
eval "$(devbox shellenv --init-hook --install{{ if .AdditionalFlags}} {{ .AdditionalFlags }}{{ end }})"
eval "$(devbox shellenv --init-hook --install{{ if .EnvFlag }} {{ .EnvFlag }}{{ end }})"
}
use devbox
{{ if .EnvFile }}
dotenv_if_exists {{ .EnvFile }}
{{ end }}

0 comments on commit 00fceb6

Please sign in to comment.