Skip to content

Commit 067eb92

Browse files
authored
[envsec] Fix devbox.json field and handle envsec errors (#1482)
## Summary * Fixes field name * Handles json errors returned by envsec ## How was it tested? `devbox run build`
1 parent 1943c4b commit 067eb92

File tree

3 files changed

+32
-13
lines changed

3 files changed

+32
-13
lines changed

internal/devconfig/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type Config struct {
2828
Env map[string]string `json:"env,omitempty"`
2929

3030
// Only allows "envsec" for now
31-
FromEnv string `json:"from_env,omitempty"`
31+
EnvFrom string `json:"env_from,omitempty"`
3232

3333
// Shell configures the devbox shell environment.
3434
Shell *shellConfig `json:"shell,omitempty"`

internal/devconfig/env.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ func (c *Config) ComputedEnv(projectDir string) (map[string]string, error) {
1010
env := map[string]string{}
1111
var err error
1212
if featureflag.Envsec.Enabled() {
13-
if c.FromEnv == "envsec" {
13+
if c.EnvFrom == "envsec" {
1414
env, err = envsec.Env(projectDir)
1515
if err != nil {
1616
return nil, err
1717
}
18-
} else if c.FromEnv != "" {
19-
return nil, usererr.New("unknown from_env value: %s", c.FromEnv)
18+
} else if c.EnvFrom != "" {
19+
return nil, usererr.New("unknown from_env value: %s", c.EnvFrom)
2020
}
2121
}
2222
for k, v := range c.Env {

internal/integrations/envsec/envsec.go

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package envsec
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"os/exec"
67

@@ -15,7 +16,7 @@ func Env(projectDir string) (map[string]string, error) {
1516
return nil, err
1617
}
1718

18-
if err := ensureEnvsecInitialized(); err != nil {
19+
if err := ensureEnvsecInitialized(projectDir); err != nil {
1920
return nil, err
2021
}
2122

@@ -29,30 +30,38 @@ func ensureEnvsecInstalled() error {
2930
return nil
3031
}
3132

32-
func ensureEnvsecInitialized() error {
33-
cmd := exec.Command("envsec", "init")
34-
// TODO handle user not logged in
35-
// envsec init is currently broken in that it exits with 0 even if the user is not logged in
36-
return cmd.Run()
33+
func ensureEnvsecInitialized(projectDir string) error {
34+
cmd := exec.Command("envsec", "init", "--json-errors")
35+
cmd.Dir = projectDir
36+
var bufErr bytes.Buffer
37+
cmd.Stderr = &bufErr
38+
39+
if err := cmd.Run(); err != nil {
40+
return handleError(&bufErr, err)
41+
}
42+
return nil
3743
}
3844

3945
func envsecList(projectDir string) (map[string]string, error) {
4046
cmd := exec.Command(
4147
"envsec", "ls", "--show",
4248
"--format", "json",
43-
"--environment", "dev")
49+
"--environment", "dev",
50+
"--json-errors")
4451
cmd.Dir = projectDir
52+
var bufErr bytes.Buffer
53+
cmd.Stderr = &bufErr
4554
out, err := cmd.Output()
4655
if err != nil {
47-
return nil, errors.WithStack(err)
56+
return nil, handleError(&bufErr, err)
4857
}
4958
var values []struct {
5059
Name string `json:"name"`
5160
Value string `json:"value"`
5261
}
5362

5463
if err := json.Unmarshal(out, &values); err != nil {
55-
return nil, errors.Wrap(err, "failed to parse envsec output")
64+
return nil, errors.Wrapf(err, "failed to parse envsec output: %s", out)
5665
}
5766

5867
m := map[string]string{}
@@ -61,3 +70,13 @@ func envsecList(projectDir string) (map[string]string, error) {
6170
}
6271
return m, nil
6372
}
73+
74+
func handleError(stderr *bytes.Buffer, err error) error {
75+
var errResponse struct {
76+
Error string `json:"error"`
77+
}
78+
if err := json.Unmarshal(stderr.Bytes(), &errResponse); err == nil {
79+
return usererr.New(errResponse.Error)
80+
}
81+
return errors.WithStack(err)
82+
}

0 commit comments

Comments
 (0)