From 0c0e3f0e4d8def6e19984b8356f5a4478004bf91 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Sat, 17 Dec 2022 02:19:19 +1000 Subject: [PATCH] fix: fix nested dirs in example tars (#5447) --- examples/examples.go | 19 ++++++++++++++----- examples/examples_test.go | 2 +- provisionersdk/archive.go | 4 ++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/examples/examples.go b/examples/examples.go index 78da2079ee..5c2fab8e37 100644 --- a/examples/examples.go +++ b/examples/examples.go @@ -7,6 +7,7 @@ import ( "io" "io/fs" "path" + "strings" "sync" "github.com/gohugoio/hugo/parser/pageparser" @@ -162,28 +163,36 @@ func Archive(exampleID string) ([]byte, error) { if err != nil { return err } + if path == "." { + // Tar files don't have a root directory. + return nil + } info, err := entry.Info() if err != nil { return xerrors.Errorf("stat file: %w", err) } - header, err := tar.FileInfoHeader(info, entry.Name()) + header, err := tar.FileInfoHeader(info, "") if err != nil { return xerrors.Errorf("get file header: %w", err) } + header.Name = strings.TrimPrefix(path, "./") header.Mode = 0644 if entry.IsDir() { - header.Name = path + "/" - + // Trailing slash on entry name is not required. Our tar + // creation code for tarring up a local directory doesn't + // include slashes so this we don't include them here for + // consistency. + // header.Name += "/" + header.Mode = 0755 + header.Typeflag = tar.TypeDir err = tarWriter.WriteHeader(header) if err != nil { return xerrors.Errorf("write file: %w", err) } } else { - header.Name = path - file, err := exampleFiles.Open(path) if err != nil { return xerrors.Errorf("open file %s: %w", path, err) diff --git a/examples/examples_test.go b/examples/examples_test.go index 551692aee8..caa7d4a5bb 100644 --- a/examples/examples_test.go +++ b/examples/examples_test.go @@ -51,6 +51,6 @@ func TestSubdirs(t *testing.T) { entryPaths[header.Typeflag] = append(entryPaths[header.Typeflag], header.Name) } - require.Subset(t, entryPaths[tar.TypeDir], []string{"./", "images/"}) + require.Subset(t, entryPaths[tar.TypeDir], []string{"images"}) require.Subset(t, entryPaths[tar.TypeReg], []string{"README.md", "main.tf", "images/base.Dockerfile"}) } diff --git a/provisionersdk/archive.go b/provisionersdk/archive.go index 2df6b457c2..b4da315e25 100644 --- a/provisionersdk/archive.go +++ b/provisionersdk/archive.go @@ -81,11 +81,11 @@ func Tar(directory string, limit int64) ([]byte, error) { return filepath.SkipDir } // Don't archive hidden files! - return err + return nil } if strings.Contains(rel, ".tfstate") { // Don't store tfstate! - return err + return nil } // Use unix paths in the tar archive. header.Name = filepath.ToSlash(rel)