588f95dca0
Currently pkg/archive stores nested windows files with backslashes (e.g. `dir\`, `dir\file.txt`) and this causes tar not being correctly extracted on Linux daemon. This change assures we canonicalize all paths to unix paths and add them to tar with that name independent of platform. Fixes the following test cases for Windows CI: - TestBuildAddFileWithWhitespace - TestBuildCopyFileWithWhitespace - TestBuildAddDirContentToRoot - TestBuildAddDirContentToExistingDir - TestBuildCopyDirContentToRoot - TestBuildCopyDirContentToExistDir - TestBuildDockerignore - TestBuildEnvUsage - TestBuildEnvUsage2 Signed-off-by: Ahmet Alp Balkan <ahmetalpbalkan@gmail.com>
48 lines
1.3 KiB
Go
48 lines
1.3 KiB
Go
// +build windows
|
|
|
|
package archive
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestCanonicalTarNameForPath(t *testing.T) {
|
|
cases := []struct {
|
|
in, expected string
|
|
shouldFail bool
|
|
}{
|
|
{"foo", "foo", false},
|
|
{"foo/bar", "___", true}, // unix-styled windows path must fail
|
|
{`foo\bar`, "foo/bar", false},
|
|
{`foo\bar`, "foo/bar/", false},
|
|
}
|
|
for _, v := range cases {
|
|
if out, err := canonicalTarNameForPath(v.in); err != nil && !v.shouldFail {
|
|
t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err)
|
|
} else if v.shouldFail && err == nil {
|
|
t.Fatalf("canonical path call should have pailed with error. in=%s out=%s", v.in, out)
|
|
} else if !v.shouldFail && out != v.expected {
|
|
t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCanonicalTarName(t *testing.T) {
|
|
cases := []struct {
|
|
in string
|
|
isDir bool
|
|
expected string
|
|
}{
|
|
{"foo", false, "foo"},
|
|
{"foo", true, "foo/"},
|
|
{`foo\bar`, false, "foo/bar"},
|
|
{`foo\bar`, true, "foo/bar/"},
|
|
}
|
|
for _, v := range cases {
|
|
if out, err := canonicalTarName(v.in, v.isDir); err != nil {
|
|
t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err)
|
|
} else if out != v.expected {
|
|
t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out)
|
|
}
|
|
}
|
|
}
|