engine.#Source: Fix relative path support
Fixes #1492 Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
parent
49e7f2860f
commit
3a90542446
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
@ -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"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ engine.#Plan & {
|
|||||||
}
|
}
|
||||||
|
|
||||||
source: engine.#Source & {
|
source: engine.#Source & {
|
||||||
path: ".."
|
path: "testdata/../.."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
tests/tasks/source/source_relative.cue
Normal file
25
tests/tasks/source/source_relative.cue
Normal 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
1
tests/tasks/source/testdata/world.txt
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
world
|
Reference in New Issue
Block a user