"errors"
"fmt"
"io"
+ "log"
"os"
"path"
"path/filepath"
return true
}
+func isOODByBuildUUID(cwd, tgtOrig string) bool {
+ cwd, tgt := cwdAndTgt(path.Join(cwd, tgtOrig))
+ depPath := path.Join(cwd, RedoDir, tgt+DepSuffix)
+ fdDep, err := os.Open(depPath)
+ if err != nil {
+ return true
+ }
+ depInfo, err := depRead(fdDep)
+ fdDep.Close()
+ if err != nil || depInfo.build != BuildUUID {
+ return true
+ }
+ return false
+}
+
func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, error) {
indent := strings.Repeat(". ", level)
trace(CDebug, "ood: %s%s checking", indent, tgtOrig)
trace(CDebug, "ood: %s%s -> already built", indent, tgtOrig)
return false, nil
}
+ if _, err := os.Stat(path.Join(cwd, tgt)); err != nil && os.IsNotExist(err) {
+ trace(CDebug, "ood: %s%s -> non-existent", indent, tgtOrig)
+ return true, nil
+ }
ood := false
for _, dep := range depInfo.ifcreates {
}
theirInode, err := inodeFromRec(m)
if err != nil {
- return ood, TgtErr{tgtOrig, fmt.Errorf("invalid format of .rec: %v", err)}
+ return ood, TgtErr{tgtOrig, fmt.Errorf("invalid format of .rec: %w", err)}
}
theirHsh := m["Hash"]
trace(CDebug, "ood: %s%s -> %s: checking", indent, tgtOrig, dep)
}
_, ood := OODTgts[p]
if ood {
+ if !isOODByBuildUUID(cwd, tgtOrig) {
+ trace(
+ CDebug,
+ "ood: %s%s -> already built",
+ strings.Repeat(". ", level), tgtOrig,
+ )
+ return false, nil
+ }
trace(
CDebug,
"ood: %s%s true, external decision",
}
RecordOODTgt:
if err = unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_EX); err != nil {
- panic(err)
+ log.Fatalln(err)
}
if _, err = FdOODTgts.Seek(0, io.SeekEnd); err != nil {
- panic(err)
+ log.Fatalln(err)
}
if _, err := FdOODTgts.WriteString(p + "\x00"); err != nil {
- panic(err)
+ log.Fatalln(err)
}
unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_UN)
return true, nil
func oodTgtsClear() {
if err := unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_EX); err != nil {
- panic(err)
+ log.Fatalln(err)
}
if err := FdOODTgts.Truncate(0); err != nil {
- panic(err)
+ log.Fatalln(err)
}
unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_UN)
}