summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/tests/integration/basic_nonwindows_test.go18
-rw-r--r--internal/tests/integration/basic_test.go3
-rw-r--r--template.go9
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
}