}
if seen[modRoot] {
- return nil, nil, fmt.Errorf("path %s appears multiple times in workspace", modRoot)
+ return nil, nil, fmt.Errorf("error loading go.work:\n%s:%d: path %s appears multiple times in workspace", base.ShortPath(path), d.Syntax.Start.Line, modRoot)
}
seen[modRoot] = true
modRoots = append(modRoots, modRoot)
for _, g := range wf.Godebug {
if err := CheckGodebug("godebug", g.Key, g.Value); err != nil {
- return nil, nil, err
+ return nil, nil, fmt.Errorf("error loading go.work:\n%s:%d: %w", base.ShortPath(path), g.Syntax.Start.Line, err)
}
}
path = base.ShortPath(path) // use short path in any errors
workData, err := fsys.ReadFile(path)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("reading go.work: %w", err)
}
f, err := modfile.ParseWork(path, workData, nil)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("errors parsing go.work:\n%w", err)
}
if f.Go != nil && gover.Compare(f.Go.Version, gover.Local()) > 0 && cfg.CmdName != "work edit" {
base.Fatal(&gover.TooNewError{What: base.ShortPath(path), GoVersion: f.Go.Version})
var err error
workFile, modRoots, err = loadWorkFile(workFilePath)
if err != nil {
- return nil, fmt.Errorf("reading go.work: %w", err)
+ return nil, err
}
for _, modRoot := range modRoots {
sumFile := strings.TrimSuffix(modFilePath(modRoot), ".mod") + ".sum"
ok := true
for _, g := range f.Godebug {
if err := CheckGodebug("godebug", g.Key, g.Value); err != nil {
- errs = append(errs, fmt.Errorf("%s: %v", base.ShortPath(filepath.Dir(gomod)), err))
+ errs = append(errs, fmt.Errorf("error loading go.mod:\n%s:%d: %v", base.ShortPath(gomod), g.Syntax.Start.Line, err))
ok = false
}
}
--- /dev/null
+# Test case for #67623 in go.work files: make sure the errors are
+# printed on lines starting with file and line number so they
+# can be easily parsed by tools.
+
+cp go.work.repeated.txt go.work
+! go list
+stderr '^go.work:4: path .* appears multiple times in workspace$'
+
+cp go.work.badgodebug.txt go.work
+! go list
+stderr '^go.work:3: unknown godebug "foo"$'
+
+cp go.work.unparsable.txt go.work
+! go list
+stderr '^go.work:5: unknown directive: notadirective'
+
+cp go.work.firstlineerr.txt go.work
+! go list
+stderr '^go.work:1: unknown godebug "bar"$'
+
+cp go.work.firsterrlisted.txt go.work
+! go list
+stderr '^go.work:1: unknown godebug "baz"$'
+
+-- foo/go.mod --
+module example.com/foo
+-- go.work.repeated.txt --
+
+
+use foo
+use foo
+-- go.work.badgodebug.txt --
+
+
+godebug foo=1
+-- go.work.unparsable.txt --
+
+
+
+
+notadirective
+-- go.work.firstlineerr.txt --
+godebug bar=1
+-- go.work.firsterrlisted.txt --
+godebug baz=1
+godebug baz=1