Prevents files to be used as input of dagger.#FS

Errors out in the PreRun phase of the clientfilesystemreader task since
otherwise, dagger execution would hang
Fixes #1977

Signed-off-by: Marcos Lilljedahl <marcosnils@gmail.com>
This commit is contained in:
Marcos Lilljedahl 2022-03-31 19:31:14 -03:00
parent acc593f388
commit 66153c6194
3 changed files with 24 additions and 3 deletions

View File

@ -18,8 +18,7 @@ func init() {
Register("ClientFilesystemRead", func() Task { return &clientFilesystemReadTask{} }) Register("ClientFilesystemRead", func() Task { return &clientFilesystemReadTask{} })
} }
type clientFilesystemReadTask struct { type clientFilesystemReadTask struct{}
}
func (t clientFilesystemReadTask) PreRun(_ context.Context, pctx *plancontext.Context, v *compiler.Value) error { func (t clientFilesystemReadTask) PreRun(_ context.Context, pctx *plancontext.Context, v *compiler.Value) error {
path, err := t.parsePath(v) path, err := t.parsePath(v)
@ -27,8 +26,10 @@ func (t clientFilesystemReadTask) PreRun(_ context.Context, pctx *plancontext.Co
return err return err
} }
if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) { if pi, err := os.Stat(path); errors.Is(err, os.ErrNotExist) {
return fmt.Errorf("path %q does not exist", path) return fmt.Errorf("path %q does not exist", path)
} else if !pi.IsDir() && plancontext.IsFSValue(v.Lookup("contents")) {
return fmt.Errorf("path %q is not a directory", path)
} }
if plancontext.IsFSValue(v.Lookup("contents")) { if plancontext.IsFSValue(v.Lookup("contents")) {

View File

@ -84,6 +84,15 @@ setup() {
assert_output --partial 'path "/foobar" does not exist' assert_output --partial 'path "/foobar" does not exist'
} }
@test "plan/client/filesystem/read/fs/invalid" {
cd "$TESTDIR/plan/client/filesystem/read/fs/invalid"
run "$DAGGER" "do" -p . test
assert_failure
assert_output --partial 'test.txt" is not a directory'
}
@test "plan/client/filesystem/read/fs/relative" { @test "plan/client/filesystem/read/fs/relative" {
cd "$TESTDIR/plan/client/filesystem/read/fs/relative" cd "$TESTDIR/plan/client/filesystem/read/fs/relative"

View File

@ -0,0 +1,11 @@
package main
import (
"dagger.io/dagger"
)
dagger.#Plan & {
client: filesystem: "../rootfs/test.txt": read: contents: dagger.#FS
actions: test: {
}
}