Skip to content

Commit

Permalink
0.0.1: #1
Browse files Browse the repository at this point in the history
  • Loading branch information
anarcher committed Aug 11, 2015
1 parent 72f89b9 commit f56b4c0
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 25 deletions.
102 changes: 77 additions & 25 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package main

import (
"fmt"
"github.com/namsral/flag"
"log"
"os"
"path/filepath"
"strings"
"text/template"
)
Expand All @@ -13,45 +15,47 @@ const (
)

var (
env map[string]string = make(map[string]string)
confPaths []string
templateFuncMap template.FuncMap
)

func init() {
flag.Parse()

if len(flag.Args()) >= 0 {
for _, path := range flag.Args() {
confPaths = append(confPaths, path)
}
flag.Usage = func() {
fmt.Printf("Usage: envconv [options] file [files...]\n\n")
flag.PrintDefaults()
}

for _, pair := range os.Environ() {
item := strings.SplitN(pair, "=", 2)
if len(item) < 2 {
log.Fatalf("invalid item from os.Environ %s", pair)
}
env[item[0]] = item[1]
}
version := flag.Bool("v", false, "Prints current version")

if val, ok := env[CONF_FILES]; ok {
paths := strings.Split(val, ":")
for _, path := range paths {
confPaths = append(confPaths, path)
}
flag.Parse()

if *version {
fmt.Println("envconf version " + VERSION)
os.Exit(0)
}

templateFuncMap = template.FuncMap{
"default": func(args ...string) string {
defer recovery()
return args[0]
},
"in": func(arg string, slice []string) bool {
defer recovery()
for _, i := range slice {
if arg == i {
return true
}
}
return false
},
}
}

func main() {
for _, path := range confPaths {
err := transformFile(path)
paths := confFilePaths()
env := environ()
for _, path := range paths {
err := transformFile(path, env)
if err != nil {
log.Printf("Err: %s,%s", path, err)
} else {
Expand All @@ -60,15 +64,57 @@ func main() {
}
}

func transformFile(path string) error {
t, err := template.ParseFiles(path)
func environ() map[string]interface{} {
env := make(map[string]interface{})
for _, pair := range os.Environ() {
item := strings.SplitN(pair, "=", 2)
if len(item) < 2 {
log.Fatalf("invalid item from os.Environ %s", pair)
}
if strings.Contains(item[1], ",") {
val := strings.Split(item[1], ",")
env[item[0]] = val
} else {
env[item[0]] = item[1]
}
}
return env
}

func confFilePaths() []string {
var paths []string

if len(flag.Args()) >= 0 {
for _, path := range flag.Args() {
paths = append(paths, path)
}
}

if val := os.Getenv(CONF_FILES); val != "" {
for _, path := range strings.Split(val, ":") {
paths = append(paths, path)
}
}
return paths
}

func transformFile(path string, env map[string]interface{}) error {
tname := filepath.Base(path)
t := template.New(tname).Funcs(templateFuncMap)
t, err := t.ParseFiles(path)
if err != nil {
log.Printf("Err: Parsing file %s %s", path, err)
return err
}
t = t.Funcs(templateFuncMap)

file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
var fileMode os.FileMode = 0644 //default
if fi, err := os.Stat(path); err == nil {
fileMode = fi.Mode()
} else {
log.Printf("Err: %s", err)
}

file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, fileMode)
if err != nil {
log.Printf("Err: Can't open a file %s %s", path, err)
return err
Expand All @@ -85,3 +131,9 @@ func transformFile(path string) error {

return nil
}

func recovery() {
if r := recover(); r != nil {
log.Println("Panic in", r)
}
}
5 changes: 5 additions & 0 deletions version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package main

const (
VERSION = "0.0.1"
)

0 comments on commit f56b4c0

Please sign in to comment.