89 lines
1.8 KiB
Go
89 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"text/template"
|
|
|
|
"github.com/Masterminds/sprig/v3"
|
|
"gopkg.in/yaml.v2"
|
|
)
|
|
|
|
func findProjectRoot() (string, error) {
|
|
curDir, err := os.Getwd()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
prevDir := ""
|
|
for curDir != prevDir {
|
|
if _, err := os.Stat(filepath.Join(curDir, ".git")); err == nil {
|
|
return curDir, nil
|
|
} else if !os.IsNotExist(err) {
|
|
return "", err
|
|
}
|
|
prevDir = curDir
|
|
curDir = filepath.Dir(curDir)
|
|
}
|
|
return "", fmt.Errorf("not a git repository (or any of the parent directories): .git")
|
|
}
|
|
|
|
func mainInternal() error {
|
|
projectRoot, err := findProjectRoot()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
envText, err := os.ReadFile(filepath.Join(projectRoot, "env.yaml"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var env interface{}
|
|
if err := yaml.Unmarshal(envText, &env); err != nil {
|
|
return err
|
|
}
|
|
if err := filepath.WalkDir(projectRoot, func(path string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if d.Name() == ".git" {
|
|
return fs.SkipDir
|
|
}
|
|
dir := filepath.Dir(path)
|
|
if strings.Contains(d.Name(), ".in.") {
|
|
fmt.Fprintf(os.Stderr, "template_secrets.go: processing %s\n", path)
|
|
input, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
tmpl, err := template.New("").Funcs(sprig.TxtFuncMap()).Option("missingkey=error").Parse(string(input))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var output bytes.Buffer
|
|
if err := tmpl.Execute(&output, env); err != nil {
|
|
return err
|
|
}
|
|
if err := os.WriteFile(
|
|
filepath.Join(dir, strings.ReplaceAll(d.Name(), ".in.", ".out.")),
|
|
output.Bytes(), 0644,
|
|
); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func main() {
|
|
if err := mainInternal(); err != nil {
|
|
fmt.Fprintf(os.Stderr, "template.go: %s\n", err.Error())
|
|
os.Exit(1)
|
|
}
|
|
}
|