From 13c6ad18747753d691aab5b38357bbab66dcea97 Mon Sep 17 00:00:00 2001 From: Dave Henderson Date: Wed, 13 May 2020 22:32:38 -0400 Subject: Apply --chmod before opening output file Signed-off-by: Dave Henderson --- internal/tests/integration/basic_nonwindows_test.go | 18 ++++++++++++++++++ internal/tests/integration/basic_test.go | 3 ++- template.go | 9 ++++++--- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/internal/tests/integration/basic_nonwindows_test.go b/internal/tests/integration/basic_nonwindows_test.go index 49fd1ab1..e00636e7 100644 --- a/internal/tests/integration/basic_nonwindows_test.go +++ b/internal/tests/integration/basic_nonwindows_test.go @@ -71,3 +71,21 @@ func (s *BasicSuite) TestOverridesOutputModeWithChmod(c *C) { assert.Equal(c, v.content, string(content)) } } + +func (s *BasicSuite) TestAppliesChmodBeforeWrite(c *C) { + // 'broken' was created with mode 0000 + out := s.tmpDir.Join("broken") + result := icmd.RunCmd(icmd.Command(GomplateBin, + "-f", s.tmpDir.Join("one"), + "-o", out, + "--chmod", "0644"), func(cmd *icmd.Cmd) { + }) + result.Assert(c, icmd.Success) + + info, err := os.Stat(out) + assert.NilError(c, err) + assert.Equal(c, os.FileMode(0644), info.Mode()) + content, err := ioutil.ReadFile(out) + assert.NilError(c, err) + assert.Equal(c, "hi\n", string(content)) +} diff --git a/internal/tests/integration/basic_test.go b/internal/tests/integration/basic_test.go index 2c4005e1..8c8ee48c 100644 --- a/internal/tests/integration/basic_test.go +++ b/internal/tests/integration/basic_test.go @@ -25,7 +25,8 @@ var _ = Suite(&BasicSuite{}) func (s *BasicSuite) SetUpTest(c *C) { s.tmpDir = fs.NewDir(c, "gomplate-inttests", fs.WithFile("one", "hi\n", fs.WithMode(0640)), - fs.WithFile("two", "hello\n")) + fs.WithFile("two", "hello\n"), + fs.WithFile("broken", "", fs.WithMode(0000))) } func (s *BasicSuite) TearDownTest(c *C) { diff --git a/template.go b/template.go index 37e0c721..3559b5ca 100644 --- a/template.go +++ b/template.go @@ -243,13 +243,16 @@ 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) { + if modeOverride { + err = fs.Chmod(filename, mode.Perm()) + if err != nil && !os.IsNotExist(err) { + return nil, fmt.Errorf("failed to chmod output file '%s' with mode %q: %w", filename, mode.Perm(), err) + } + } out, err = fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode.Perm()) if err != nil { return out, err } - if modeOverride { - err = fs.Chmod(filename, mode.Perm()) - } return out, err } -- cgit v1.2.3