Fix relative path on windows for uuid paths

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
Tonis Tiigi 2017-03-18 12:29:56 -07:00
Родитель f95f58283b
Коммит 684633f734
1 изменённых файлов: 19 добавлений и 2 удалений

Просмотреть файл

@ -5,6 +5,8 @@ import (
"io" "io"
"os" "os"
"path/filepath" "path/filepath"
"runtime"
"strings"
"github.com/docker/docker/builder" "github.com/docker/docker/builder"
"github.com/docker/docker/pkg/pools" "github.com/docker/docker/pkg/pools"
@ -56,7 +58,7 @@ func (c *lazyContext) Stat(path string) (string, builder.FileInfo, error) {
return "", nil, errors.WithStack(convertPathError(err, cleanPath)) return "", nil, errors.WithStack(convertPathError(err, cleanPath))
} }
relPath, err := filepath.Rel(c.root, fullPath) relPath, err := rel(c.root, fullPath)
if err != nil { if err != nil {
return "", nil, errors.WithStack(convertPathError(err, cleanPath)) return "", nil, errors.WithStack(convertPathError(err, cleanPath))
} }
@ -82,7 +84,7 @@ func (c *lazyContext) Walk(root string, walkFn builder.WalkFunc) error {
return err return err
} }
return filepath.Walk(fullPath, func(fullPath string, fi os.FileInfo, err error) error { return filepath.Walk(fullPath, func(fullPath string, fi os.FileInfo, err error) error {
relPath, err := filepath.Rel(c.root, fullPath) relPath, err := rel(c.root, fullPath)
if err != nil { if err != nil {
return errors.WithStack(err) return errors.WithStack(err)
} }
@ -147,3 +149,18 @@ func convertPathError(err error, cleanpath string) error {
} }
return err return err
} }
func rel(basepath, targpath string) (string, error) {
// filepath.Rel can't handle UUID paths in windows
if runtime.GOOS == "windows" {
pfx := basepath + `\`
if strings.HasPrefix(targpath, pfx) {
p := strings.TrimPrefix(targpath, pfx)
if p == "" {
p = "."
}
return p, nil
}
}
return filepath.Rel(basepath, targpath)
}