From 6ba04b555a3d9ba53c29213bdd43f9f3ebda0953 Mon Sep 17 00:00:00 2001 From: Mateusz Gozdek Date: Wed, 26 Feb 2020 14:50:56 +0100 Subject: [PATCH] pkg/util/walkers: truncate file when writing To avoid leaving old content untouched when updating files, which may happen if new content is smaller than the old one. Closes #40 Signed-off-by: Mateusz Gozdek --- pkg/util/walkers/copying.go | 2 +- pkg/util/walkers/copying_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pkg/util/walkers/copying.go b/pkg/util/walkers/copying.go index f84583980..626abd2a8 100644 --- a/pkg/util/walkers/copying.go +++ b/pkg/util/walkers/copying.go @@ -45,7 +45,7 @@ func CopyingWalker(path string, newDirPerms os.FileMode) assets.WalkFunc { // this is the only content stored in the file. func writeFile(p string, r io.Reader) error { // TODO: If we start packing binaries, make sure they have executable bit set. - f, err := os.OpenFile(p, os.O_RDWR|os.O_CREATE, 0644) + f, err := os.OpenFile(p, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { return fmt.Errorf("failed to open target file %s: %v", p, err) } diff --git a/pkg/util/walkers/copying_test.go b/pkg/util/walkers/copying_test.go index 721dee70c..23c705e9b 100644 --- a/pkg/util/walkers/copying_test.go +++ b/pkg/util/walkers/copying_test.go @@ -34,3 +34,29 @@ func TestWriteFile(t *testing.T) { t.Fatalf("expected: '%s', got '%s'", testData, string(d)) } } + +func TestWriteFileTruncate(t *testing.T) { + f, err := ioutil.TempFile("", tmpPattern) + if err != nil { + t.Fatalf("Creating temp file should succeed, got: %v", err) + } + + defer os.Remove(f.Name()) + + if err := writeFile(f.Name(), strings.NewReader("111111")); err != nil { + t.Fatalf("Writing to file should succeed, got: %v", err) + } + + if err := writeFile(f.Name(), strings.NewReader(testData)); err != nil { + t.Fatalf("Updating file should succeed, got: %v", err) + } + + d, err := ioutil.ReadFile(f.Name()) + if err != nil { + t.Fatalf("Reading tmp file should succeed, got: %v", err) + } + + if !reflect.DeepEqual(testData, string(d)) { + t.Fatalf("expected: '%s', got '%s'", testData, string(d)) + } +}