Skip to content
This repository has been archived by the owner before Nov 9, 2022. It is now read-only.

Add backtraces to error output and + update starlark dependency #8

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 go.mod
@@ -9,5 +9,5 @@ require (
github.com/kelseyhightower/envconfig v1.4.0
github.com/sirupsen/logrus v1.4.2
github.com/stretchr/testify v1.3.0 // indirect
go.starlark.net v0.0.0-20190820173200-988906f77f65
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5
)
7 go.sum
@@ -5,6 +5,9 @@ github.com/bazelbuild/bazel-gazelle v0.19.1 h1:TSCGVqpHStCj1MTszuDfZt6Z2Ca8ekq2o
github.com/bazelbuild/bazel-gazelle v0.19.1/go.mod h1:rPwzNHUqEzngx1iVBfO/2X2npKaT3tqPqqHW6rVsn/A=
github.com/bazelbuild/buildtools v0.0.0-20190731111112-f720930ceb60/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU=
github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -34,10 +37,14 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
go.starlark.net v0.0.0-20190820173200-988906f77f65 h1:0766L84ADcyJQKl+NsKSJC8JBEuer/2RxL37StWfsx4=
go.starlark.net v0.0.0-20190820173200-988906f77f65/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg=
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190122071731-054c452bb702/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c h1:Vco5b+cuG5NNfORVxZy6bYZQ7rsigisU1WQFkvQ0L5E=
golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/tools v0.0.0-20190122202912-9c309ee22fab/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -8,6 +8,7 @@ import (
"bytes"
"context"
"errors"
"fmt"

"github.com/drone/drone-convert-starlark/plugin/starlark/repo"

@@ -77,7 +78,7 @@ func (p *plugin) Convert(ctx context.Context, req *converter.Request) (*drone.Co
}
globals, err := starlark.ExecFile(thread, req.Repo.Config, []byte(req.Config.Data), nil)
if err != nil {
return nil, err
return nil, prettyStarlarkError(err)
}

// find the main method in the starlark script and
@@ -97,7 +98,7 @@ func (p *plugin) Convert(ctx context.Context, req *converter.Request) (*drone.Co
args := createArgs(req.Repo, req.Build)
mainVal, err = starlark.Call(thread, main, args, nil)
if err != nil {
return nil, err
return nil, prettyStarlarkError(err)
}

buf := new(bytes.Buffer)
@@ -145,3 +146,12 @@ func (p *plugin) loadExtension(t *starlark.Thread, labelStr string) (starlark.St
logrus.Debugln("successfully loaded extension", labelStr)
return loaded, err
}

// prettyStarlarkError returns a suitable human readable error for a
// starlark.Exec error or returns the error unmodified.
func prettyStarlarkError(err error) error {
if err, ok := err.(*starlark.EvalError); ok {
return fmt.Errorf("starlark evaluation error:\n%s", err.Backtrace())
}
return err
}
@@ -250,3 +250,55 @@ func TestPlugin_Load_Unknown_Repo(t *testing.T) {
t.Error("expected ErrNoSuchRepo")
}
}

// Test that the fail builtin fails the build
func TestPlugin_Fail(t *testing.T) {
req := &converter.Request{
Build: drone.Build{
After: "3d21ec53a331a6f037a91c368710b99387d012c1",
},
Repo: drone.Repo{
Slug: "octocat/hello-world",
Config: ".drone.yml",
},
}

plugin := New(newTestRegistry(t))

config, err := plugin.Convert(noContext, req)
if err != nil {
t.Error(err)
return
}
if config != nil {
t.Error("Want nil config when configuration is not starlark file")
return
}

before, err := ioutil.ReadFile("testdata/fail.star")
if err != nil {
t.Error(err)
return
}
after, err := ioutil.ReadFile("testdata/fail.error")
if err != nil {
t.Error(err)
return
}

req.Repo.Config = "fail.star"
req.Config.Data = string(before)
config, err = plugin.Convert(noContext, req)
if err == nil {
t.Error("expected error")
return
}
if config != nil {
t.Error("Want non-nil configuration")
return
}

if want, got := err.Error(), string(after); want != got {
t.Errorf("Want %q got %q", want, got)
}
}
@@ -0,0 +1,7 @@
starlark evaluation error:
Traceback (most recent call last):
fail.star:2:8: in main
fail.star:5:8: in fn1
fail.star:8:9: in fn2
<builtin>: in fail
Error: fail: fail-message
@@ -0,0 +1,8 @@
def main(ctx):
fn1()

def fn1():
fn2()

def fn2():
fail("fail-message")