From da8141592284523f763c4561346cc70e4b6942b2 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Fri, 17 Jun 2022 12:08:29 +0800 Subject: [PATCH 1/3] use github.com/qiniu/x/errors --- .gitignore | 1 + go.mod | 5 ++++- go.sum | 2 ++ gopmod/module.go | 3 ++- modfile/rule.go | 24 +++++++++++++++++++----- modload/module.go | 11 +++++++---- 6 files changed, 35 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 66fd13c..c6e5253 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ # Dependency directories (remove the comment below to include it) # vendor/ +go.work* diff --git a/go.mod b/go.mod index cc7b836..ab03afb 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/goplus/mod go 1.16 -require golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 +require ( + github.com/qiniu/x v1.11.8 + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 +) diff --git a/go.sum b/go.sum index bc95eff..523a8ff 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/qiniu/x v1.11.8 h1:Jol2Nm/wNIUSk+oxebNZbYPZ1gW/UI4C6FsN5xZzcQQ= +github.com/qiniu/x v1.11.8/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= diff --git a/gopmod/module.go b/gopmod/module.go index 58e430e..131d54c 100644 --- a/gopmod/module.go +++ b/gopmod/module.go @@ -28,6 +28,7 @@ import ( "github.com/goplus/mod/modcache" "github.com/goplus/mod/modfetch" "github.com/goplus/mod/modload" + "github.com/qiniu/x/errors" "golang.org/x/mod/module" ) @@ -183,7 +184,7 @@ func New(mod modload.Module) *Module { func Load(dir string, mode mod.Mode) (*Module, error) { mod, err := modload.Load(dir, mode) if err != nil { - return nil, err + return nil, errors.NewWith(err, `modload.Load(dir, mode)`, -2, "modload.Load", dir, mode) } return New(mod), nil } diff --git a/modfile/rule.go b/modfile/rule.go index ff1c2de..f03ddbd 100644 --- a/modfile/rule.go +++ b/modfile/rule.go @@ -17,12 +17,13 @@ package modfile import ( - "errors" "fmt" "path/filepath" + "runtime" "strconv" "strings" + "github.com/qiniu/x/errors" "golang.org/x/mod/modfile" "golang.org/x/mod/module" ) @@ -105,6 +106,7 @@ func ParseLax(file string, data []byte, fix VersionFixer) (*File, error) { func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (parsed *File, err error) { f, err := modfile.ParseLax(file, data, fix) if err != nil { + err = errors.NewWith(err, `modfile.ParseLax(file, data, fix)`, -2, "modfile.ParseLax", file, data, fix) return } parsed = &File{File: *f} @@ -123,7 +125,7 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (parse } } if len(errs) > 0 { - return nil, errs + return nil, errors.NewWith(errs, `len(errs) > 0`, -1, ">", len(errs), 0) } return } @@ -138,15 +140,22 @@ func (f *File) parseVerb(errs *ErrorList, verb string, line *Line, args []string Err: err, }) } - wrapError := func(err error) { + wrapError1 := func(err error) { *errs = append(*errs, Error{ Filename: f.Syntax.Name, Pos: line.Start, Err: err, }) } + wrapError := func(err error) { + file, line := fileLine(2) + e := errors.NewFrame(err, "", file, line, "wrapError", err) + wrapError1(e) + } errorf := func(format string, args ...interface{}) { - wrapError(fmt.Errorf(format, args...)) + file, line := fileLine(2) + e := errors.NewFrame(fmt.Errorf(format, args...), "", file, line, "errorf", format, args) + wrapError1(e) } switch verb { case "require", "exclude", "module", "go", "retract": @@ -252,7 +261,7 @@ func (f *File) parseVerb(errs *ErrorList, verb string, line *Line, args []string return } if len(args) < 3 { - errorf("usage: classfile projExt workExt [classFilePkgPath ...]") + errorf("usage: classfile projExt workExt classFilePkgPath ...") return } projExt, err := parseExt(&args[0]) @@ -280,6 +289,11 @@ func (f *File) parseVerb(errs *ErrorList, verb string, line *Line, args []string } } +func fileLine(n int) (file string, line int) { + _, file, line, _ = runtime.Caller(n) + return +} + func parseVersion(verb string, path string, s *string) (string, error) { t, err := parseString(s) if err != nil { diff --git a/modload/module.go b/modload/module.go index aac867e..bfd59f3 100644 --- a/modload/module.go +++ b/modload/module.go @@ -17,7 +17,6 @@ package modload import ( - "errors" "fmt" "os" "path/filepath" @@ -26,6 +25,7 @@ import ( "github.com/goplus/mod" "github.com/goplus/mod/env" "github.com/goplus/mod/modfile" + "github.com/qiniu/x/errors" "golang.org/x/mod/module" gomodfile "golang.org/x/mod/modfile" @@ -121,23 +121,26 @@ func fixVersion(fixed *bool) modfile.VersionFixer { func Load(dir string, mode mod.Mode) (p Module, err error) { gopmod, err := mod.GOPMOD(dir, mode) if err != nil { + err = errors.NewWith(err, `mod.GOPMOD(dir, mode)`, -2, "mod.GOPMOD", dir, mode) return } data, err := os.ReadFile(gopmod) if err != nil { + err = errors.NewWith(err, `os.ReadFile(gopmod)`, -2, "os.ReadFile", gopmod) return } var fixed bool - f, err := modfile.Parse(gopmod, data, fixVersion(&fixed)) + fix := fixVersion(&fixed) + f, err := modfile.Parse(gopmod, data, fix) if err != nil { - // Errors returned by modfile.Parse begin with file:line. + err = errors.NewWith(err, `modfile.Parse(gopmod, data, fix)`, -2, "modfile.Parse", gopmod, data, fix) return } if f.Module == nil { // No module declaration. Must add module path. - return Module{}, ErrNoModDecl + return Module{}, errors.NewWith(ErrNoModDecl, `f.Module == nil`, -2, "==", f.Module, nil) } return Module{File: f}, nil } From fd635692750e65d7761f40d11ccb485ea53a603a Mon Sep 17 00:00:00 2001 From: xushiwei Date: Fri, 17 Jun 2022 12:11:12 +0800 Subject: [PATCH 2/3] ignore go.work --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index c6e5253..8dfd59f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,4 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out -# Dependency directories (remove the comment below to include it) -# vendor/ go.work* From 4dd28ed03542e76e378c2016811f860cf6750f49 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Fri, 17 Jun 2022 13:27:52 +0800 Subject: [PATCH 3/3] use errors.List --- go.mod | 2 +- go.sum | 4 ++-- modfile/gop_test.go | 9 +++++---- modfile/rule.go | 22 ++++++++++++++++++---- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index ab03afb..9a63ef6 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,6 @@ module github.com/goplus/mod go 1.16 require ( - github.com/qiniu/x v1.11.8 + github.com/qiniu/x v1.11.9 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 ) diff --git a/go.sum b/go.sum index 523a8ff..c37a533 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/qiniu/x v1.11.8 h1:Jol2Nm/wNIUSk+oxebNZbYPZ1gW/UI4C6FsN5xZzcQQ= -github.com/qiniu/x v1.11.8/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= +github.com/qiniu/x v1.11.9 h1:IfQNdeNcK43Q1+b/LdrcqmWjlhxq051YVBnua8J2qN8= +github.com/qiniu/x v1.11.9/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= diff --git a/modfile/gop_test.go b/modfile/gop_test.go index 12dc526..61afc74 100644 --- a/modfile/gop_test.go +++ b/modfile/gop_test.go @@ -20,6 +20,7 @@ import ( "path/filepath" "testing" + "github.com/qiniu/x/errors" "golang.org/x/mod/modfile" ) @@ -224,7 +225,7 @@ register - classfile .gmx .spx github.com/goplus/spx math classfile .gmx .spx github.com/goplus/spx math `) - doTestParseErr(t, `gop.mod:2: usage: classfile projExt workExt [classFilePkgPath ...]`, ` + doTestParseErr(t, `gop.mod:2: usage: classfile projExt workExt classFilePkgPath ...`, ` classfile .gmx .spx `) doTestParseErr(t, `gop.mod:2: ext . invalid: invalid ext format`, ` @@ -247,12 +248,12 @@ go 1.x func doTestParseErr(t *testing.T, errMsg string, gopmod string) { t.Run(errMsg, func(t *testing.T) { _, err := Parse("gop.mod", []byte(gopmod), nil) - if err == nil { + if err == nil || err.Error() == "" { t.Fatal("Parse: no error?") return } - if err.Error() != errMsg { - t.Error("Parse got:", err, "\nExpected:", errMsg) + if errRet := errors.Summary(err); errRet != errMsg { + t.Error("Parse got:", errRet, "\nExpected:", errMsg) } }) } diff --git a/modfile/rule.go b/modfile/rule.go index f03ddbd..a0b591d 100644 --- a/modfile/rule.go +++ b/modfile/rule.go @@ -132,7 +132,7 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (parse func (f *File) parseVerb(errs *ErrorList, verb string, line *Line, args []string, strict bool) { wrapModPathError := func(modPath string, err error) { - *errs = append(*errs, Error{ + errs.Add(&Error{ Filename: f.Syntax.Name, Pos: line.Start, ModPath: modPath, @@ -141,7 +141,7 @@ func (f *File) parseVerb(errs *ErrorList, verb string, line *Line, args []string }) } wrapError1 := func(err error) { - *errs = append(*errs, Error{ + errs.Add(&Error{ Filename: f.Syntax.Name, Pos: line.Start, Err: err, @@ -403,8 +403,22 @@ func (e *InvalidExtError) Error() string { func (e *InvalidExtError) Unwrap() error { return e.Err } -type ErrorList = modfile.ErrorList -type Error = modfile.Error +type ErrorList = errors.List +type Error modfile.Error + +func (p *Error) Error() string { + return (*modfile.Error)(p).Error() +} + +func (p *Error) Unwrap() error { + return p.Err +} + +func (p *Error) Summary() string { + cpy := *(*modfile.Error)(p) + cpy.Err = errors.New(errors.Summary(p.Unwrap())) + return cpy.Error() +} // -----------------------------------------------------------------------------