diff --git a/pkg/build/gobuild.go b/pkg/build/gobuild.go index 9f21dfd9fe..2c7aa10b2e 100644 --- a/pkg/build/gobuild.go +++ b/pkg/build/gobuild.go @@ -27,6 +27,7 @@ import ( "log" "os" "os/exec" + "path" "path/filepath" "strings" @@ -237,7 +238,7 @@ func tarBinary(name, binary string) (*bytes.Buffer, error) { defer tw.Close() // write the parent directories to the tarball archive - if err := tarAddDirectories(tw, filepath.Dir(name)); err != nil { + if err := tarAddDirectories(tw, path.Dir(name)); err != nil { return nil, err } @@ -286,8 +287,8 @@ const kodataRoot = "/var/run/ko" // to the provided tar.Writer with root -> chroot. All symlinks are dereferenced, // which is what leads to recursion when we encounter a directory symlink. func walkRecursive(tw *tar.Writer, root, chroot string) error { - return filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if path == root { + return filepath.Walk(root, func(hostPath string, info os.FileInfo, err error) error { + if hostPath == root { // Add an entry for the root directory of our walk. return tw.WriteHeader(&tar.Header{ Name: chroot, @@ -305,25 +306,25 @@ func walkRecursive(tw *tar.Writer, root, chroot string) error { if info.Mode().IsDir() { return nil } - newPath := filepath.Join(chroot, path[len(root):]) + newPath := path.Join(chroot, filepath.ToSlash(hostPath[len(root):])) - path, err = filepath.EvalSymlinks(path) + hostPath, err = filepath.EvalSymlinks(hostPath) if err != nil { return err } // Chase symlinks. - info, err = os.Stat(path) + info, err = os.Stat(hostPath) if err != nil { return err } // Skip other directories. if info.Mode().IsDir() { - return walkRecursive(tw, path, newPath) + return walkRecursive(tw, hostPath, newPath) } // Open the file to copy it into the tarball. - file, err := os.Open(path) + file, err := os.Open(hostPath) if err != nil { return err } @@ -411,7 +412,7 @@ func (gb *gobuild) Build(ctx context.Context, s string) (v1.Image, error) { }, }) - appPath := filepath.Join(appDir, appFilename(s)) + appPath := path.Join(appDir, appFilename(s)) // Construct a tarball with the binary and produce a layer. binaryLayerBuf, err := tarBinary(appPath, file) diff --git a/pkg/build/gobuild_test.go b/pkg/build/gobuild_test.go index a7292313d8..9888e7050c 100644 --- a/pkg/build/gobuild_test.go +++ b/pkg/build/gobuild_test.go @@ -19,6 +19,7 @@ import ( "context" "io" "io/ioutil" + "path" "path/filepath" "testing" "time" @@ -40,7 +41,7 @@ func TestGoBuildIsSupportedRef(t *testing.T) { // Supported import paths. for _, importpath := range []string{ - filepath.FromSlash("github.com/google/ko/cmd/ko"), // ko can build itself. + "github.com/google/ko/cmd/ko", // ko can build itself. } { t.Run(importpath, func(t *testing.T) { if !ng.IsSupportedReference(importpath) { @@ -51,8 +52,8 @@ func TestGoBuildIsSupportedRef(t *testing.T) { // Unsupported import paths. for _, importpath := range []string{ - filepath.FromSlash("github.com/google/ko/pkg/build"), // not a command. - filepath.FromSlash("github.com/google/ko/pkg/nonexistent"), // does not exist. + "github.com/google/ko/pkg/build", // not a command. + "github.com/google/ko/pkg/nonexistent", // does not exist. } { t.Run(importpath, func(t *testing.T) { if ng.IsSupportedReference(importpath) { @@ -68,7 +69,7 @@ func TestGoBuildIsSupportedRefWithModules(t *testing.T) { t.Fatalf("random.Image() = %v", err) } mod := &modInfo{ - Path: filepath.FromSlash("github.com/google/ko/cmd/ko/test"), + Path: "github.com/google/ko/cmd/ko/test", Dir: ".", } @@ -79,7 +80,7 @@ func TestGoBuildIsSupportedRefWithModules(t *testing.T) { // Supported import paths. for _, importpath := range []string{ - filepath.FromSlash("github.com/google/ko/cmd/ko/test"), // ko can build the test package. + "github.com/google/ko/cmd/ko/test", // ko can build the test package. } { t.Run(importpath, func(t *testing.T) { if !ng.IsSupportedReference(importpath) { @@ -90,9 +91,9 @@ func TestGoBuildIsSupportedRefWithModules(t *testing.T) { // Unsupported import paths. for _, importpath := range []string{ - filepath.FromSlash("github.com/google/ko/pkg/build"), // not a command. - filepath.FromSlash("github.com/google/ko/pkg/nonexistent"), // does not exist. - filepath.FromSlash("github.com/google/ko/cmd/ko"), // not in this module. + "github.com/google/ko/pkg/build", // not a command. + "github.com/google/ko/pkg/nonexistent", // does not exist. + "github.com/google/ko/cmd/ko", // not in this module. } { t.Run(importpath, func(t *testing.T) { if ng.IsSupportedReference(importpath) { @@ -138,7 +139,7 @@ func TestGoBuildNoKoData(t *testing.T) { t.Fatalf("NewGo() = %v", err) } - img, err := ng.Build(context.Background(), filepath.Join(importpath, "cmd", "ko")) + img, err := ng.Build(context.Background(), path.Join(importpath, "cmd", "ko")) if err != nil { t.Fatalf("Build() = %v", err) } @@ -218,7 +219,7 @@ func TestGoBuild(t *testing.T) { t.Fatalf("NewGo() = %v", err) } - img, err := ng.Build(context.Background(), filepath.Join(importpath, "cmd", "ko", "test")) + img, err := ng.Build(context.Background(), path.Join(importpath, "cmd", "ko", "test")) if err != nil { t.Fatalf("Build() = %v", err) } @@ -290,7 +291,7 @@ func TestGoBuild(t *testing.T) { t.Errorf("Next() = %v", err) continue } - if header.Name != filepath.Join(kodataRoot, "kenobi") { + if header.Name != path.Join(kodataRoot, "kenobi") { continue } found = true