From fc065e1408aa2e452699d1bae1a56af9fcc69bec Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Fri, 29 Sep 2023 22:42:51 +0300 Subject: [PATCH] Add information about error occurrence place --- buildlog.go | 28 ++++++++++++------------ cleanup.go | 20 ++++++++--------- dep.go | 8 +++---- depfix.go | 34 ++++++++++++++--------------- dot.go | 4 ++-- err.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++ ifchange.go | 4 ++-- main.go | 13 +++++++++++ ood.go | 8 +++---- run.go | 62 ++++++++++++++++++++++++++++++----------------------- sources.go | 4 ++-- targets.go | 8 +++---- 12 files changed, 163 insertions(+), 86 deletions(-) create mode 100644 err.go diff --git a/buildlog.go b/buildlog.go index a260867..3bf3ce0 100644 --- a/buildlog.go +++ b/buildlog.go @@ -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 { diff --git a/cleanup.go b/cleanup.go index 0f77997..26dbadc 100644 --- a/cleanup.go +++ b/cleanup.go @@ -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 5d602f5..88e2215 100644 --- 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 diff --git a/depfix.go b/depfix.go index 7ce7cb6..376c922 100644 --- 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 8f56731..b8c28b7 100644 --- 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 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 + +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 . +*/ + +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} +} diff --git a/ifchange.go b/ifchange.go index 8a46775..0b8d694 100644 --- a/ifchange.go +++ b/ifchange.go @@ -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 b54baad..f6304ac 100644 --- 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 2000f44..0c8d506 100644 --- 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 bb1efb0..90eb7e6 100644 --- 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)) diff --git a/sources.go b/sources.go index 040ea97..b7dcfd4 100644 --- a/sources.go +++ b/sources.go @@ -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"] diff --git a/targets.go b/targets.go index dca27f4..d7c4ebb 100644 --- a/targets.go +++ b/targets.go @@ -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() -- 2.44.0