package main
import (
- "bytes"
"errors"
"fmt"
"io"
OODCache = make(map[string]bool)
FileExistsCache = make(map[string]bool)
+ DepInfoCache = make(map[string]*DepInfo)
ErrMissingTarget = errors.New("invalid format of .rec: missing Target")
)
tracef(CDebug, "ood: %s%s -> cached: %v", indent, tgt, ood)
return ood, nil
}
- depInfo, err := depRead(tgt)
- if err != nil {
- if errors.Is(err, fs.ErrNotExist) {
- if isSrc(tgt) {
- ood = false
- tracef(CDebug, "ood: %s%s -> is source", indent, tgt)
- } else {
- ood = true
- tracef(CDebug, "ood: %s%s -> no dep: %s", indent, tgt, tgt.Dep())
- }
- OODCache[tgt.a] = ood
- return ood, nil
- }
+ depInfo := DepInfoCache[tgt.Dep()]
+ var err error
+ if depInfo == nil {
+ depInfo, err = depRead(tgt)
if err != nil {
- return true, TgtError{tgt, ErrLine(err)}
+ if errors.Is(err, fs.ErrNotExist) {
+ if isSrc(tgt) {
+ ood = false
+ tracef(CDebug, "ood: %s%s -> is source", indent, tgt)
+ } else {
+ ood = true
+ tracef(CDebug, "ood: %s%s -> no dep: %s", indent, tgt, tgt.Dep())
+ }
+ OODCache[tgt.a] = ood
+ return ood, nil
+ }
+ if err != nil {
+ return true, TgtError{tgt, ErrLine(err)}
+ }
}
+ DepInfoCache[tgt.Dep()] = depInfo
}
if depInfo.build == BuildUUID {
if err != nil {
return ood, TgtError{tgt, ErrLine(err)}
}
- if !bytes.Equal(dep.hash, hsh) {
+ if dep.hash != hsh {
tracef(CDebug, "ood: %s%s -> %s: hash differs", indent, tgt, dep.tgt)
ood = true
OODCache[dep.tgt.a] = ood