]> Cypherpunks.ru repositories - goredo.git/blobdiff - ifchange.go
redo-affects
[goredo.git] / ifchange.go
index 2108de291e022a61abdac05174d3436db99c6a87..0f430fdebd76741065215382cb76ee406690e3fe 100644 (file)
@@ -1,5 +1,5 @@
 /*
-goredo -- redo implementation on pure Go
+goredo -- djb's redo implementation on pure Go
 Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
 
 This program is free software: you can redistribute it and/or modify
@@ -27,6 +27,7 @@ func collectDeps(
        cwd, tgtOrig string,
        level int,
        deps map[string]map[string]struct{},
+       includeSrc bool,
 ) []string {
        cwd, tgt := cwdAndTgt(path.Join(cwd, tgtOrig))
        depPath := path.Join(cwd, RedoDir, tgt+DepSuffix)
@@ -60,7 +61,10 @@ func collectDeps(
                if dep == "" {
                        return alwayses
                }
-               if dep == tgt || isSrc(cwd, dep) {
+               if dep == tgt {
+                       continue
+               }
+               if !includeSrc && isSrc(cwd, dep) {
                        continue
                }
                if !returnReady {
@@ -68,11 +72,14 @@ func collectDeps(
                        if m, ok := deps[depRel]; ok {
                                m[tgtRel] = struct{}{}
                        } else {
-                               m = make(map[string]struct{}, 0)
+                               m = map[string]struct{}{}
                                m[tgtRel] = struct{}{}
                                deps[depRel] = m
                        }
-                       alwayses = append(alwayses, collectDeps(cwd, dep, level+1, deps)...)
+                       alwayses = append(
+                               alwayses,
+                               collectDeps(cwd, dep, level+1, deps, includeSrc)...,
+                       )
                }
        }
        return alwayses
@@ -84,7 +91,7 @@ func buildDependants(tgts []string) map[string]struct{} {
        seen := map[string]struct{}{}
        deps := map[string]map[string]struct{}{}
        for _, tgtInitial := range tgts {
-               for _, tgt := range collectDeps(Cwd, tgtInitial, 0, deps) {
+               for _, tgt := range collectDeps(Cwd, tgtInitial, 0, deps, false) {
                        if tgt != tgtInitial {
                                seen[tgt] = struct{}{}
                        }
@@ -139,7 +146,7 @@ RebuildDeps:
        jobs := 0
        queueSrc = []string{}
        for _, tgt := range queue {
-               ood, err := isOOD(Cwd, tgt, 0, seen)
+               ood, err := isOODWithTrace(Cwd, tgt, 0, seen)
                if err != nil {
                        trace(CErr, "dependant error: %s, skipping dependants", err)
                        return nil
@@ -176,6 +183,7 @@ func ifchange(tgts []string, forced, traced bool) (bool, error) {
        defer jsAcquire("ifchange exiting")
        defer Jobs.Wait()
        seen := buildDependants(tgts)
+       oodTgtsClear()
        trace(CDebug, "building %d targets: %v", len(tgts), tgts)
        jobs := 0
        errs := make(chan error, len(tgts))
@@ -188,7 +196,7 @@ func ifchange(tgts []string, forced, traced bool) (bool, error) {
                }
                ood = true
                if !forced {
-                       ood, err = isOOD(Cwd, tgt, 0, seen)
+                       ood, err = isOODWithTrace(Cwd, tgt, 0, seen)
                        if err != nil {
                                return false, err
                        }