From 1fd116a8efc7f1d1d35c10339ec12fa561932218 Mon Sep 17 00:00:00 2001 From: Mathieu Frenette Date: Sat, 29 May 2021 19:21:04 -0400 Subject: [PATCH] Combine home dir resolving into path resolving. Use filepath.Rel() instead of raw prefix checking. --- dev/build | 2 +- src/cmd/run/run.go | 15 ++++----- src/internal/context.go | 34 --------------------- src/internal/contextFile.go | 61 +++++++++++++++++++++++++++++-------- src/internal/docker/cli.go | 6 +--- 5 files changed, 59 insertions(+), 59 deletions(-) diff --git a/dev/build b/dev/build index 938e03f..ce29e1c 100755 --- a/dev/build +++ b/dev/build @@ -1,2 +1,2 @@ #!/bin/bash -go build -ldflags "-X main.version=dev-$(date +%F-%T)" -o /usr/local/bin/yeydev ./src \ No newline at end of file +go build -ldflags "-X main.version=dev-$(date +%F-%T)" -o /usr/local/bin/yey ./src \ No newline at end of file diff --git a/src/cmd/run/run.go b/src/cmd/run/run.go index 9541d1d..255e37c 100644 --- a/src/cmd/run/run.go +++ b/src/cmd/run/run.go @@ -100,14 +100,15 @@ func getContainerWorkDir(yeyContext yey.Context) (string, error) { return "", err } - mounts, err := yeyContext.ResolveMounts() - if err != nil { - return "", err - } + for key, value := range yeyContext.Mounts { + // Where is work dir relatively to mount dir? + subDir, err := filepath.Rel(key, workDir) + if err != nil { + return "", err + } - for key, value := range mounts { - if strings.HasPrefix(workDir, key) { - subDir := strings.TrimPrefix(workDir, key) + // Is work dir within mount dir? + if !strings.HasPrefix(subDir, fmt.Sprintf("..%c", filepath.Separator)) { return filepath.Join(value, subDir), nil } } diff --git a/src/internal/context.go b/src/internal/context.go index 7fce7c9..c8bc401 100644 --- a/src/internal/context.go +++ b/src/internal/context.go @@ -1,9 +1,6 @@ package yey import ( - "path/filepath" - - "github.com/mitchellh/go-homedir" "gopkg.in/yaml.v2" ) @@ -83,34 +80,3 @@ func (c Context) String() string { } return string(buf) } - -func (c Context) ResolveMounts() (map[string]string, error) { - mounts := make(map[string]string, len(c.Mounts)) - for key, value := range c.Mounts { - dir, err := resolveLocalDir(key) - if err != nil { - return nil, err - } - mounts[dir] = value - } - return mounts, nil -} - -func resolveLocalDir(dir string) (string, error) { - var err error - if dir == "~" { - dir, err = homedir.Dir() - } else { - dir, err = homedir.Expand(dir) - } - if err != nil { - return "", err - } - - dir, err = filepath.Abs(dir) - if err != nil { - return "", err - } - - return dir, nil -} diff --git a/src/internal/contextFile.go b/src/internal/contextFile.go index a400492..084e090 100644 --- a/src/internal/contextFile.go +++ b/src/internal/contextFile.go @@ -90,9 +90,16 @@ func parseContextFile(dir string, data []byte) (Contexts, error) { } if dir != "" { - contexts.Context = resolveContextPaths(dir, contexts.Context) + var err error + contexts.Context, err = resolveContextPaths(dir, contexts.Context) + if err != nil { + return Contexts{}, err + } for name, context := range contexts.Named { - contexts.Named[name] = resolveContextPaths(dir, context) + contexts.Named[name], err = resolveContextPaths(dir, context) + if err != nil { + return Contexts{}, err + } } } @@ -145,24 +152,54 @@ func LoadContexts() (Contexts, error) { return contexts, nil } -func resolveContextPaths(dir string, context Context) Context { +func resolveContextPaths(dir string, context Context) (Context, error) { clone := context.Clone() - clone.Build.Dockerfile = resolvePath(dir, context.Build.Dockerfile) - clone.Build.Context = resolvePath(dir, clone.Build.Context) - for key, value := range clone.Mounts { - clone.Mounts[resolvePath(dir, key)] = value + + // Resolve dockerfile path + var err error + clone.Build.Dockerfile, err = resolvePath(dir, context.Build.Dockerfile) + if err != nil { + return Context{}, err + } + + // Resolve build context dir + clone.Build.Context, err = resolvePath(dir, clone.Build.Context) + if err != nil { + return Context{}, err + } + + // Resolve mount dirs + clone.Mounts = make(map[string]string, len(context.Mounts)) + for key, value := range context.Mounts { + key, err = resolvePath(dir, key) + if err != nil { + return Context{}, err + } + clone.Mounts[key] = value } - return clone + + return clone, nil } -func resolvePath(dir, path string) string { +func resolvePath(dir, path string) (string, error) { if path == "" { - return "" + return "", nil + } + + // Resolve home dir + var err error + if path == "~" { + path, err = homedir.Dir() + } else { + path, err = homedir.Expand(path) + } + if err != nil { + return "", err } if filepath.IsAbs(path) { - return path + return path, nil } - return filepath.Join(dir, path) + return filepath.Join(dir, path), nil } diff --git a/src/internal/docker/cli.go b/src/internal/docker/cli.go index 34055c0..093e0e3 100644 --- a/src/internal/docker/cli.go +++ b/src/internal/docker/cli.go @@ -129,11 +129,7 @@ func runContainer(ctx context.Context, yeyCtx yey.Context, containerName, workDi } // Mount binds - mounts, err := yeyCtx.ResolveMounts() - if err != nil { - return err - } - for key, value := range mounts { + for key, value := range yeyCtx.Mounts { args = append( args, "--volume",