Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions cli/clitest/clitest.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"bytes"
"errors"
"io"
"io/ioutil"
"os"
"path/filepath"
"testing"
Expand Down Expand Up @@ -52,6 +53,9 @@ func SetupConfig(t *testing.T, client *codersdk.Client, root config.Root) {
// new temporary testing directory.
func CreateTemplateVersionSource(t *testing.T, responses *echo.Responses) string {
directory := t.TempDir()
f, err := ioutil.TempFile(directory, "*.tf")
require.NoError(t, err)
f.Close()
data, err := echo.Tar(responses)
require.NoError(t, err)
extractTar(t, data, directory)
Expand Down
39 changes: 37 additions & 2 deletions provisionersdk/archive.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,47 @@ const (
TemplateArchiveLimit = 1 << 20
)

// Tar archives a directory.
func dirHasExt(dir string, ext string) (bool, error) {
dirEnts, err := os.ReadDir(dir)
if err != nil {
return false, err
}

for _, fi := range dirEnts {
if strings.HasSuffix(fi.Name(), ext) {
return true, nil
}
}

return false, nil
}

// Tar archives a Terraform directory.
func Tar(directory string, limit int64) ([]byte, error) {
var buffer bytes.Buffer
tarWriter := tar.NewWriter(&buffer)
totalSize := int64(0)
err := filepath.Walk(directory, func(file string, fileInfo os.FileInfo, err error) error {

const tfExt = ".tf"
hasTf, err := dirHasExt(directory, tfExt)
if err != nil {
return nil, err
}
if !hasTf {
absPath, err := filepath.Abs(directory)
if err != nil {
return nil, err
}

// Show absolute path to aid in debugging. E.g. showing "." is
// useless.
return nil, xerrors.Errorf(
"%s is not a valid template since it has no %s files",
absPath, tfExt,
)
}

err = filepath.Walk(directory, func(file string, fileInfo os.FileInfo, err error) error {
if err != nil {
return err
}
Expand Down
26 changes: 19 additions & 7 deletions provisionersdk/archive_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,30 @@ import (

func TestTar(t *testing.T) {
t.Parallel()
dir := t.TempDir()
file, err := os.CreateTemp(dir, "")
require.NoError(t, err)
_ = file.Close()
_, err = provisionersdk.Tar(dir, 1024)
require.NoError(t, err)
t.Run("NoTF", func(t *testing.T) {
t.Parallel()
dir := t.TempDir()
file, err := os.CreateTemp(dir, "")
require.NoError(t, err)
_ = file.Close()
_, err = provisionersdk.Tar(dir, 1024)
require.Error(t, err)
})
t.Run("Valid", func(t *testing.T) {
t.Parallel()
dir := t.TempDir()
file, err := os.CreateTemp(dir, "*.tf")
require.NoError(t, err)
_ = file.Close()
_, err = provisionersdk.Tar(dir, 1024)
require.NoError(t, err)
})
}

func TestUntar(t *testing.T) {
t.Parallel()
dir := t.TempDir()
file, err := os.CreateTemp(dir, "")
file, err := os.CreateTemp(dir, "*.tf")
require.NoError(t, err)
_ = file.Close()
archive, err := provisionersdk.Tar(dir, 1024)
Expand Down
2 changes: 1 addition & 1 deletion pty/ptytest/ptytest.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ func (p *PTY) ExpectMatch(str string) string {
p.logf("matched %q = %q", str, buffer.String())
return buffer.String()
case <-timeout.Done():
// Ensure goroutine is cleaned up before test exit.
// Ensure gorouine is cleaned up before test exit.
_ = p.out.closeErr(p.Close())
<-match

Expand Down