summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--file/file.go4
-rw-r--r--internal/config/configfile.go5
-rw-r--r--internal/config/configfile_test.go7
-rw-r--r--internal/iohelpers/filemode.go (renamed from internal/config/filemode.go)2
-rw-r--r--internal/iohelpers/filemode_test.go (renamed from internal/config/filemode_test.go)2
-rw-r--r--internal/iohelpers/skipsame_flow.md17
-rw-r--r--internal/iohelpers/template_process_flow.md51
-rw-r--r--internal/tests/integration/basic_test.go11
-rw-r--r--internal/tests/integration/inputdir_test.go12
-rw-r--r--template.go2
-rw-r--r--template_test.go25
-rw-r--r--vault/auth.go4
12 files changed, 106 insertions, 36 deletions
diff --git a/file/file.go b/file/file.go
index e30e3c68..65b48c8b 100644
--- a/file/file.go
+++ b/file/file.go
@@ -7,7 +7,7 @@ import (
"path/filepath"
"strings"
- "github.com/hairyhenderson/gomplate/v3/internal/config"
+ "github.com/hairyhenderson/gomplate/v3/internal/iohelpers"
"github.com/pkg/errors"
"github.com/spf13/afero"
@@ -60,7 +60,7 @@ func Write(filename string, content []byte) error {
if err != nil && !os.IsNotExist(err) {
return errors.Wrapf(err, "failed to stat %s", filename)
}
- mode := config.NormalizeFileMode(0o644)
+ mode := iohelpers.NormalizeFileMode(0o644)
if fi != nil {
mode = fi.Mode()
}
diff --git a/internal/config/configfile.go b/internal/config/configfile.go
index 351dec7b..ac6b61b9 100644
--- a/internal/config/configfile.go
+++ b/internal/config/configfile.go
@@ -14,6 +14,7 @@ import (
"strings"
"time"
+ "github.com/hairyhenderson/gomplate/v3/internal/iohelpers"
"github.com/pkg/errors"
"gopkg.in/yaml.v3"
)
@@ -477,9 +478,9 @@ func (c *Config) GetMode() (os.FileMode, bool, error) {
if err != nil {
return 0, false, err
}
- mode := NormalizeFileMode(os.FileMode(m))
+ mode := iohelpers.NormalizeFileMode(os.FileMode(m))
if mode == 0 && c.Input != "" {
- mode = NormalizeFileMode(0644)
+ mode = iohelpers.NormalizeFileMode(0644)
}
return mode, modeOverride, nil
}
diff --git a/internal/config/configfile_test.go b/internal/config/configfile_test.go
index 4b7b95d2..2c65467a 100644
--- a/internal/config/configfile_test.go
+++ b/internal/config/configfile_test.go
@@ -12,6 +12,7 @@ import (
"testing"
"time"
+ "github.com/hairyhenderson/gomplate/v3/internal/iohelpers"
"github.com/stretchr/testify/assert"
)
@@ -541,19 +542,19 @@ func TestGetMode(t *testing.T) {
c := &Config{}
m, o, err := c.GetMode()
assert.NoError(t, err)
- assert.Equal(t, NormalizeFileMode(0), m)
+ assert.Equal(t, iohelpers.NormalizeFileMode(0), m)
assert.False(t, o)
c = &Config{OutMode: "755"}
m, o, err = c.GetMode()
assert.NoError(t, err)
- assert.Equal(t, NormalizeFileMode(0o755), m)
+ assert.Equal(t, iohelpers.NormalizeFileMode(0o755), m)
assert.True(t, o)
c = &Config{OutMode: "0755"}
m, o, err = c.GetMode()
assert.NoError(t, err)
- assert.Equal(t, NormalizeFileMode(0o755), m)
+ assert.Equal(t, iohelpers.NormalizeFileMode(0o755), m)
assert.True(t, o)
c = &Config{OutMode: "foo"}
diff --git a/internal/config/filemode.go b/internal/iohelpers/filemode.go
index aa6887b7..35a3c142 100644
--- a/internal/config/filemode.go
+++ b/internal/iohelpers/filemode.go
@@ -1,4 +1,4 @@
-package config
+package iohelpers
import (
"os"
diff --git a/internal/config/filemode_test.go b/internal/iohelpers/filemode_test.go
index 01378ce8..2ebb0ed7 100644
--- a/internal/config/filemode_test.go
+++ b/internal/iohelpers/filemode_test.go
@@ -1,4 +1,4 @@
-package config
+package iohelpers
import (
"fmt"
diff --git a/internal/iohelpers/skipsame_flow.md b/internal/iohelpers/skipsame_flow.md
new file mode 100644
index 00000000..53a1fdf9
--- /dev/null
+++ b/internal/iohelpers/skipsame_flow.md
@@ -0,0 +1,17 @@
+```mermaid
+graph TD
+ A[write] --> B{diff ==}
+ B -->|true| C{File open yet?}
+ B -->|false| BB
+ DF[Write to file]
+
+ C -->|true| DF
+ C -->|false| E[Open File]
+ E --> F[Flush buffer to file]
+ F --> DF
+
+ BB[Read Output] --> BC{bytes differ?}
+ BC -->|true| BD[diff = true]
+ BD -->|false| DB[Write to Buffer]
+ BD --> C
+```
diff --git a/internal/iohelpers/template_process_flow.md b/internal/iohelpers/template_process_flow.md
new file mode 100644
index 00000000..51c567c1
--- /dev/null
+++ b/internal/iohelpers/template_process_flow.md
@@ -0,0 +1,51 @@
+
+1. "gather templates" - gather and prepare inputs and outputs for rendering
+ -
+
+
+
+```mermaid
+flowchart TB
+ S([Begin]) --> A
+ A[[gather templates]] --> B
+ B{input type?} -->|dir| BA
+ B -->|files| BB
+ B -->|string| BC
+
+ D([End])
+
+ C[[process templates]] --> CA
+ CA([start iterating templates]) --> CAA
+
+ CAA{next template?} -->|yes| CAB
+ CAA -->|no| CAD
+
+ CAD([done iterating templates]) --> D
+
+ CAB[[load template contents]] --> CABA
+ CABA[open/read input] --> CAC
+
+ CAC[[add target]] --> CACA
+ CACA[create/open output file] --> CAA
+
+ BA[[walk dir]] --> BAA
+ BAA[find all matching files in dir] --> BAB
+ BAB([start iterating files]) --> BABA
+ BABA{next file?} -->|yes| BABAA
+ BABA -->|no| BAC
+ BAC([done iterating files]) --> C
+
+ BABAA[name file] --> BABAB
+ BABAB[determine mode] --> BABAC
+ BABAC[ensure parent dirs exist] --> BABAD
+ BABAD[create template] --> BABA
+
+ BB([start iterating files]) --> BBA
+ BBA{next file?} -->|yes| BBAA
+ BBA -->|no| BBD
+ BBD([done iterating files]) --> C
+
+ BBAA[create template from file] --> BBA
+
+ BC[create template] --> C
+```
diff --git a/internal/tests/integration/basic_test.go b/internal/tests/integration/basic_test.go
index d1d4becb..e7cb7364 100644
--- a/internal/tests/integration/basic_test.go
+++ b/internal/tests/integration/basic_test.go
@@ -5,8 +5,7 @@ import (
"os"
"testing"
- "github.com/hairyhenderson/gomplate/v3/internal/config"
-
+ "github.com/hairyhenderson/gomplate/v3/internal/iohelpers"
"gotest.tools/v3/assert"
"gotest.tools/v3/assert/cmp"
"gotest.tools/v3/fs"
@@ -83,7 +82,7 @@ func TestBasic_RoutesInputsToProperOutputs(t *testing.T) {
for _, v := range testdata {
info, err := os.Stat(v.path)
assert.NilError(t, err)
- m := config.NormalizeFileMode(v.mode)
+ m := iohelpers.NormalizeFileMode(v.mode)
assert.Equal(t, m, info.Mode(), v.path)
content, err := ioutil.ReadFile(v.path)
assert.NilError(t, err)
@@ -204,7 +203,7 @@ func TestBasic_RoutesInputsToProperOutputsWithChmod(t *testing.T) {
for _, v := range testdata {
info, err := os.Stat(v.path)
assert.NilError(t, err)
- assert.Equal(t, config.NormalizeFileMode(v.mode), info.Mode())
+ assert.Equal(t, iohelpers.NormalizeFileMode(v.mode), info.Mode())
content, err := ioutil.ReadFile(v.path)
assert.NilError(t, err)
assert.Equal(t, v.content, string(content))
@@ -232,7 +231,7 @@ func TestBasic_OverridesOutputModeWithChmod(t *testing.T) {
for _, v := range testdata {
info, err := os.Stat(v.path)
assert.NilError(t, err)
- assert.Equal(t, config.NormalizeFileMode(v.mode), info.Mode())
+ assert.Equal(t, iohelpers.NormalizeFileMode(v.mode), info.Mode())
content, err := ioutil.ReadFile(v.path)
assert.NilError(t, err)
assert.Equal(t, v.content, string(content))
@@ -252,7 +251,7 @@ func TestBasic_AppliesChmodBeforeWrite(t *testing.T) {
info, err := os.Stat(out)
assert.NilError(t, err)
- assert.Equal(t, config.NormalizeFileMode(0644), info.Mode())
+ assert.Equal(t, iohelpers.NormalizeFileMode(0644), info.Mode())
content, err := ioutil.ReadFile(out)
assert.NilError(t, err)
assert.Equal(t, "hi\n", string(content))
diff --git a/internal/tests/integration/inputdir_test.go b/internal/tests/integration/inputdir_test.go
index 894c2b5d..dc0e7975 100644
--- a/internal/tests/integration/inputdir_test.go
+++ b/internal/tests/integration/inputdir_test.go
@@ -5,7 +5,7 @@ import (
"os"
"testing"
- "github.com/hairyhenderson/gomplate/v3/internal/config"
+ "github.com/hairyhenderson/gomplate/v3/internal/iohelpers"
tassert "github.com/stretchr/testify/assert"
"gotest.tools/v3/assert"
"gotest.tools/v3/fs"
@@ -68,7 +68,7 @@ func TestInputDir_InputDir(t *testing.T) {
for _, v := range testdata {
info, err := os.Stat(v.path)
assert.NilError(t, err)
- m := config.NormalizeFileMode(v.mode)
+ m := iohelpers.NormalizeFileMode(v.mode)
assert.Equal(t, m, info.Mode(), v.path)
content, err := ioutil.ReadFile(v.path)
assert.NilError(t, err)
@@ -107,7 +107,7 @@ func TestInputDir_InputDirWithModeOverride(t *testing.T) {
for _, v := range testdata {
info, err := os.Stat(v.path)
assert.NilError(t, err)
- m := config.NormalizeFileMode(v.mode)
+ m := iohelpers.NormalizeFileMode(v.mode)
assert.Equal(t, m, info.Mode(), v.path)
content, err := ioutil.ReadFile(v.path)
assert.NilError(t, err)
@@ -145,7 +145,7 @@ func TestInputDir_OutputMapInline(t *testing.T) {
for _, v := range testdata {
info, err := os.Stat(v.path)
assert.NilError(t, err)
- m := config.NormalizeFileMode(v.mode)
+ m := iohelpers.NormalizeFileMode(v.mode)
assert.Equal(t, m, info.Mode(), v.path)
content, err := ioutil.ReadFile(v.path)
assert.NilError(t, err)
@@ -185,7 +185,7 @@ func TestInputDir_OutputMapExternal(t *testing.T) {
for _, v := range testdata {
info, err := os.Stat(v.path)
assert.NilError(t, err)
- m := config.NormalizeFileMode(v.mode)
+ m := iohelpers.NormalizeFileMode(v.mode)
assert.Equal(t, m, info.Mode(), v.path)
content, err := ioutil.ReadFile(v.path)
assert.NilError(t, err)
@@ -259,7 +259,7 @@ func TestInputDir_InputDirCwd(t *testing.T) {
for _, v := range testdata {
info, err := os.Stat(v.path)
assert.NilError(t, err)
- m := config.NormalizeFileMode(v.mode)
+ m := iohelpers.NormalizeFileMode(v.mode)
assert.Equal(t, m, info.Mode(), v.path)
content, err := ioutil.ReadFile(v.path)
assert.NilError(t, err)
diff --git a/template.go b/template.go
index 1eb93380..6e5dfb5c 100644
--- a/template.go
+++ b/template.go
@@ -259,7 +259,7 @@ func openOutFile(cfg *config.Config, filename string, mode os.FileMode, modeOver
}
func createOutFile(filename string, mode os.FileMode, modeOverride bool) (out io.WriteCloser, err error) {
- mode = config.NormalizeFileMode(mode.Perm())
+ mode = iohelpers.NormalizeFileMode(mode.Perm())
if modeOverride {
err = fs.Chmod(filename, mode)
if err != nil && !os.IsNotExist(err) {
diff --git a/template_test.go b/template_test.go
index 505d2f73..10b2f8b9 100644
--- a/template_test.go
+++ b/template_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/hairyhenderson/gomplate/v3/internal/config"
+ "github.com/hairyhenderson/gomplate/v3/internal/iohelpers"
"github.com/spf13/afero"
"github.com/stretchr/testify/assert"
@@ -31,7 +32,7 @@ func TestOpenOutFile(t *testing.T) {
i, err := fs.Stat("/tmp/foo")
assert.NoError(t, err)
- assert.Equal(t, config.NormalizeFileMode(0644), i.Mode())
+ assert.Equal(t, iohelpers.NormalizeFileMode(0644), i.Mode())
cfg.Stdout = &bytes.Buffer{}
@@ -90,7 +91,7 @@ func TestGatherTemplates(t *testing.T) {
assert.NoError(t, err)
assert.Len(t, templates, 1)
assert.Equal(t, "out", templates[0].targetPath)
- assert.Equal(t, config.NormalizeFileMode(0644), templates[0].mode)
+ assert.Equal(t, iohelpers.NormalizeFileMode(0644), templates[0].mode)
// out file is created only on demand
_, err = fs.Stat("out")
@@ -102,7 +103,7 @@ func TestGatherTemplates(t *testing.T) {
info, err := fs.Stat("out")
require.NoError(t, err)
- assert.Equal(t, config.NormalizeFileMode(0644), info.Mode())
+ assert.Equal(t, iohelpers.NormalizeFileMode(0644), info.Mode())
fs.Remove("out")
cfg = &config.Config{
@@ -122,7 +123,7 @@ func TestGatherTemplates(t *testing.T) {
info, err = fs.Stat("out")
assert.NoError(t, err)
- assert.Equal(t, config.NormalizeFileMode(0600), info.Mode())
+ assert.Equal(t, iohelpers.NormalizeFileMode(0600), info.Mode())
fs.Remove("out")
cfg = &config.Config{
@@ -136,14 +137,14 @@ func TestGatherTemplates(t *testing.T) {
assert.Len(t, templates, 1)
assert.Equal(t, "bar", templates[0].contents)
assert.NotEqual(t, cfg.Stdout, templates[0].target)
- assert.Equal(t, config.NormalizeFileMode(0755), templates[0].mode)
+ assert.Equal(t, iohelpers.NormalizeFileMode(0755), templates[0].mode)
_, err = templates[0].target.Write([]byte("hello world"))
assert.NoError(t, err)
info, err = fs.Stat("out")
assert.NoError(t, err)
- assert.Equal(t, config.NormalizeFileMode(0755), info.Mode())
+ assert.Equal(t, iohelpers.NormalizeFileMode(0755), info.Mode())
fs.Remove("out")
templates, err = gatherTemplates(&config.Config{
@@ -160,13 +161,13 @@ func TestProcessTemplates(t *testing.T) {
origfs := fs
defer func() { fs = origfs }()
fs = afero.NewMemMapFs()
- afero.WriteFile(fs, "foo", []byte("bar"), config.NormalizeFileMode(0600))
+ afero.WriteFile(fs, "foo", []byte("bar"), iohelpers.NormalizeFileMode(0600))
- afero.WriteFile(fs, "in/1", []byte("foo"), config.NormalizeFileMode(0644))
- afero.WriteFile(fs, "in/2", []byte("bar"), config.NormalizeFileMode(0640))
- afero.WriteFile(fs, "in/3", []byte("baz"), config.NormalizeFileMode(0644))
+ afero.WriteFile(fs, "in/1", []byte("foo"), iohelpers.NormalizeFileMode(0644))
+ afero.WriteFile(fs, "in/2", []byte("bar"), iohelpers.NormalizeFileMode(0640))
+ afero.WriteFile(fs, "in/3", []byte("baz"), iohelpers.NormalizeFileMode(0644))
- afero.WriteFile(fs, "existing", []byte(""), config.NormalizeFileMode(0644))
+ afero.WriteFile(fs, "existing", []byte(""), iohelpers.NormalizeFileMode(0644))
cfg := &config.Config{
Stdout: &bytes.Buffer{},
@@ -246,7 +247,7 @@ func TestProcessTemplates(t *testing.T) {
info, err := fs.Stat(current.targetPath)
assert.NoError(t, err)
- assert.Equal(t, config.NormalizeFileMode(in.modes[i]), info.Mode())
+ assert.Equal(t, iohelpers.NormalizeFileMode(in.modes[i]), info.Mode())
}
}
fs.Remove("out")
diff --git a/vault/auth.go b/vault/auth.go
index 83b31ce8..0014664f 100644
--- a/vault/auth.go
+++ b/vault/auth.go
@@ -11,7 +11,7 @@ import (
"github.com/hairyhenderson/gomplate/v3/aws"
"github.com/hairyhenderson/gomplate/v3/conv"
"github.com/hairyhenderson/gomplate/v3/env"
- "github.com/hairyhenderson/gomplate/v3/internal/config"
+ "github.com/hairyhenderson/gomplate/v3/internal/iohelpers"
"github.com/pkg/errors"
)
@@ -170,7 +170,7 @@ func (v *Vault) EC2Login() (string, error) {
if val, ok := secret.Auth.Metadata["nonce"]; ok {
nonce = val
}
- f, err := os.OpenFile(output, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, config.NormalizeFileMode(0o600))
+ f, err := os.OpenFile(output, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, iohelpers.NormalizeFileMode(0o600))
if err != nil {
return "", errors.Wrapf(err, "Error opening nonce output file")
}