engine.#Source: Fix relative path support

Fixes #1492

Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
Andrea Luzzardi 2022-01-28 13:53:43 -08:00
parent 49e7f2860f
commit 3a90542446
7 changed files with 50 additions and 18 deletions

View File

@ -4,8 +4,8 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"io/fs"
"os" "os"
"strings"
"github.com/moby/buildkit/client/llb" "github.com/moby/buildkit/client/llb"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@ -22,22 +22,27 @@ type sourceTask struct {
} }
func (c *sourceTask) PreRun(ctx context.Context, pctx *plancontext.Context, v *compiler.Value) error { func (c *sourceTask) PreRun(ctx context.Context, pctx *plancontext.Context, v *compiler.Value) error {
path, err := v.Lookup("path").String() origPath, err := v.Lookup("path").String()
if err != nil { if err != nil {
return err return err
} }
if !fs.ValidPath(path) {
return fmt.Errorf("invalid path %q", path)
}
absPath, err := v.Lookup("path").AbsPath() absPath, err := v.Lookup("path").AbsPath()
if err != nil { if err != nil {
return err return err
} }
if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) { location, err := v.Lookup("path").Dirname()
return fmt.Errorf("path %q does not exist", path) if err != nil {
return err
}
if !strings.HasPrefix(absPath, location) {
return fmt.Errorf("path %q is not relative", origPath)
}
if _, err := os.Stat(absPath); errors.Is(err, os.ErrNotExist) {
return fmt.Errorf("path %q does not exist", origPath)
} }
pctx.LocalDirs.Add(absPath) pctx.LocalDirs.Add(absPath)

View File

@ -137,6 +137,7 @@ setup() {
cd "$TESTDIR"/tasks/source cd "$TESTDIR"/tasks/source
"$DAGGER" --europa up ./source.cue "$DAGGER" --europa up ./source.cue
"$DAGGER" --europa up ./source_include_exclude.cue "$DAGGER" --europa up ./source_include_exclude.cue
"$DAGGER" --europa up ./source_relative.cue
run "$DAGGER" --europa up ./source_invalid_path.cue run "$DAGGER" --europa up ./source_invalid_path.cue
assert_failure assert_failure

View File

@ -1,5 +1,5 @@
# generated by dagger # generated by dagger
dagger.lock
alpha.dagger.io alpha.dagger.io
dagger.io dagger.io
dagger.lock
universe.dagger.io universe.dagger.io

View File

@ -24,19 +24,19 @@ engine.#Plan & {
} }
verifyHello: engine.#ReadFile & { verifyHello: engine.#ReadFile & {
input: source.output
path: "/hello.txt"
} & {
// assert result
contents: "hello\n"
}
verifyWorld: engine.#ReadFile & {
input: source.output input: source.output
path: "/world.txt" path: "/world.txt"
} & { } & {
// assert result // assert result
contents: "world\n" contents: "world\n"
} }
verifyWorld: engine.#ReadFile & {
input: exec.output
path: "/test.txt"
} & {
// assert result
contents: "hello world"
}
} }
} }

View File

@ -11,7 +11,7 @@ engine.#Plan & {
} }
source: engine.#Source & { source: engine.#Source & {
path: ".." path: "testdata/../.."
} }
} }
} }

View File

@ -0,0 +1,25 @@
package main
import (
"dagger.io/dagger/engine"
)
engine.#Plan & {
actions: {
image: engine.#Pull & {
source: "alpine:3.15.0@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3"
}
source: engine.#Source & {
path: "./testdata"
}
verifyHello: engine.#ReadFile & {
input: source.output
path: "/world.txt"
} & {
// assert result
contents: "world\n"
}
}
}

1
tests/tasks/source/testdata/world.txt vendored Normal file
View File

@ -0,0 +1 @@
world