]> Cypherpunks.ru repositories - goredo.git/commitdiff
Optimise reading of only Build metainformation
authorSergey Matveev <stargrave@stargrave.org>
Sat, 30 Sep 2023 10:51:42 +0000 (13:51 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sat, 30 Sep 2023 13:27:55 +0000 (16:27 +0300)
dep.go
ood.go
run.go

diff --git a/dep.go b/dep.go
index 18f5db6bcfb5c47ddb68977b98878477ba5f633f..40245196c4b7a7a649eeabdbbac6c2ac9fe2cbaf 100644 (file)
--- 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 52be37be889f5074fd987948b5fdd5e9fa7e2d08..4a284c6ceaf31db355b53890957473a06ec30cf5 100644 (file)
--- 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 dd41fbcc01927463f327d043321f828e22a9637f..6bd7029752d8fac0d13c6bb1a26e95c67c208953 100644 (file)
--- 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
                }
        }