From 3a9054244699c27059c566ef1cad1ca1001ae30a Mon Sep 17 00:00:00 2001 From: Andrea Luzzardi Date: Fri, 28 Jan 2022 13:53:43 -0800 Subject: [PATCH] engine.#Source: Fix relative path support Fixes #1492 Signed-off-by: Andrea Luzzardi --- plan/task/source.go | 21 ++++++++++------ tests/tasks.bats | 1 + tests/tasks/dockerfile/cue.mod/pkg/.gitignore | 2 +- tests/tasks/source/source.cue | 16 ++++++------ tests/tasks/source/source_invalid_path.cue | 2 +- tests/tasks/source/source_relative.cue | 25 +++++++++++++++++++ tests/tasks/source/testdata/world.txt | 1 + 7 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 tests/tasks/source/source_relative.cue create mode 100644 tests/tasks/source/testdata/world.txt diff --git a/plan/task/source.go b/plan/task/source.go index 40701934..50062f84 100644 --- a/plan/task/source.go +++ b/plan/task/source.go @@ -4,8 +4,8 @@ import ( "context" "errors" "fmt" - "io/fs" "os" + "strings" "github.com/moby/buildkit/client/llb" "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 { - path, err := v.Lookup("path").String() + origPath, err := v.Lookup("path").String() if err != nil { return err } - if !fs.ValidPath(path) { - return fmt.Errorf("invalid path %q", path) - } - absPath, err := v.Lookup("path").AbsPath() if err != nil { return err } - if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) { - return fmt.Errorf("path %q does not exist", path) + location, err := v.Lookup("path").Dirname() + 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) diff --git a/tests/tasks.bats b/tests/tasks.bats index 25cee42b..b595b0aa 100644 --- a/tests/tasks.bats +++ b/tests/tasks.bats @@ -137,6 +137,7 @@ setup() { cd "$TESTDIR"/tasks/source "$DAGGER" --europa up ./source.cue "$DAGGER" --europa up ./source_include_exclude.cue + "$DAGGER" --europa up ./source_relative.cue run "$DAGGER" --europa up ./source_invalid_path.cue assert_failure diff --git a/tests/tasks/dockerfile/cue.mod/pkg/.gitignore b/tests/tasks/dockerfile/cue.mod/pkg/.gitignore index c88aae2e..331f139d 100644 --- a/tests/tasks/dockerfile/cue.mod/pkg/.gitignore +++ b/tests/tasks/dockerfile/cue.mod/pkg/.gitignore @@ -1,5 +1,5 @@ # generated by dagger +dagger.lock alpha.dagger.io dagger.io -dagger.lock universe.dagger.io \ No newline at end of file diff --git a/tests/tasks/source/source.cue b/tests/tasks/source/source.cue index 4f554df6..45c8d395 100644 --- a/tests/tasks/source/source.cue +++ b/tests/tasks/source/source.cue @@ -24,19 +24,19 @@ engine.#Plan & { } verifyHello: engine.#ReadFile & { - input: source.output - path: "/hello.txt" - } & { - // assert result - contents: "hello\n" - } - - verifyWorld: engine.#ReadFile & { input: source.output path: "/world.txt" } & { // assert result contents: "world\n" } + + verifyWorld: engine.#ReadFile & { + input: exec.output + path: "/test.txt" + } & { + // assert result + contents: "hello world" + } } } diff --git a/tests/tasks/source/source_invalid_path.cue b/tests/tasks/source/source_invalid_path.cue index 126d4a29..39fe5bf4 100644 --- a/tests/tasks/source/source_invalid_path.cue +++ b/tests/tasks/source/source_invalid_path.cue @@ -11,7 +11,7 @@ engine.#Plan & { } source: engine.#Source & { - path: ".." + path: "testdata/../.." } } } diff --git a/tests/tasks/source/source_relative.cue b/tests/tasks/source/source_relative.cue new file mode 100644 index 00000000..a6b662bc --- /dev/null +++ b/tests/tasks/source/source_relative.cue @@ -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" + } + } +} diff --git a/tests/tasks/source/testdata/world.txt b/tests/tasks/source/testdata/world.txt new file mode 100644 index 00000000..cc628ccd --- /dev/null +++ b/tests/tasks/source/testdata/world.txt @@ -0,0 +1 @@ +world