diff --git a/provisionersdk/archive.go b/provisionersdk/archive.go index 3cacc2915398f..ec496b6f31592 100644 --- a/provisionersdk/archive.go +++ b/provisionersdk/archive.go @@ -73,7 +73,9 @@ func Tar(w io.Writer, directory string, limit int64) error { if err != nil { return err } - if strings.HasPrefix(rel, ".") || strings.HasPrefix(filepath.Base(rel), ".") { + // We want to allow .terraform.lock.hcl files to be archived. This + // allows provider plugins to be cached. + if (strings.HasPrefix(rel, ".") || strings.HasPrefix(filepath.Base(rel), ".")) && filepath.Base(rel) != ".terraform.lock.hcl" { if fileInfo.IsDir() && rel != "." { // Don't archive hidden files! return filepath.SkipDir diff --git a/provisionersdk/archive_test.go b/provisionersdk/archive_test.go index bb7d25464d1e2..66fae25dd9832 100644 --- a/provisionersdk/archive_test.go +++ b/provisionersdk/archive_test.go @@ -5,6 +5,7 @@ import ( "io" "os" "path/filepath" + "strings" "testing" "github.com/stretchr/testify/require" @@ -39,25 +40,39 @@ func TestTar(t *testing.T) { Name string Archives bool } - files := []*file{{ - Name: "*.tf", - Archives: true, - }, { - Name: ".*", - Archives: false, - }, { - Name: "./testing/.test/*.tf", - Archives: false, - }, { - Name: "./testing/asd.*", - Archives: true, - }, { - Name: ".terraform/.*", - Archives: false, - }, { - Name: "example/.terraform/*", - Archives: false, - }} + files := []*file{ + { + Name: "*.tf", + Archives: true, + }, { + Name: ".*", + Archives: false, + }, { + Name: "./testing/.test/*.tf", + Archives: false, + }, { + Name: "./testing/asd.*", + Archives: true, + }, { + Name: ".terraform/.*", + Archives: false, + }, { + Name: "example/.terraform/*", + Archives: false, + }, { + Name: ".terraform.lock.hcl", + Archives: true, + }, { + Name: "example/.terraform.lock.hcl", + Archives: true, + }, { + Name: ".terraform/.terraform.lock.hcl", + Archives: false, + }, { + Name: "terraform.tfstate", + Archives: false, + }, + } for _, file := range files { newDir := dir file.Name = filepath.FromSlash(file.Name) @@ -67,11 +82,19 @@ func TestTar(t *testing.T) { require.NoError(t, err) file.Name = filepath.Base(file.Name) } - tmpFile, err := os.CreateTemp(newDir, file.Name) - require.NoError(t, err) - _ = tmpFile.Close() - file.Name, err = filepath.Rel(dir, tmpFile.Name()) - require.NoError(t, err) + if strings.Contains(file.Name, "*") { + tmpFile, err := os.CreateTemp(newDir, file.Name) + require.NoError(t, err) + _ = tmpFile.Close() + file.Name, err = filepath.Rel(dir, tmpFile.Name()) + require.NoError(t, err) + } else { + name := filepath.Join(newDir, file.Name) + err := os.WriteFile(name, []byte{}, 0o600) + require.NoError(t, err) + file.Name, err = filepath.Rel(dir, name) + require.NoError(t, err) + } } archive := new(bytes.Buffer) err := provisionersdk.Tar(archive, dir, 1024)