aboutsummaryrefslogtreecommitdiff
path: root/apply.go
diff options
context:
space:
mode:
Diffstat (limited to 'apply.go')
-rw-r--r--apply.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/apply.go b/apply.go
new file mode 100644
index 0000000..7ea5bf9
--- /dev/null
+++ b/apply.go
@@ -0,0 +1,77 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "text/template"
+)
+
+func apply(args []string) error {
+ if len(args) != 0 {
+ return applyFiles(args)
+ }
+ names, err := getFileNames()
+ if err != nil {
+ return err
+ }
+ return applyFiles(names)
+}
+
+func applyFiles(names []string) error {
+ for _, name := range names {
+ fmt.Printf("applying %s\n", name)
+ if err := applyFile(name); err != nil {
+ return fmt.Errorf("could not apply %s: %v", name, err)
+ }
+ }
+ return nil
+}
+
+func applyFile(name string) error {
+ src := filepath.Join(base, "templates", name)
+ t, err := template.New(filepath.Base(name)).Funcs(buildFuncMap()).ParseFiles(src)
+ if err != nil {
+ return fmt.Errorf("could not build template: %v", err)
+ }
+ data, err := getTemplateData()
+ if err != nil {
+ return err
+ }
+ d := filepath.Join(dest, name)
+ if err = os.MkdirAll(filepath.Dir(d), 0700); err != nil {
+ return err
+ }
+ out, err := os.OpenFile(d, os.O_CREATE|os.O_WRONLY, 0600)
+ if err != nil {
+ return err
+ }
+ defer out.Close()
+ if err = t.Execute(out, data); err != nil {
+ return fmt.Errorf("could not execute template: %v", err)
+ }
+ return nil
+}
+
+func getFileNames() ([]string, error) {
+ var names []string
+ d := filepath.Join(base, "templates")
+ err := filepath.Walk(d, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if info.IsDir() {
+ return nil
+ }
+ name, err := filepath.Rel(d, path)
+ if err != nil {
+ return err
+ }
+ names = append(names, name)
+ return nil
+ })
+ if err != nil {
+ return nil, err
+ }
+ return names, nil
+}