diff --git a/pkg/template/template.go b/pkg/template/template.go index 4183079..9d7a50b 100644 --- a/pkg/template/template.go +++ b/pkg/template/template.go @@ -1,13 +1,18 @@ package template import ( + "bytes" "encoding/json" "fmt" + "io" "io/ioutil" "os" "path/filepath" "regexp" "text/template" + "unicode/utf8" + + "github.com/Masterminds/sprig" "github.com/Masterminds/sprig" "github.com/ryanuber/go-glob" @@ -193,6 +198,27 @@ func (t *dirTemplate) Execute(dirPrefix string) error { } defer f.Close() + // Open original file and check if a binary file + origF, err := os.Open(filename) + if err != nil { + return err + } + defer origF.Close() + + isBin, err := isBinary(origF) + if err != nil { + return err + } + if isBin { + _, err = origF.Seek(io.SeekStart, 0) + if err != nil { + return err + } + + _, err = io.Copy(f, origF) + return err + } + defer func(fname string) { contents, err := ioutil.ReadFile(fname) if err != nil { @@ -228,6 +254,16 @@ func (t *dirTemplate) Execute(dirPrefix string) error { }) } +func isBinary(r io.Reader) (bool, error) { + buf := make([]byte, 1024) + n, err := r.Read(buf) + if err != nil && err != io.EOF { + return false, err + } + + return !utf8.Valid(buf[:n]) || bytes.ContainsAny(buf[:n], "\x00"), nil +} + func ignoreCopyFile(filename string) bool { for _, pattern := range boilr.Configuration.IgnoreCopyFiles { if glob.Glob(pattern, filename) {