X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=ifchange.go;h=f89da48fc7d1dbe9b733c1e679fd8a4044760aa7;hb=fa0728d6bc790672982ba006961077371d2b552d;hp=9e39e7f7769b2e371526e3d15d9a008b079d9526;hpb=f8a8a335216a6ec9aa6119d473d2f6aeb43958ca;p=goredo.git diff --git a/ifchange.go b/ifchange.go index 9e39e7f..f89da48 100644 --- a/ifchange.go +++ b/ifchange.go @@ -1,6 +1,6 @@ /* -goredo -- redo implementation on pure Go -Copyright (C) 2020 Sergey Matveev +goredo -- djb's redo implementation on pure Go +Copyright (C) 2020-2021 Sergey Matveev 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,19 +83,26 @@ 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 { - if err := runScript(tgt, errs); err != nil { + 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) } } @@ -145,7 +147,7 @@ RebuildDeps: if !ood { continue } - if err := runScript(tgt, errs); err != nil { + if err := runScript(tgt, errs, false); err != nil { trace(CErr, "dependant error: %s, skipping dependants", err) return nil } @@ -169,7 +171,7 @@ RebuildDeps: goto RebuildDeps } -func ifchange(tgts []string, forced bool) (bool, error) { +func ifchange(tgts []string, forced, traced bool) (bool, error) { jsInit() defer jsAcquire("ifchange exiting") defer Jobs.Wait() @@ -181,7 +183,7 @@ func ifchange(tgts []string, forced 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 @@ -198,7 +200,7 @@ func ifchange(tgts []string, forced bool) (bool, error) { trace(CDebug, "%s is source, not redoing", tgt) continue } - if err = runScript(tgt, errs); err != nil { + if err = runScript(tgt, errs, traced); err != nil { return false, err } jobs++