Skip to content

[env] Add env flags to direnv commands #1354

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Aug 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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) 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) error {
return impl.PrintEnvrcContent(w)
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
8 changes: 6 additions & 2 deletions internal/boxcli/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
)

type generateCmdFlags struct {
envFlag // only used by generate direnv command
config configFlags
force bool
printEnvrcContent bool
Expand Down Expand Up @@ -96,6 +97,7 @@ func direnvCmd() *cobra.Command {
return runGenerateDirenvCmd(cmd, flags)
},
}
flags.envFlag.register(command)
command.Flags().BoolVarP(
&flags.force, "force", "f", false, "force overwrite existing files")
command.Flags().BoolVarP(
Expand Down Expand Up @@ -150,7 +152,8 @@ func runGenerateCmd(cmd *cobra.Command, flags *generateCmdFlags) error {

func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) error {
if flags.printEnvrcContent {
return devbox.PrintEnvrcContent(cmd.OutOrStdout())
return devbox.PrintEnvrcContent(
cmd.OutOrStdout(), devopt.EnvFlags(flags.envFlag))
}

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

return box.GenerateEnvrcFile(cmd.Context(), flags.force)
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) error {
return generate.EnvrcContent(w)
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) 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) error {
}

// .envrc file creation
err := generate.CreateEnvrc(ctx, d.projectDir)
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
}
38 changes: 31 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) error {
func CreateEnvrc(ctx context.Context, path string, envFlags devopt.EnvFlags) error {
defer trace.StartRegion(ctx, "createEnvrc").End()

// create .envrc file
Expand All @@ -99,11 +101,24 @@ func CreateEnvrc(ctx context.Context, path string) error {
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, nil)
return t.Execute(file, map[string]string{
"Flags": strings.Join(flags, " "),
})
}

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

func EnvrcContent(w io.Writer) error {
func EnvrcContent(w io.Writer, envFlags devopt.EnvFlags) error {
tmplName := "envrcContent.tmpl"
t := template.Must(template.ParseFS(tmplFS, "tmpl/"+tmplName))
return t.Execute(w, nil)
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{
"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)"
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)"
eval "$(devbox shellenv --init-hook --install{{ if .EnvFlag }} {{ .EnvFlag }}{{ end }})"
}
use devbox
{{ if .EnvFile }}
dotenv_if_exists {{ .EnvFile }}
{{ end }}