From 5dd56d97383e7da880f1670f5cd1a72bb11299d2 Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Wed, 13 Apr 2022 10:01:36 -0700 Subject: [PATCH] Made Resolve return an error on unknown type, rather than panic --- go/store/cmd/noms/noms_commit.go | 4 +++- go/store/cmd/noms/noms_set.go | 4 +++- go/store/cmd/noms/noms_struct.go | 7 ++++++- go/store/config/resolver.go | 7 ++++++- go/store/spec/absolute_path.go | 22 +++++++++++++++------- go/store/spec/spec.go | 7 +++++-- 6 files changed, 38 insertions(+), 13 deletions(-) diff --git a/go/store/cmd/noms/noms_commit.go b/go/store/cmd/noms/noms_commit.go index 09976d5f25..0d49f0fe92 100644 --- a/go/store/cmd/noms/noms_commit.go +++ b/go/store/cmd/noms/noms_commit.go @@ -74,7 +74,9 @@ func runCommit(ctx context.Context, args []string) int { absPath, err := spec.NewAbsolutePath(path) util.CheckError(err) - value := absPath.Resolve(ctx, db, vrw) + value, err := absPath.Resolve(ctx, db, vrw) + util.CheckError(err) + if value == nil { util.CheckErrorNoUsage(errors.New(fmt.Sprintf("Error resolving value: %s", path))) } diff --git a/go/store/cmd/noms/noms_set.go b/go/store/cmd/noms/noms_set.go index 8b0c1f5870..2f08fb6178 100644 --- a/go/store/cmd/noms/noms_set.go +++ b/go/store/cmd/noms/noms_set.go @@ -161,7 +161,9 @@ func argumentToValue(ctx context.Context, arg string, db datas.Database, vrw typ if arg[0] == '@' { p, err := spec.NewAbsolutePath(arg[1:]) d.PanicIfError(err) - return p.Resolve(ctx, db, vrw), nil + resolve, err := p.Resolve(ctx, db, vrw) + d.PanicIfError(err) + return resolve, nil } if n, err := strconv.ParseFloat(arg, 64); err == nil { return types.Float(n), nil diff --git a/go/store/cmd/noms/noms_struct.go b/go/store/cmd/noms/noms_struct.go index 5eeb37cac1..b3d201ed54 100644 --- a/go/store/cmd/noms/noms_struct.go +++ b/go/store/cmd/noms/noms_struct.go @@ -107,7 +107,12 @@ func nomsStructDel(ctx context.Context, specStr string, args []string) int { func splitPath(ctx context.Context, db datas.Database, sp spec.Spec) (rootVal types.Value, basePath types.Path) { rootPath := sp.Path rootPath.Path = types.Path{} - rootVal = rootPath.Resolve(ctx, db, sp.GetVRW(ctx)) + var err error + rootVal, err = rootPath.Resolve(ctx, db, sp.GetVRW(ctx)) + if err != nil { + panic(err) + } + if rootVal == nil { util.CheckError(fmt.Errorf("Invalid path: %s", sp.String())) return diff --git a/go/store/config/resolver.go b/go/store/config/resolver.go index c6acc387e1..27495588b2 100644 --- a/go/store/config/resolver.go +++ b/go/store/config/resolver.go @@ -170,5 +170,10 @@ func (r *Resolver) GetPath(ctx context.Context, str string) (datas.Database, typ if err != nil { return nil, nil, nil, err } - return sp.GetDatabase(ctx), sp.GetVRW(ctx), sp.GetValue(ctx), nil + value, err := sp.GetValue(ctx) + if err != nil { + return nil, nil, nil, err + } + + return sp.GetDatabase(ctx), sp.GetVRW(ctx), value, nil } diff --git a/go/store/spec/absolute_path.go b/go/store/spec/absolute_path.go index 1e3bafc641..cbd91b2f4e 100644 --- a/go/store/spec/absolute_path.go +++ b/go/store/spec/absolute_path.go @@ -27,8 +27,6 @@ import ( "fmt" "regexp" - "github.com/dolthub/dolt/go/store/d" - "github.com/dolthub/dolt/go/store/datas" "github.com/dolthub/dolt/go/store/hash" "github.com/dolthub/dolt/go/store/types" @@ -103,11 +101,13 @@ func NewAbsolutePath(str string) (AbsolutePath, error) { } // Resolve returns the Value reachable by 'p' in 'db'. -func (p AbsolutePath) Resolve(ctx context.Context, db datas.Database, vrw types.ValueReadWriter) (val types.Value) { +func (p AbsolutePath) Resolve(ctx context.Context, db datas.Database, vrw types.ValueReadWriter) (val types.Value, err error) { if len(p.Dataset) > 0 { var ok bool ds, err := db.GetDataset(ctx, p.Dataset) - d.PanicIfError(err) + if err != nil { + return nil, err + } if val, ok = ds.MaybeHead(); !ok { val = nil @@ -115,7 +115,9 @@ func (p AbsolutePath) Resolve(ctx context.Context, db datas.Database, vrw types. } else if !p.Hash.IsEmpty() { var err error val, err = vrw.ReadValue(ctx, p.Hash) - d.PanicIfError(err) + if err != nil { + return nil, err + } } else { panic("Unreachable") } @@ -123,7 +125,9 @@ func (p AbsolutePath) Resolve(ctx context.Context, db datas.Database, vrw types. if val != nil && p.Path != nil { var err error val, err = p.Path.Resolve(ctx, val, vrw) - d.PanicIfError(err) + if err != nil { + return nil, err + } } return } @@ -159,7 +163,11 @@ func ReadAbsolutePaths(ctx context.Context, db datas.Database, vrw types.ValueRe return nil, fmt.Errorf("invalid input path '%s'", ps) } - v := p.Resolve(ctx, db, vrw) + v, err := p.Resolve(ctx, db, vrw) + if err != nil { + return nil, err + } + if v == nil { return nil, fmt.Errorf("input path '%s' does not exist in database", ps) } diff --git a/go/store/spec/spec.go b/go/store/spec/spec.go index 341eadb305..0e85a58809 100644 --- a/go/store/spec/spec.go +++ b/go/store/spec/spec.go @@ -396,9 +396,12 @@ func (sp Spec) GetDataset(ctx context.Context) (ds datas.Dataset) { // GetValue returns the Value at this Spec's Path within its Database, or nil // if this isn't a Path Spec or if that path isn't found. -func (sp Spec) GetValue(ctx context.Context) (val types.Value) { +func (sp Spec) GetValue(ctx context.Context) (val types.Value, err error) { if !sp.Path.IsEmpty() { - val = sp.Path.Resolve(ctx, sp.GetDatabase(ctx), sp.GetVRW(ctx)) + val, err = sp.Path.Resolve(ctx, sp.GetDatabase(ctx), sp.GetVRW(ctx)) + if err != nil { + return nil, err + } } return }