]> Cypherpunks.ru repositories - goredo.git/blobdiff - ifchange.go
Cache already parsed .rec during collectDeps
[goredo.git] / ifchange.go
index b3df3a8a34881bdffc45ff58f3e545358b6789cc..8a4677597aa2473f0716699565ef52e7dd6458ed 100644 (file)
@@ -28,8 +28,13 @@ func collectDeps(
        level int,
        deps map[string]map[string]struct{},
        includeSrc bool,
+       seen map[string]struct{},
 ) []string {
        cwd, tgt := cwdAndTgt(path.Join(cwd, tgtOrig))
+       tgtFull := path.Join(cwd, tgt)
+       if _, ok := seen[tgtFull]; ok {
+               return nil
+       }
        depPath := path.Join(cwd, RedoDir, tgt+DepSuffix)
        fdDep, err := os.Open(depPath)
        if err != nil {
@@ -40,6 +45,7 @@ func collectDeps(
        if err != nil {
                return nil
        }
+       seen[tgtFull] = struct{}{}
        var alwayses []string
        returnReady := false
        tgtRel := cwdMustRel(cwd, tgt)
@@ -76,10 +82,8 @@ func collectDeps(
                                m[tgtRel] = struct{}{}
                                deps[depRel] = m
                        }
-                       alwayses = append(
-                               alwayses,
-                               collectDeps(cwd, dep, level+1, deps, includeSrc)...,
-                       )
+                       alwayses = append(alwayses,
+                               collectDeps(cwd, dep, level+1, deps, includeSrc, seen)...)
                }
        }
        return alwayses
@@ -90,8 +94,9 @@ func buildDependants(tgts []string) map[string]struct{} {
        tracef(CDebug, "collecting deps")
        seen := map[string]struct{}{}
        deps := map[string]map[string]struct{}{}
+       collectDepsSeen := make(map[string]struct{})
        for _, tgtInitial := range tgts {
-               for _, tgt := range collectDeps(Cwd, tgtInitial, 0, deps, false) {
+               for _, tgt := range collectDeps(Cwd, tgtInitial, 0, deps, false, collectDepsSeen) {
                        if tgt != tgtInitial {
                                seen[tgt] = struct{}{}
                        }
@@ -100,6 +105,7 @@ func buildDependants(tgts []string) map[string]struct{} {
        if len(seen) == 0 {
                return seen
        }
+       collectDepsSeen = nil
 
        levelOrig := Level
        defer func() {