Skip to content

Commit 9da9c2f

Browse files
authored
fix: truncate template files while pulling (coder#16474)
Fixes: coder#16414
1 parent 5fbedc7 commit 9da9c2f

File tree

2 files changed

+66
-14
lines changed

2 files changed

+66
-14
lines changed

provisionersdk/archive.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func Untar(directory string, r io.Reader) error {
175175
if err != nil {
176176
return err
177177
}
178-
file, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
178+
file, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR|os.O_TRUNC, os.FileMode(header.Mode))
179179
if err != nil {
180180
return err
181181
}

provisionersdk/archive_test.go

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,70 @@ func TestTar(t *testing.T) {
184184

185185
func TestUntar(t *testing.T) {
186186
t.Parallel()
187-
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
188187

189-
dir := t.TempDir()
190-
file, err := os.CreateTemp(dir, "*.tf")
191-
require.NoError(t, err)
192-
_ = file.Close()
193-
archive := new(bytes.Buffer)
194-
err = provisionersdk.Tar(archive, log, dir, 1024)
195-
require.NoError(t, err)
196-
dir = t.TempDir()
197-
err = provisionersdk.Untar(dir, archive)
198-
require.NoError(t, err)
199-
_, err = os.Stat(filepath.Join(dir, filepath.Base(file.Name())))
200-
require.NoError(t, err)
188+
t.Run("Basic", func(t *testing.T) {
189+
t.Parallel()
190+
191+
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
192+
193+
dir := t.TempDir()
194+
file, err := os.CreateTemp(dir, "*.tf")
195+
require.NoError(t, err)
196+
_ = file.Close()
197+
198+
archive := new(bytes.Buffer)
199+
err = provisionersdk.Tar(archive, log, dir, 1024)
200+
require.NoError(t, err)
201+
202+
dir = t.TempDir()
203+
err = provisionersdk.Untar(dir, archive)
204+
require.NoError(t, err)
205+
206+
_, err = os.Stat(filepath.Join(dir, filepath.Base(file.Name())))
207+
require.NoError(t, err)
208+
})
209+
210+
t.Run("Overwrite", func(t *testing.T) {
211+
t.Parallel()
212+
213+
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
214+
215+
dir1 := t.TempDir()
216+
dir2 := t.TempDir()
217+
218+
// 1. Create directory with .tf file.
219+
file, err := os.CreateTemp(dir1, "*.tf")
220+
require.NoError(t, err)
221+
_ = file.Close()
222+
223+
err = os.WriteFile(file.Name(), []byte("# ab"), 0o600)
224+
require.NoError(t, err)
225+
226+
archive := new(bytes.Buffer)
227+
228+
// 2. Build tar archive.
229+
err = provisionersdk.Tar(archive, log, dir1, 4096)
230+
require.NoError(t, err)
231+
232+
// 3. Untar to the second location.
233+
err = provisionersdk.Untar(dir2, archive)
234+
require.NoError(t, err)
235+
236+
// 4. Modify the .tf file
237+
err = os.WriteFile(file.Name(), []byte("# c"), 0o600)
238+
require.NoError(t, err)
239+
240+
// 5. Build tar archive with modified .tf file
241+
err = provisionersdk.Tar(archive, log, dir1, 4096)
242+
require.NoError(t, err)
243+
244+
// 6. Untar to a second location.
245+
err = provisionersdk.Untar(dir2, archive)
246+
require.NoError(t, err)
247+
248+
// Verify if the file has been fully overwritten
249+
content, err := os.ReadFile(filepath.Join(dir2, filepath.Base(file.Name())))
250+
require.NoError(t, err)
251+
require.Equal(t, "# c", string(content))
252+
})
201253
}

0 commit comments

Comments
 (0)