X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=ifchange.go;h=8a4677597aa2473f0716699565ef52e7dd6458ed;hb=f46d3947c65ccecd738a83bdd168cd9149c63a3d;hp=b3df3a8a34881bdffc45ff58f3e545358b6789cc;hpb=f1289f31868268ed25a2b0fd13d55fb2a239fd18;p=goredo.git diff --git a/ifchange.go b/ifchange.go index b3df3a8..8a46775 100644 --- a/ifchange.go +++ b/ifchange.go @@ -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() {