diff --git a/europa-universe/yarn/tests/simple/simple.cue b/europa-universe/yarn/tests/simple/simple.cue index ce8771b8..19d771b1 100644 --- a/europa-universe/yarn/tests/simple/simple.cue +++ b/europa-universe/yarn/tests/simple/simple.cue @@ -5,7 +5,7 @@ import ( ) b: #Build & { - source: engine.#Scratch.output + source: engine.#Scratch } out: b.output diff --git a/plan/task/build.go b/plan/task/build.go index 503c6d5f..a7fe22f3 100644 --- a/plan/task/build.go +++ b/plan/task/build.go @@ -115,14 +115,17 @@ func (t *buildTask) dockerfile(ctx context.Context, pctx *plancontext.Context, s return nil, err } - st, err := ref.ToState() - if err != nil { - return nil, err - } + solvedRef := ref + if ref != nil { + st, err := ref.ToState() + if err != nil { + return nil, err + } - solvedRef, err := s.Solve(ctx, st, pctx.Platform.Get()) - if err != nil { - return nil, err + solvedRef, err = s.Solve(ctx, st, pctx.Platform.Get()) + if err != nil { + return nil, err + } } // Image metadata diff --git a/plan/task/scratch.go b/plan/task/scratch.go deleted file mode 100644 index 5c01d626..00000000 --- a/plan/task/scratch.go +++ /dev/null @@ -1,24 +0,0 @@ -package task - -import ( - "context" - - "go.dagger.io/dagger/compiler" - "go.dagger.io/dagger/plancontext" - "go.dagger.io/dagger/solver" -) - -func init() { - Register("Scratch", func() Task { return &scratchTask{} }) -} - -type scratchTask struct { -} - -func (t *scratchTask) Run(ctx context.Context, pctx *plancontext.Context, s solver.Solver, v *compiler.Value) (*compiler.Value, error) { - fs := pctx.FS.New(nil) - - return compiler.NewValue().FillFields(map[string]interface{}{ - "output": fs.MarshalCUE(), - }) -} diff --git a/plancontext/fs.go b/plancontext/fs.go index a8f4009f..c4adb419 100644 --- a/plancontext/fs.go +++ b/plancontext/fs.go @@ -42,8 +42,14 @@ func (fs *FS) State() (llb.State, error) { func (fs *FS) MarshalCUE() *compiler.Value { v := compiler.NewValue() - if err := v.FillPath(fsIDPath, fs.id); err != nil { - panic(err) + if fs.result == nil { + if err := v.FillPath(fsIDPath, nil); err != nil { + panic(err) + } + } else { + if err := v.FillPath(fsIDPath, fs.id); err != nil { + panic(err) + } } return v } @@ -71,6 +77,11 @@ func (c *fsContext) FromValue(v *compiler.Value) (*FS, error) { c.l.RLock() defer c.l.RUnlock() + // This is #Scratch, so we'll return an empty FS + if v.LookupPath(fsIDPath).Kind() == cue.NullKind { + return &FS{}, nil + } + id, err := v.LookupPath(fsIDPath).String() if err != nil { return nil, fmt.Errorf("invalid FS %q: %w", v.Path(), err) diff --git a/stdlib/europa/dagger/engine/fs.cue b/stdlib/europa/dagger/engine/fs.cue index ff4d1d7a..38589afd 100644 --- a/stdlib/europa/dagger/engine/fs.cue +++ b/stdlib/europa/dagger/engine/fs.cue @@ -49,11 +49,7 @@ package engine } // Produce an empty directory -#Scratch: { - $dagger: task: _name: "Scratch" - - output: #FS -} +#Scratch: #FS & {$dagger: fs: _id: null} // Copy files from one FS tree to another #Copy: { diff --git a/stdlib/europa/dagger/engine/types.cue b/stdlib/europa/dagger/engine/types.cue index 7296f3fb..4c13245c 100644 --- a/stdlib/europa/dagger/engine/types.cue +++ b/stdlib/europa/dagger/engine/types.cue @@ -7,7 +7,7 @@ package engine // - A directory containing binary artifacts // Rule of thumb: if it fits in a tar archive, it fits in a #FS. #FS: { - $dagger: fs: _id: string + $dagger: fs: _id: string | null } // A reference to an external secret, for example: diff --git a/stdlib/europa/dagger/utils.cue b/stdlib/europa/dagger/utils.cue index b69f7b96..2f8a9f0a 100644 --- a/stdlib/europa/dagger/utils.cue +++ b/stdlib/europa/dagger/utils.cue @@ -16,12 +16,9 @@ import ( // Subdirectory tree output: #FS & copy.output - // Base image - scratch: engine.#Scratch - // Copy action copy: engine.#Copy & { - "input": scratch.output + "input": engine.#Scratch source: { root: input "path": path diff --git a/tests/plan/outputs/outputs.cue b/tests/plan/outputs/outputs.cue index 30101e8f..455b4af8 100644 --- a/tests/plan/outputs/outputs.cue +++ b/tests/plan/outputs/outputs.cue @@ -3,15 +3,11 @@ package main import "alpha.dagger.io/europa/dagger/engine" engine.#Plan & { - actions: { - scratch: engine.#Scratch - - data: engine.#WriteFile & { - input: scratch.output - path: "/test" - permissions: 0o600 - contents: "foobar" - } + actions: data: engine.#WriteFile & { + input: engine.#Scratch + path: "/test" + permissions: 0o600 + contents: "foobar" } outputs: directories: test: { diff --git a/tests/tasks.bats b/tests/tasks.bats index c93a408e..79b98601 100644 --- a/tests/tasks.bats +++ b/tests/tasks.bats @@ -92,6 +92,8 @@ setup() { @test "task: #Scratch" { cd "$TESTDIR"/tasks/scratch "$DAGGER" --europa up ./scratch.cue -l debug + "$DAGGER" --europa up ./scratch_build_scratch.cue -l debug + "$DAGGER" --europa up ./scratch_writefile.cue -l debug } @test "task: #Subdir" { diff --git a/tests/tasks/scratch/scratch.cue b/tests/tasks/scratch/scratch.cue index 10bf890b..cf69b5c8 100644 --- a/tests/tasks/scratch/scratch.cue +++ b/tests/tasks/scratch/scratch.cue @@ -10,13 +10,11 @@ engine.#Plan & { source: "alpine:3.15.0@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3" } - scratch: engine.#Scratch - exec: engine.#Exec & { input: image.output mounts: fs: { dest: "/scratch" - contents: scratch.output + contents: engine.#Scratch } workdir: "/" args: [ diff --git a/tests/tasks/scratch/scratch_build_scratch.cue b/tests/tasks/scratch/scratch_build_scratch.cue new file mode 100644 index 00000000..fb0473c1 --- /dev/null +++ b/tests/tasks/scratch/scratch_build_scratch.cue @@ -0,0 +1,14 @@ +package main + +import ( + "alpha.dagger.io/europa/dagger/engine" +) + +engine.#Plan & { + actions: build: engine.#Build & { + source: engine.#Scratch + dockerfile: contents: "FROM scratch" + // Assert that output is engine.#Scratch + output: engine.#Scratch + } +} diff --git a/tests/tasks/scratch/scratch_writefile.cue b/tests/tasks/scratch/scratch_writefile.cue new file mode 100644 index 00000000..6ac4c12f --- /dev/null +++ b/tests/tasks/scratch/scratch_writefile.cue @@ -0,0 +1,23 @@ +package main + +import ( + "alpha.dagger.io/europa/dagger/engine" +) + +engine.#Plan & { + actions: { + write: engine.#WriteFile & { + input: engine.#Scratch + path: "/testing" + contents: "1,2,3" + permissions: 700 + } + readfile: engine.#ReadFile & { + input: write.output + path: "/testing" + } & { + // assert result + contents: "1,2,3" + } + } +}