Skip to content

Commit

Permalink
Combine home dir resolving into path resolving.
Browse files Browse the repository at this point in the history
Use filepath.Rel() instead of raw prefix checking.
  • Loading branch information
silphid committed May 29, 2021
1 parent dea6c09 commit 1fd116a
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 59 deletions.
2 changes: 1 addition & 1 deletion dev/build
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/bin/bash
go build -ldflags "-X main.version=dev-$(date +%F-%T)" -o /usr/local/bin/yeydev ./src
go build -ldflags "-X main.version=dev-$(date +%F-%T)" -o /usr/local/bin/yey ./src
15 changes: 8 additions & 7 deletions src/cmd/run/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Expand Down
34 changes: 0 additions & 34 deletions src/internal/context.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package yey

import (
"path/filepath"

"github.com/mitchellh/go-homedir"
"gopkg.in/yaml.v2"
)

Expand Down Expand Up @@ -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
}
61 changes: 49 additions & 12 deletions src/internal/contextFile.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}

Expand Down Expand Up @@ -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
}
6 changes: 1 addition & 5 deletions src/internal/docker/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit 1fd116a

Please sign in to comment.