From: Sergey Matveev Date: Sat, 30 Sep 2023 10:51:42 +0000 (+0300) Subject: Optimise reading of only Build metainformation X-Git-Tag: v2.0.0~33 X-Git-Url: http://www.git.cypherpunks.ru/?p=goredo.git;a=commitdiff_plain;h=10baafbc3ef7dd24ecdc18a008e59e5068c8eb39 Optimise reading of only Build metainformation --- diff --git a/dep.go b/dep.go index 18f5db6..4024519 100644 --- a/dep.go +++ b/dep.go @@ -155,6 +155,8 @@ type DepInfo struct { ifchanges []map[string]string } +var missingBuild = errors.New(".rec missing Build:") + func depRead(fdDep io.Reader) (*DepInfo, error) { r := recfile.NewReader(fdDep) m, err := r.NextMap() @@ -164,7 +166,7 @@ func depRead(fdDep io.Reader) (*DepInfo, error) { depInfo := DepInfo{} b := m["Build"] if b == "" { - return nil, errors.New(".rec missing Build:") + return nil, missingBuild } depInfo.build = b for { @@ -199,3 +201,21 @@ func depRead(fdDep io.Reader) (*DepInfo, error) { } return &depInfo, nil } + +func depReadBuild(pth string) (string, error) { + fd, err := os.Open(pth) + if err != nil { + return "", err + } + r := recfile.NewReader(fd) + m, err := r.NextMap() + fd.Close() + if err != nil { + return "", err + } + build := m["Build"] + if build == "" { + err = missingBuild + } + return build, err +} diff --git a/ood.go b/ood.go index 52be37b..4a284c6 100644 --- a/ood.go +++ b/ood.go @@ -96,16 +96,8 @@ func isSrc(cwd, tgt string) bool { 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 + build, err := depReadBuild(depPath) + return err != nil || build != BuildUUID } func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, error) { diff --git a/run.go b/run.go index dd41fbc..6bd7029 100644 --- a/run.go +++ b/run.go @@ -256,20 +256,14 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error { log.Fatal(err) } } - var depInfo *DepInfo - fdDep, err := os.Open(path.Join(redoDir, tgt+DepSuffix)) + build, err := depReadBuild(path.Join(redoDir, tgt+DepSuffix)) if err != nil { if errors.Is(err, fs.ErrNotExist) { err = errors.New("was not built: no .rec") } goto Finish } - defer fdDep.Close() - depInfo, err = depRead(fdDep) - if err != nil { - goto Finish - } - if depInfo.build != BuildUUID { + if build != BuildUUID { err = errors.New("was not built: build differs") } Finish: @@ -284,14 +278,10 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error { // Check if it was already built in parallel if !forced { - if fdDep, err := os.Open(path.Join(redoDir, tgt+DepSuffix)); err == nil { - depInfo, err := depRead(fdDep) - fdDep.Close() - if err == nil && depInfo.build == BuildUUID { - lockRelease() - errs <- nil - return nil - } + if build, err := depReadBuild(path.Join(redoDir, tgt+DepSuffix)); err == nil && build == BuildUUID { + lockRelease() + errs <- nil + return nil } }