]> Cypherpunks.ru repositories - goredo.git/blobdiff - ifchange.go
Up to date recfile
[goredo.git] / ifchange.go
index a7fe9472372548644cff5c06867bc79b5160ebd9..1f2c38194934da44475e97e039fb73601536a5a0 100644 (file)
@@ -1,6 +1,6 @@
 /*
-goredo -- redo implementation on pure Go
-Copyright (C) 2020 Sergey Matveev <stargrave@stargrave.org>
+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
 it under the terms of the GNU General Public License as published by
@@ -83,18 +83,25 @@ func buildDependants(tgts []string) map[string]struct{} {
        trace(CDebug, "collecting deps")
        seen := map[string]struct{}{}
        deps := map[string]map[string]struct{}{}
-       for _, tgt := range tgts {
-               for _, tgt := range collectDeps(Cwd, tgt, 0, deps) {
-                       seen[tgt] = struct{}{}
+       for _, tgtInitial := range tgts {
+               for _, tgt := range collectDeps(Cwd, tgtInitial, 0, deps) {
+                       if tgt != tgtInitial {
+                               seen[tgt] = struct{}{}
+                       }
                }
        }
        if len(seen) == 0 {
                return nil
        }
 
+       levelOrig := Level
+       defer func() {
+               Level = levelOrig
+       }()
+       Level = 1
        trace(CDebug, "building %d alwayses: %v", len(seen), seen)
        errs := make(chan error, len(seen))
-       for tgt, _ := range seen {
+       for tgt := range seen {
                if err := runScript(tgt, errs, false); err != nil {
                        trace(CErr, "always run error: %s, skipping dependants", err)
                        return nil
@@ -107,28 +114,23 @@ func buildDependants(tgts []string) map[string]struct{} {
        Jobs.Wait()
        close(errs)
        if !ok {
-               trace(CDebug, "alwayses failed, skipping depdendants")
+               trace(CDebug, "alwayses failed, skipping dependants")
                return nil
        }
 
        queueSrc := make([]string, 0, len(seen))
-       for tgt, _ := range seen {
+       for tgt := range seen {
                queueSrc = append(queueSrc, tgt)
        }
        if len(queueSrc) == 0 {
                return seen
        }
-       levelOrig := Level
-       defer func() {
-               Level = levelOrig
-       }()
-       Level = 1
 
 RebuildDeps:
        trace(CDebug, "checking %d dependant targets: %v", len(queueSrc), queueSrc)
        queue := []string{}
        for _, tgt := range queueSrc {
-               for dep, _ := range deps[tgt] {
+               for dep := range deps[tgt] {
                        queue = append(queue, dep)
                }
        }
@@ -137,7 +139,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
@@ -174,6 +176,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))
@@ -181,12 +184,12 @@ func ifchange(tgts []string, forced, traced bool) (bool, error) {
        var err error
        for _, tgt := range tgts {
                if _, ok := seen[tgt]; ok {
-                       trace(CDebug, "%s was already build as a dependenant", tgt)
+                       trace(CDebug, "%s was already build as a dependant", tgt)
                        continue
                }
                ood = true
                if !forced {
-                       ood, err = isOOD(Cwd, tgt, 0, seen)
+                       ood, err = isOODWithTrace(Cwd, tgt, 0, seen)
                        if err != nil {
                                return false, err
                        }