]> Cypherpunks.ru repositories - goredo.git/commitdiff
Add information about error occurrence place
authorSergey Matveev <stargrave@stargrave.org>
Fri, 29 Sep 2023 19:42:51 +0000 (22:42 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sat, 30 Sep 2023 09:40:23 +0000 (12:40 +0300)
12 files changed:
buildlog.go
cleanup.go
dep.go
depfix.go
dot.go
err.go [new file with mode: 0644]
ifchange.go
main.go
ood.go
run.go
sources.go
targets.go

index a260867e8a5a7770fd830833fb2f6bcdcb7a8302..3bf3ce07f5bd0c4073d079b63d1a06253f13021c 100644 (file)
@@ -78,12 +78,12 @@ func init() {
 func parseBuildLogRec(dir, tgt string) (map[string][]string, error) {
        fd, err := os.Open(path.Join(dir, RedoDir, tgt+LogRecSuffix))
        if err != nil {
-               return nil, err
+               return nil, ErrLine(err)
        }
        r := recfile.NewReader(bufio.NewReader(fd))
        rec, err := r.NextMapWithSlice()
        fd.Close()
-       return rec, err
+       return rec, ErrLine(err)
 }
 
 func depthPrefix(depth int) string {
@@ -113,7 +113,7 @@ func showBuildLogSub(sub *BuildLogJob, depth int) error {
        }
        durationSec, durationNsec, err := durationToInts(sub.rec["Duration"][0])
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        if sub.exitCode > 0 {
                fmt.Printf(
@@ -144,7 +144,7 @@ func durationToInts(d string) (int64, int64, error) {
 func showBuildLogCmd(m map[string][]string, depth int) error {
        started, err := tai64n.Decode(m["Started"][0])
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        dp := depthPrefix(depth)
        fmt.Printf(
@@ -156,11 +156,11 @@ func showBuildLogCmd(m map[string][]string, depth int) error {
        }
        finished, err := tai64n.Decode(m["Finished"][0])
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        durationSec, durationNsec, err := durationToInts(m["Duration"][0])
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        fmt.Printf(
                "%s%sStarted:\t%s\n%s%sFinished:\t%s\n%s%sDuration:\t%d.%ds\n\n",
@@ -187,7 +187,7 @@ func showBuildLog(dir, tgt string, buildLogRec map[string][]string, depth int) e
        }
        fd, err := os.Open(path.Join(dirNormalized, RedoDir, tgtNormalized+LogSuffix))
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        if !*flagBuildLogRecursive {
                w := bufio.NewWriter(os.Stdout)
@@ -195,9 +195,9 @@ func showBuildLog(dir, tgt string, buildLogRec map[string][]string, depth int) e
                fd.Close()
                if err != nil {
                        w.Flush()
-                       return err
+                       return ErrLine(err)
                }
-               return w.Flush()
+               return ErrLine(w.Flush())
        }
        defer fd.Close()
        subs := make([]*BuildLogJob, 0, len(buildLogRec["Ifchange"]))
@@ -218,13 +218,13 @@ func showBuildLog(dir, tgt string, buildLogRec map[string][]string, depth int) e
                }
                started, err := tai64n.Decode(rec["Started"][0])
                if err != nil {
-                       return err
+                       return ErrLine(err)
                }
                var exitCode int
                if len(rec["ExitCode"]) > 0 {
                        exitCode, err = strconv.Atoi(rec["ExitCode"][0])
                        if err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                }
                subs = append(subs, &BuildLogJob{
@@ -248,13 +248,13 @@ func showBuildLog(dir, tgt string, buildLogRec map[string][]string, depth int) e
        for {
                if !scanner.Scan() {
                        if err = scanner.Err(); err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                        break
                }
                text = scanner.Text()
                if text[0] != '@' {
-                       return errors.New("unexpected non-TAI64Ned string")
+                       return ErrLine(errors.New("unexpected non-TAI64Ned string"))
                }
                sep = strings.IndexByte(text, byte(' '))
                if sep == -1 {
@@ -262,7 +262,7 @@ func showBuildLog(dir, tgt string, buildLogRec map[string][]string, depth int) e
                }
                t, err = tai64n.Decode(text[1:sep])
                if err != nil {
-                       return err
+                       return ErrLine(err)
                }
                for sub != nil && t.After(sub.started) {
                        if err = showBuildLogSub(sub, depth); err != nil {
index 0f779972fd8d8dfe4d6dec453bb06e2372e733d4..26dbadce23b7540e6267a862acffd40176f4a628 100644 (file)
@@ -51,7 +51,7 @@ func redoDirClean(root, what string) error {
        }
        dir, err := os.Open(root)
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        defer dir.Close()
        for {
@@ -60,7 +60,7 @@ func redoDirClean(root, what string) error {
                        if err == io.EOF {
                                break
                        }
-                       return err
+                       return ErrLine(err)
                }
                var pth string
                for _, entry := range entries {
@@ -72,7 +72,7 @@ func redoDirClean(root, what string) error {
                                        fmt.Println(pth)
                                        if !*DryRun {
                                                if err = os.Remove(pth); err != nil {
-                                                       return err
+                                                       return ErrLine(err)
                                                }
                                        }
                                }
@@ -81,7 +81,7 @@ func redoDirClean(root, what string) error {
                                        fmt.Println(pth)
                                        if !*DryRun {
                                                if err = os.Remove(pth); err != nil {
-                                                       return err
+                                                       return ErrLine(err)
                                                }
                                        }
                                }
@@ -90,7 +90,7 @@ func redoDirClean(root, what string) error {
                                        fmt.Println(pth)
                                        if !*DryRun {
                                                if err = os.Remove(pth); err != nil {
-                                                       return err
+                                                       return ErrLine(err)
                                                }
                                        }
                                }
@@ -109,7 +109,7 @@ func cleanupWalker(root, what string) error {
        }
        dir, err := os.Open(root)
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        defer dir.Close()
        for {
@@ -118,7 +118,7 @@ func cleanupWalker(root, what string) error {
                        if err == io.EOF {
                                break
                        }
-                       return err
+                       return ErrLine(err)
                }
                for _, entry := range entries {
                        pth := path.Join(root, entry.Name())
@@ -128,7 +128,7 @@ func cleanupWalker(root, what string) error {
                                        if what == CleanupFull {
                                                fmt.Println(pthRel)
                                                if !*DryRun {
-                                                       err = os.RemoveAll(pth)
+                                                       err = ErrLine(os.RemoveAll(pth))
                                                }
                                        } else {
                                                err = redoDirClean(pth, what)
@@ -137,7 +137,7 @@ func cleanupWalker(root, what string) error {
                                        strings.HasPrefix(entry.Name(), TmpPrefix) {
                                        fmt.Println(pthRel)
                                        if !*DryRun {
-                                               err = os.RemoveAll(pth)
+                                               err = ErrLine(os.RemoveAll(pth))
                                        }
                                } else {
                                        err = cleanupWalker(pth, what)
@@ -152,7 +152,7 @@ func cleanupWalker(root, what string) error {
                                fmt.Println(pthRel)
                                if !*DryRun {
                                        if err = os.Remove(pth); err != nil {
-                                               return err
+                                               return ErrLine(err)
                                        }
                                }
                        }
diff --git a/dep.go b/dep.go
index 5d602f52bc6d6900830d0a468ffb70db8ed32dd9..88e2215d89d498c2e0a8d9d8d31ee0f231d73f9a 100644 (file)
--- a/dep.go
+++ b/dep.go
@@ -90,7 +90,7 @@ func depWrite(fdDep *os.File, cwd, tgt, hsh string) error {
        tracef(CDebug, "ifchange: %s <- %s", fdDep.Name(), tgt)
        fd, err := os.Open(path.Join(cwd, tgt))
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        defer fd.Close()
        fi, err := fd.Stat()
@@ -107,7 +107,7 @@ func depWrite(fdDep *os.File, cwd, tgt, hsh string) error {
        if hsh == "" {
                hsh, err = fileHash(fd)
                if err != nil {
-                       return err
+                       return ErrLine(err)
                }
        }
        fields := []recfile.Field{
@@ -139,7 +139,7 @@ func depsWrite(fdDep *os.File, tgts []string) error {
                        panic(err)
                }
                if _, errStat := os.Stat(tgt); errStat == nil {
-                       err = depWrite(fdDep, tgtDir, tgtRel, "")
+                       err = ErrLine(depWrite(fdDep, tgtDir, tgtRel, ""))
                } else {
                        tracef(CDebug, "ifchange: %s <- %s (non-existing)", fdDep.Name(), tgtRel)
                        fields := []recfile.Field{
@@ -148,7 +148,7 @@ func depsWrite(fdDep *os.File, tgts []string) error {
                        }
                        inodeDummy := Inode{}
                        fields = append(fields, inodeDummy.RecfileFields()...)
-                       err = recfileWrite(fdDep, fields...)
+                       err = ErrLine(recfileWrite(fdDep, fields...))
                }
                if err != nil {
                        return err
index 7ce7cb68b8d1cb9c3348b45dc1bf33d3036211f0..376c9229ea5b98c1b538f013a6191dacac93027e 100644 (file)
--- a/depfix.go
+++ b/depfix.go
@@ -31,7 +31,7 @@ func depFix(root string) error {
        tracef(CDebug, "depfix: entering %s", root)
        dir, err := os.Open(root)
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        defer dir.Close()
        for {
@@ -40,7 +40,7 @@ func depFix(root string) error {
                        if err == io.EOF {
                                break
                        }
-                       return err
+                       return ErrLine(err)
                }
                for _, entry := range entries {
                        if entry.IsDir() {
@@ -58,7 +58,7 @@ func depFix(root string) error {
                if os.IsNotExist(err) {
                        return nil
                }
-               return err
+               return ErrLine(err)
        }
        defer dir.Close()
        redoDirChanged := false
@@ -68,7 +68,7 @@ func depFix(root string) error {
                        if err == io.EOF {
                                break
                        }
-                       return err
+                       return ErrLine(err)
                }
                for _, entry := range entries {
                        if !strings.HasSuffix(entry.Name(), DepSuffix) {
@@ -78,7 +78,7 @@ func depFix(root string) error {
                        fdDepPath := path.Join(redoDir, entry.Name())
                        fdDep, err := os.Open(fdDepPath)
                        if err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                        defer fdDep.Close()
                        r := recfile.NewReader(fdDep)
@@ -90,7 +90,7 @@ func depFix(root string) error {
                                        if errors.Is(err, io.EOF) {
                                                break
                                        }
-                                       return err
+                                       return ErrLine(err)
                                }
                                fieldses = append(fieldses, fields)
                                m := make(map[string]string, len(fields))
@@ -107,7 +107,7 @@ func depFix(root string) error {
                                tracef(CDebug, "depfix: checking %s/%s -> %s", root, entry.Name(), dep)
                                theirInode, err := inodeFromRec(m)
                                if err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                                theirHsh := m["Hash"]
                                fd, err := os.Open(path.Join(root, dep))
@@ -119,12 +119,12 @@ func depFix(root string) error {
                                                )
                                                continue
                                        }
-                                       return err
+                                       return ErrLine(err)
                                }
                                inode, err := inodeFromFileByFd(fd)
                                if err != nil {
                                        fd.Close()
-                                       return err
+                                       return ErrLine(err)
                                }
                                if inode.Size != theirInode.Size {
                                        tracef(
@@ -145,7 +145,7 @@ func depFix(root string) error {
                                hsh, err := fileHash(fd)
                                fd.Close()
                                if err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                                if hsh != theirHsh {
                                        tracef(
@@ -174,7 +174,7 @@ func depFix(root string) error {
                        redoDirChanged = true
                        fdDep, err = tempfile(redoDir, entry.Name())
                        if err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                        defer fdDep.Close()
                        tracef(
@@ -183,32 +183,32 @@ func depFix(root string) error {
                        )
                        w := recfile.NewWriter(fdDep)
                        if _, err := w.WriteFields(fieldses[0]...); err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                        fieldses = fieldses[1:]
                        for _, fields := range fieldses {
                                if _, err := w.RecordStart(); err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                                if _, err := w.WriteFields(fields...); err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                        }
                        if !NoSync {
                                if err = fdDep.Sync(); err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                        }
                        fdDep.Close()
                        if err = os.Rename(fdDep.Name(), fdDepPath); err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                        tracef(CRedo, "%s", fdDepPath)
                }
        }
        if redoDirChanged && !NoSync {
                if err = syncDir(redoDir); err != nil {
-                       return nil
+                       return err
                }
        }
        return nil
diff --git a/dot.go b/dot.go
index 8f5673108de3450848bdfad3370ed26958a1488b..b8c28b75346e8d451be77cceb1a8dbb521006adf 100644 (file)
--- a/dot.go
+++ b/dot.go
@@ -39,7 +39,7 @@ func dotWalker(data map[DotNodes]bool, tgtOrig string) (map[DotNodes]bool, error
        depPath := path.Join(cwd, RedoDir, tgt+DepSuffix)
        fdDep, err := os.Open(depPath)
        if err != nil {
-               return nil, err
+               return nil, ErrLine(err)
        }
        defer fdDep.Close()
        var dep string
@@ -50,7 +50,7 @@ func dotWalker(data map[DotNodes]bool, tgtOrig string) (map[DotNodes]bool, error
                        if errors.Is(err, io.EOF) {
                                break
                        }
-                       return nil, err
+                       return nil, ErrLine(err)
                }
                switch m["Type"] {
                case DepTypeIfcreate:
diff --git a/err.go b/err.go
new file mode 100644 (file)
index 0000000..9240a3e
--- /dev/null
+++ b/err.go
@@ -0,0 +1,56 @@
+/*
+goredo -- djb's redo implementation on pure Go
+Copyright (C) 2020-2023 Sergey Matveev <stargrave@stargrave.org>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, version 3 of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package main
+
+import (
+       "errors"
+       "fmt"
+       "runtime"
+)
+
+type ErrLineErr struct {
+       err      error
+       file     string
+       line     int
+       function string
+}
+
+func (err ErrLineErr) Error() string {
+       return fmt.Sprintf("%s:%d: %s: %s", err.file, err.line, err.function, err.err)
+}
+
+func (err ErrLineErr) Unwrap() error {
+       return err.err
+}
+
+func ErrLine(err error) error {
+       if err == nil {
+               return err
+       }
+       pc := make([]uintptr, 10)
+       n := runtime.Callers(2, pc)
+       pc = pc[:n]
+       frames := runtime.CallersFrames(pc)
+       frame, _ := frames.Next()
+       var errLine ErrLineErr
+       if errors.As(err, &errLine) {
+               errLine.function = frame.Function + "," + errLine.function
+               return errLine
+       }
+       return ErrLineErr{err, frame.File, frame.Line, frame.Function}
+}
index 8a4677597aa2473f0716699565ef52e7dd6458ed..0b8d694ff730023e71d4dcb2d3314fe84a5328b0 100644 (file)
@@ -242,7 +242,7 @@ func ifchange(tgts []string, forced, traced bool) (bool, error) {
                        if err != nil {
                                Jobs.Wait()
                                close(errs)
-                               return false, err
+                               return false, ErrLine(err)
                        }
                }
                if !ood {
@@ -255,7 +255,7 @@ func ifchange(tgts []string, forced, traced bool) (bool, error) {
                if err = runScript(tgt, errs, forced, traced); err != nil {
                        Jobs.Wait()
                        close(errs)
-                       return false, err
+                       return false, ErrLine(err)
                }
        }
        Jobs.Wait()
diff --git a/main.go b/main.go
index b54baadb1fe7e376d7e68eed57112d461e83e969..f6304aca8dd3b92c4d2a05bb77cc714ebd96842b 100644 (file)
--- a/main.go
+++ b/main.go
@@ -353,6 +353,7 @@ CmdSwitch:
                                path.Join(Cwd, tgt),
                        )
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                        err = ifcreate(fdDep, tgtRel)
@@ -392,18 +393,22 @@ CmdSwitch:
                var fdTmp *os.File
                fdTmp, err = os.CreateTemp("", "whichdo")
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                if err = os.Remove(fdTmp.Name()); err != nil {
+                       err = ErrLine(err)
                        break
                }
                cwd, tgt := cwdAndTgt(tgts[0])
                doFile, upLevels, err := findDo(fdTmp, cwd, tgt)
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                _, err = fdTmp.Seek(0, io.SeekStart)
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                r := recfile.NewReader(fdTmp)
@@ -413,6 +418,7 @@ CmdSwitch:
                                if errors.Is(err, io.EOF) {
                                        break
                                }
+                               err = ErrLine(err)
                                break CmdSwitch
                        }
                        fmt.Println(cwdMustRel(cwd, m["Target"]))
@@ -438,6 +444,7 @@ CmdSwitch:
                }
                tgts, err = targetsWalker(tgts)
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                sort.Strings(tgts)
@@ -451,6 +458,7 @@ CmdSwitch:
                var tgtsKnown []string
                tgtsKnown, err = targetsWalker([]string{Cwd})
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                deps := map[string]map[string]struct{}{}
@@ -481,6 +489,7 @@ CmdSwitch:
                for _, tgt := range tgts {
                        ood, err = isOOD(Cwd, tgt, 0, nil)
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                        if ood {
@@ -491,12 +500,14 @@ CmdSwitch:
                if tgtsWasEmpty {
                        tgts, err = targetsWalker([]string{Cwd})
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                }
                sort.Strings(tgts)
                var srcs []string
                srcs, err = sourcesWalker(tgts)
+               err = ErrLine(err)
                sort.Strings(srcs)
                for _, src := range srcs {
                        fmt.Println(src)
@@ -508,12 +519,14 @@ CmdSwitch:
                for _, tgt := range tgts {
                        inode, err = inodeFromFileByPath(tgt)
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                        err = recfileWrite(os.Stdout, append(
                                []recfile.Field{{Name: "Target", Value: tgt}},
                                inode.RecfileFields()...)...)
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                }
diff --git a/ood.go b/ood.go
index 2000f4405ab499d0f7efe04d6de38642fd182ec4..0c8d506b8ada12b827a8d7c7fba9dae028fbcb5a 100644 (file)
--- a/ood.go
+++ b/ood.go
@@ -150,7 +150,7 @@ func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, erro
        depInfo, err := depRead(fdDep)
        fdDep.Close()
        if err != nil {
-               return true, TgtError{tgtOrig, err}
+               return true, TgtError{tgtOrig, ErrLine(err)}
        }
 
        if depInfo.build == BuildUUID {
@@ -200,7 +200,7 @@ func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, erro
                                OODCache[path.Join(cwd, dep)] = ood
                                goto Done
                        }
-                       return ood, TgtError{tgtOrig, err}
+                       return ood, TgtError{tgtOrig, ErrLine(err)}
                }
 
                if inode.Size != theirInode.Size {
@@ -215,12 +215,12 @@ func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, erro
                        tracef(CDebug, "ood: %s%s -> %s: inode differs", indent, tgtOrig, dep)
                        fd, err := os.Open(path.Join(cwd, dep))
                        if err != nil {
-                               return ood, TgtError{tgtOrig, err}
+                               return ood, TgtError{tgtOrig, ErrLine(err)}
                        }
                        hsh, err := fileHash(fd)
                        fd.Close()
                        if err != nil {
-                               return ood, TgtError{tgtOrig, err}
+                               return ood, TgtError{tgtOrig, ErrLine(err)}
                        }
                        if theirHsh != hsh {
                                tracef(CDebug, "ood: %s%s -> %s: hash differs", indent, tgtOrig, dep)
diff --git a/run.go b/run.go
index bb1efb0ad2526d4e7e6f05c2881dea55429ee2e8..90eb7e6ec1669c996efb04dd7a2c837b46cb2203 100644 (file)
--- a/run.go
+++ b/run.go
@@ -138,7 +138,7 @@ func isModified(cwd, redoDir, tgt string) (bool, *Inode, string, error) {
                if os.IsNotExist(err) {
                        return false, nil, "", nil
                }
-               return false, nil, "", err
+               return false, nil, "", ErrLine(err)
        }
        defer fdDep.Close()
        r := recfile.NewReader(fdDep)
@@ -151,7 +151,7 @@ func isModified(cwd, redoDir, tgt string) (bool, *Inode, string, error) {
                        if errors.Is(err, io.EOF) {
                                break
                        }
-                       return false, nil, "", err
+                       return false, nil, "", ErrLine(err)
                }
                if m["Type"] != DepTypeIfchange || m["Target"] != tgt {
                        continue
@@ -161,11 +161,11 @@ func isModified(cwd, redoDir, tgt string) (bool, *Inode, string, error) {
                        if os.IsNotExist(err) {
                                return false, nil, "", nil
                        }
-                       return false, nil, "", err
+                       return false, nil, "", ErrLine(err)
                }
                theirInode, err := inodeFromRec(m)
                if err != nil {
-                       return false, nil, "", err
+                       return false, nil, "", ErrLine(err)
                }
                hshPrev = m["Hash"]
                modified = !ourInode.Equals(theirInode)
@@ -188,7 +188,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
        cwd, tgt := cwdAndTgt(tgtOrig)
        redoDir := path.Join(cwd, RedoDir)
        if err := mkdirs(redoDir); err != nil {
-               return TgtError{tgtOrig, err}
+               return TgtError{tgtOrig, ErrLine(err)}
        }
 
        shCtx := fmt.Sprintf("sh: %s: cwd:%s", tgtOrig, cwd)
@@ -207,7 +207,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                os.FileMode(0666),
        )
        if err != nil {
-               return TgtError{tgtOrig, err}
+               return TgtError{tgtOrig, ErrLine(err)}
        }
        flock := unix.Flock_t{
                Type:   unix.F_WRLCK,
@@ -227,7 +227,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
        if err = unix.FcntlFlock(fdLock.Fd(), unix.F_SETLK, &flock); err != nil {
                if uintptr(err.(syscall.Errno)) != uintptr(unix.EAGAIN) {
                        fdLock.Close()
-                       return TgtError{tgtOrig, err}
+                       return TgtError{tgtOrig, ErrLine(err)}
                }
                Jobs.Add(1)
                if err = unix.FcntlFlock(fdLock.Fd(), unix.F_GETLK, &flock); err != nil {
@@ -318,7 +318,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
        fdDep, err := tempfile(redoDir, tgt+DepSuffix)
        if err != nil {
                lockRelease()
-               return TgtError{tgtOrig, err}
+               return TgtError{tgtOrig, ErrLine(err)}
        }
        fdDepPath := fdDep.Name()
        cleanup := func() {
@@ -330,14 +330,14 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                recfile.Field{Name: "Build", Value: BuildUUID},
        ); err != nil {
                cleanup()
-               return TgtError{tgtOrig, err}
+               return TgtError{tgtOrig, ErrLine(err)}
        }
 
        // Find .do
        doFile, upLevels, err := findDo(fdDep, cwd, tgt)
        if err != nil {
                cleanup()
-               return TgtError{tgtOrig, err}
+               return TgtError{tgtOrig, ErrLine(err)}
        }
        if doFile == "" {
                cleanup()
@@ -365,7 +365,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
 
        if err = depWrite(fdDep, cwdOrig, doFileRelPath, ""); err != nil {
                cleanup()
-               return TgtError{tgtOrig, err}
+               return TgtError{tgtOrig, ErrLine(err)}
        }
        fdDep.Close()
        tracef(CWait, "%s", runErr.Name())
@@ -390,7 +390,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
        fdStdout, err := tempfile(cwdOrig, tgt)
        if err != nil {
                cleanup()
-               return TgtError{tgtOrig, err}
+               return TgtError{tgtOrig, ErrLine(err)}
        }
        stdoutPath := fdStdout.Name()
        fdStdout.Close()
@@ -452,7 +452,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                )
                if err != nil {
                        cleanup()
-                       return TgtError{tgtOrig, err}
+                       return TgtError{tgtOrig, ErrLine(err)}
                }
        }
        tracef(CDebug, "%s", shCtx)
@@ -563,11 +563,13 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                                        var depInfo *DepInfo
                                        fdDep, err := os.Open(fdDepPath)
                                        if err != nil {
+                                               err = ErrLine(err)
                                                goto Err
                                        }
                                        depInfo, err = depRead(fdDep)
                                        fdDep.Close()
                                        if err != nil {
+                                               err = ErrLine(err)
                                                goto Err
                                        }
                                        for _, dep := range depInfo.ifchanges {
@@ -578,9 +580,10 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                                        }
                                        _, err = recfile.NewWriter(w).WriteFields(fields...)
                                        if err != nil {
+                                               err = ErrLine(err)
                                                goto Err
                                        }
-                                       err = w.Flush()
+                                       err = ErrLine(w.Flush())
                                Err:
                                        if err != nil {
                                                log.Print(err)
@@ -698,7 +701,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                // Does it produce both stdout and tmp?
                fiStdout, err := os.Stat(fdStdout.Name())
                if err != nil {
-                       runErr.Err = err
+                       runErr.Err = ErrLine(err)
                        errs <- runErr
                        return
                }
@@ -712,7 +715,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                        }
                        tmpExists = true
                } else if !os.IsNotExist(err) {
-                       runErr.Err = err
+                       runErr.Err = ErrLine(err)
                        errs <- runErr
                        return
                }
@@ -722,6 +725,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                if tmpExists {
                        fd, err = os.Open(tmpPath)
                        if err != nil {
+                               err = ErrLine(err)
                                goto Finish
                        }
                        defer fd.Close()
@@ -734,6 +738,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                        os.Remove(path.Join(cwdOrig, tgt))
                        err = ifcreate(fdDep, tgt)
                        if err != nil {
+                               err = ErrLine(err)
                                goto Finish
                        }
                } else {
@@ -741,29 +746,31 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                        if hshPrev != "" {
                                _, err = fd.Seek(0, io.SeekStart)
                                if err != nil {
+                                       err = ErrLine(err)
                                        goto Finish
                                }
                                hsh, err = fileHash(fd)
                                if err != nil {
+                                       err = ErrLine(err)
                                        goto Finish
                                }
                                if hsh == hshPrev {
                                        tracef(CDebug, "%s has same hash, not renaming", tgtOrig)
-                                       err = os.Remove(fd.Name())
+                                       err = ErrLine(os.Remove(fd.Name()))
                                        if err != nil {
                                                goto Finish
                                        }
-                                       err = os.Chtimes(path.Join(cwdOrig, tgt), finished, finished)
+                                       err = ErrLine(os.Chtimes(path.Join(cwdOrig, tgt), finished, finished))
                                        if err != nil {
                                                goto Finish
                                        }
                                        if !NoSync {
-                                               err = syncDir(cwdOrig)
+                                               err = ErrLine(syncDir(cwdOrig))
                                                if err != nil {
                                                        goto Finish
                                                }
                                        }
-                                       err = depWrite(fdDep, cwdOrig, tgt, hshPrev)
+                                       err = ErrLine(depWrite(fdDep, cwdOrig, tgt, hshPrev))
                                        if err != nil {
                                                goto Finish
                                        }
@@ -771,22 +778,22 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                                }
                        }
                        if !NoSync {
-                               err = fd.Sync()
+                               err = ErrLine(fd.Sync())
                                if err != nil {
                                        goto Finish
                                }
                        }
-                       err = os.Rename(fd.Name(), path.Join(cwdOrig, tgt))
+                       err = ErrLine(os.Rename(fd.Name(), path.Join(cwdOrig, tgt)))
                        if err != nil {
                                goto Finish
                        }
                        if !NoSync {
-                               err = syncDir(cwdOrig)
+                               err = ErrLine(syncDir(cwdOrig))
                                if err != nil {
                                        goto Finish
                                }
                        }
-                       err = depWrite(fdDep, cwdOrig, tgt, hsh)
+                       err = ErrLine(depWrite(fdDep, cwdOrig, tgt, hsh))
                        if err != nil {
                                goto Finish
                        }
@@ -795,18 +802,18 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
        RecCommit:
                // Commit .rec
                if !NoSync {
-                       err = fdDep.Sync()
+                       err = ErrLine(fdDep.Sync())
                        if err != nil {
                                goto Finish
                        }
                }
                fdDepPath = path.Join(redoDir, tgt+DepSuffix)
-               err = os.Rename(fdDep.Name(), fdDepPath)
+               err = ErrLine(os.Rename(fdDep.Name(), fdDepPath))
                if err != nil {
                        goto Finish
                }
                if !NoSync {
-                       err = syncDir(redoDir)
+                       err = ErrLine(syncDir(redoDir))
                        if err != nil {
                                goto Finish
                        }
@@ -818,6 +825,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
                        depInfo, err := depRead(fdDepR)
                        fdDepR.Close()
                        if err != nil {
+                               err = ErrLine(err)
                                goto Finish
                        }
                        ifchangeSeen := make(map[string]struct{}, len(depInfo.ifchanges))
index 040ea97bfb4c4996283c8387bbac63cae3d60d69..b7dcfd473d0add22302afd8560972b7000feb64c 100644 (file)
@@ -37,12 +37,12 @@ func sourcesWalker(tgts []string) ([]string, error) {
                        if os.IsNotExist(err) {
                                continue
                        }
-                       return nil, err
+                       return nil, ErrLine(err)
                }
                depInfo, err := depRead(fdDep)
                fdDep.Close()
                if err != nil {
-                       return nil, err
+                       return nil, ErrLine(err)
                }
                for _, m := range depInfo.ifchanges {
                        depTgt := m["Target"]
index dca27f4e7880626a383b56852942f5435e890997..d7c4ebbc49b6a62a55650fbfe400db373301fa77 100644 (file)
@@ -32,7 +32,7 @@ func targetsCollect(root string, tgts map[string]struct{}) error {
        }
        dir, err := os.Open(root)
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        defer dir.Close()
        for {
@@ -41,7 +41,7 @@ func targetsCollect(root string, tgts map[string]struct{}) error {
                        if err == io.EOF {
                                break
                        }
-                       return err
+                       return ErrLine(err)
                }
                for _, entry := range entries {
                        if !entry.IsDir() {
@@ -51,12 +51,12 @@ func targetsCollect(root string, tgts map[string]struct{}) error {
                        if entry.Name() == RedoDir {
                                redoDir, err := os.Open(pth)
                                if err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                                redoEntries, err := redoDir.ReadDir(0)
                                redoDir.Close()
                                if err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                                for _, redoEntry := range redoEntries {
                                        name := redoEntry.Name()