diff options
| -rw-r--r-- | file/file.go | 4 | ||||
| -rw-r--r-- | internal/config/configfile.go | 5 | ||||
| -rw-r--r-- | internal/config/configfile_test.go | 7 | ||||
| -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.md | 17 | ||||
| -rw-r--r-- | internal/iohelpers/template_process_flow.md | 51 | ||||
| -rw-r--r-- | internal/tests/integration/basic_test.go | 11 | ||||
| -rw-r--r-- | internal/tests/integration/inputdir_test.go | 12 | ||||
| -rw-r--r-- | template.go | 2 | ||||
| -rw-r--r-- | template_test.go | 25 | ||||
| -rw-r--r-- | vault/auth.go | 4 |
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") } |
