Skip to content

Commit 0afe719

Browse files
Enforce strict environment loading and remove duplicate loader
1 parent 5335ab1 commit 0afe719

2 files changed

Lines changed: 93 additions & 45 deletions

File tree

pkg/env/env.go

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,24 @@ import (
44
"fmt"
55
"os"
66
"path/filepath"
7+
8+
"gopkg.in/yaml.v3"
79
)
810

911
const (
1012
codewiseHomeEnv = "CODEWISE_HOME"
1113
)
1214

15+
/////////////////////////////////////////////////////////
16+
// PATH HELPERS
17+
/////////////////////////////////////////////////////////
18+
1319
func baseEnvPath() (string, error) {
14-
// Check override via env var
20+
1521
if home := os.Getenv(codewiseHomeEnv); home != "" {
1622
return filepath.Join(home, "envs"), nil
1723
}
1824

19-
// Fallback to ~/.codewise/envs
2025
home, err := os.UserHomeDir()
2126
if err != nil {
2227
return "", fmt.Errorf("failed to resolve user home: %w", err)
@@ -26,26 +31,91 @@ func baseEnvPath() (string, error) {
2631
}
2732

2833
func envDir(name string) (string, error) {
34+
2935
base, err := baseEnvPath()
3036
if err != nil {
3137
return "", err
3238
}
39+
3340
return filepath.Join(base, name), nil
3441
}
3542

3643
func envExists(name string) bool {
44+
3745
dir, err := envDir(name)
3846
if err != nil {
3947
return false
4048
}
49+
4150
info, err := os.Stat(dir)
4251
return err == nil && info.IsDir()
4352
}
4453

4554
func ensureBaseDir() error {
55+
4656
base, err := baseEnvPath()
4757
if err != nil {
4858
return err
4959
}
60+
5061
return os.MkdirAll(base, 0755)
5162
}
63+
64+
/////////////////////////////////////////////////////////
65+
// YAML READER
66+
/////////////////////////////////////////////////////////
67+
68+
func readYAML(path string, out interface{}) error {
69+
70+
raw, err := os.ReadFile(path)
71+
if err != nil {
72+
return err
73+
}
74+
75+
return yaml.Unmarshal(raw, out)
76+
}
77+
78+
/////////////////////////////////////////////////////////
79+
// SINGLE SOURCE OF TRUTH
80+
/////////////////////////////////////////////////////////
81+
82+
func LoadEnv(name string) (*Env, error) {
83+
84+
if !envExists(name) {
85+
return nil, fmt.Errorf("environment %q does not exist", name)
86+
}
87+
88+
dir, err := envDir(name)
89+
if err != nil {
90+
return nil, err
91+
}
92+
93+
k8s := K8sConfig{}
94+
helm := HelmConfig{}
95+
gitops := GitOpsConfig{}
96+
values := ValuesConfig{}
97+
98+
if err := readYAML(filepath.Join(dir, "k8s.yaml"), &k8s); err != nil {
99+
return nil, err
100+
}
101+
102+
if err := readYAML(filepath.Join(dir, "helm.yaml"), &helm); err != nil {
103+
return nil, err
104+
}
105+
106+
if err := readYAML(filepath.Join(dir, "gitops.yaml"), &gitops); err != nil {
107+
return nil, err
108+
}
109+
110+
if err := readYAML(filepath.Join(dir, "values.yaml"), &values); err != nil {
111+
return nil, err
112+
}
113+
114+
return &Env{
115+
Name: name,
116+
K8s: k8s,
117+
Helm: helm,
118+
GitOps: gitops,
119+
Values: values,
120+
}, nil
121+
}

pkg/env/list.go

Lines changed: 21 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,67 +2,45 @@ package env
22

33
import (
44
"os"
5-
"path/filepath"
6-
7-
"gopkg.in/yaml.v3"
85
)
96

7+
// ListEnvs returns all available environments
108
func ListEnvs() ([]Env, error) {
9+
1110
base, err := baseEnvPath()
1211
if err != nil {
1312
return nil, err
1413
}
1514

15+
// If no environments exist yet,
16+
// return empty slice instead of error.
17+
if _, err := os.Stat(base); os.IsNotExist(err) {
18+
return []Env{}, nil
19+
}
20+
1621
entries, err := os.ReadDir(base)
1722
if err != nil {
1823
return nil, err
1924
}
2025

2126
var envs []Env
22-
for _, entry := range entries {
23-
if entry.IsDir() {
24-
name := entry.Name()
25-
e, err := LoadEnv(name)
26-
if err != nil {
27-
continue
28-
}
29-
envs = append(envs, *e)
30-
}
31-
}
32-
33-
return envs, nil
34-
}
3527

36-
func LoadEnv(name string) (*Env, error) {
37-
dir, err := envDir(name)
38-
if err != nil {
39-
return nil, err
40-
}
28+
for _, entry := range entries {
4129

42-
k8s := K8sConfig{}
43-
helm := HelmConfig{}
44-
gitops := GitOpsConfig{}
45-
values := ValuesConfig{}
30+
if !entry.IsDir() {
31+
continue
32+
}
4633

47-
// read each file if exists
48-
_ = readYAML(filepath.Join(dir, "k8s.yaml"), &k8s)
49-
_ = readYAML(filepath.Join(dir, "helm.yaml"), &helm)
50-
_ = readYAML(filepath.Join(dir, "gitops.yaml"), &gitops)
51-
_ = readYAML(filepath.Join(dir, "values.yaml"), &values)
34+
name := entry.Name()
5235

53-
return &Env{
54-
Name: name,
55-
K8s: k8s,
56-
Helm: helm,
57-
GitOps: gitops,
58-
Values: values,
59-
}, nil
60-
}
36+
e, err := LoadEnv(name)
37+
if err != nil {
38+
// skip corrupted envs safely
39+
continue
40+
}
6141

62-
func readYAML(path string, out interface{}) error {
63-
raw, err := os.ReadFile(path)
64-
if err != nil {
65-
return err
42+
envs = append(envs, *e)
6643
}
67-
return yaml.Unmarshal(raw, out)
44+
45+
return envs, nil
6846
}

0 commit comments

Comments
 (0)