From 9c4cb1b15af5a32e464f22256c022b28536f0a06 Mon Sep 17 00:00:00 2001 From: Andrea Luzzardi Date: Mon, 22 Mar 2021 16:30:17 -0700 Subject: [PATCH] pipeline: Fix panic for empty pipelines `Solve() of `llb.Scratch()` returns a `nil` reference. This causes Pipelines with no operations to panic when interacted with, because of `nil` pointer de-reference. Mitigates #189 and #184 Signed-off-by: Andrea Luzzardi --- dagger/pipeline.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/dagger/pipeline.go b/dagger/pipeline.go index 1293d58c..6ea5034e 100644 --- a/dagger/pipeline.go +++ b/dagger/pipeline.go @@ -49,8 +49,11 @@ func (p *Pipeline) State() llb.State { return p.state } -func (p *Pipeline) Result() bkgw.Reference { - return p.result +func (p *Pipeline) Result() (llb.State, error) { + if p.result == nil { + return llb.Scratch(), nil + } + return p.result.ToState() } func (p *Pipeline) FS() fs.FS { @@ -134,7 +137,8 @@ func (p *Pipeline) Do(ctx context.Context, code ...*compiler.Value) error { if err != nil { return err } - // 2. Execute each operation in sequence + + // Execute each operation in sequence for idx, op := range ops { // If op not concrete, interrupt without error. // This allows gradual resolution: @@ -161,6 +165,7 @@ func (p *Pipeline) Do(ctx context.Context, code ...*compiler.Value) error { return err } } + return nil } @@ -241,7 +246,7 @@ func (p *Pipeline) Copy(ctx context.Context, op *compiler.Value, st llb.State) ( if err := from.Do(ctx, op.Get("from")); err != nil { return st, err } - fromResult, err := from.Result().ToState() + fromResult, err := from.Result() if err != nil { return st, err } @@ -441,7 +446,7 @@ func (p *Pipeline) mount(ctx context.Context, dest string, mnt *compiler.Value) if err := from.Do(ctx, mnt.Get("from")); err != nil { return nil, err } - fromResult, err := from.Result().ToState() + fromResult, err := from.Result() if err != nil { return nil, err } @@ -545,7 +550,7 @@ func (p *Pipeline) Load(ctx context.Context, op *compiler.Value, st llb.State) ( if err := from.Do(ctx, op.Get("from")); err != nil { return st, err } - return from.Result().ToState() + return from.Result() } func (p *Pipeline) FetchContainer(ctx context.Context, op *compiler.Value, st llb.State) (llb.State, error) { @@ -612,7 +617,7 @@ func (p *Pipeline) PushContainer(ctx context.Context, op *compiler.Value, st llb // Add the default tag "latest" to a reference if it only has a repo name. ref = reference.TagNameOnly(ref) - pushSt, err := p.Result().ToState() + pushSt, err := p.Result() if err != nil { return st, err } @@ -678,7 +683,7 @@ func (p *Pipeline) DockerBuild(ctx context.Context, op *compiler.Value, st llb.S if err := from.Do(ctx, context); err != nil { return st, err } - fromResult, err := from.Result().ToState() + fromResult, err := from.Result() if err != nil { return st, err }