fix: truncate template files while pulling (#16474)

Fixes: https://github.com/coder/coder/issues/16414
This commit is contained in:
Marcin Tojek
2025-02-06 12:40:47 +00:00
committed by GitHub
parent 5fbedc74f3
commit 9da9c2fc92
2 changed files with 66 additions and 14 deletions
+1 -1
View File
@@ -175,7 +175,7 @@ func Untar(directory string, r io.Reader) error {
if err != nil {
return err
}
file, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
file, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR|os.O_TRUNC, os.FileMode(header.Mode))
if err != nil {
return err
}
+65 -13
View File
@@ -184,18 +184,70 @@ func TestTar(t *testing.T) {
func TestUntar(t *testing.T) {
t.Parallel()
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
dir := t.TempDir()
file, err := os.CreateTemp(dir, "*.tf")
require.NoError(t, err)
_ = file.Close()
archive := new(bytes.Buffer)
err = provisionersdk.Tar(archive, log, dir, 1024)
require.NoError(t, err)
dir = t.TempDir()
err = provisionersdk.Untar(dir, archive)
require.NoError(t, err)
_, err = os.Stat(filepath.Join(dir, filepath.Base(file.Name())))
require.NoError(t, err)
t.Run("Basic", func(t *testing.T) {
t.Parallel()
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
dir := t.TempDir()
file, err := os.CreateTemp(dir, "*.tf")
require.NoError(t, err)
_ = file.Close()
archive := new(bytes.Buffer)
err = provisionersdk.Tar(archive, log, dir, 1024)
require.NoError(t, err)
dir = t.TempDir()
err = provisionersdk.Untar(dir, archive)
require.NoError(t, err)
_, err = os.Stat(filepath.Join(dir, filepath.Base(file.Name())))
require.NoError(t, err)
})
t.Run("Overwrite", func(t *testing.T) {
t.Parallel()
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
dir1 := t.TempDir()
dir2 := t.TempDir()
// 1. Create directory with .tf file.
file, err := os.CreateTemp(dir1, "*.tf")
require.NoError(t, err)
_ = file.Close()
err = os.WriteFile(file.Name(), []byte("# ab"), 0o600)
require.NoError(t, err)
archive := new(bytes.Buffer)
// 2. Build tar archive.
err = provisionersdk.Tar(archive, log, dir1, 4096)
require.NoError(t, err)
// 3. Untar to the second location.
err = provisionersdk.Untar(dir2, archive)
require.NoError(t, err)
// 4. Modify the .tf file
err = os.WriteFile(file.Name(), []byte("# c"), 0o600)
require.NoError(t, err)
// 5. Build tar archive with modified .tf file
err = provisionersdk.Tar(archive, log, dir1, 4096)
require.NoError(t, err)
// 6. Untar to a second location.
err = provisionersdk.Untar(dir2, archive)
require.NoError(t, err)
// Verify if the file has been fully overwritten
content, err := os.ReadFile(filepath.Join(dir2, filepath.Base(file.Name())))
require.NoError(t, err)
require.Equal(t, "# c", string(content))
})
}