From 0a29a4e4acb66979b3a580f3bb23986890aa673f Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sat, 23 Sep 2023 18:08:55 +0300 Subject: [PATCH] Immediately print out finished targets --- doc/news.texi | 2 ++ ifchange.go | 55 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/doc/news.texi b/doc/news.texi index fcd0d75..1013994 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -7,6 +7,8 @@ @itemize @item Fixed possible race when target can be built more than once. +@item + Print out finished targets much more quickly. @end itemize @anchor{Release 1_30_0} diff --git a/ifchange.go b/ifchange.go index 401574d..b3df3a8 100644 --- a/ifchange.go +++ b/ifchange.go @@ -108,18 +108,25 @@ func buildDependants(tgts []string) map[string]struct{} { Level = 1 tracef(CDebug, "building %d alwayses: %v", len(seen), seen) errs := make(chan error, len(seen)) + ok := true + okChecker := make(chan struct{}) + go func() { + for err := range errs { + ok = isOkRun(err) && ok + } + close(okChecker) + }() for tgt := range seen { if err := runScript(tgt, errs, false, false); err != nil { tracef(CErr, "always run error: %s, skipping dependants", err) + Jobs.Wait() + close(errs) return nil } } - ok := true - for i := 0; i < len(seen); i++ { - ok = isOkRun(<-errs) && ok - } Jobs.Wait() close(errs) + <-okChecker if !ok { tracef(CDebug, "alwayses failed, skipping dependants") return nil @@ -144,8 +151,15 @@ RebuildDeps: tracef(CDebug, "building %d dependant targets: %v", len(queue), queue) errs = make(chan error, len(queue)) + okChecker = make(chan struct{}) jobs := 0 queueSrc = []string{} + go func() { + for err := range errs { + ok = isOkRun(err) && ok + } + close(okChecker) + }() for tgt := range queue { ood, err := isOODWithTrace(Cwd, tgt, 0, seen) if err != nil { @@ -163,15 +177,13 @@ RebuildDeps: seen[tgt] = struct{}{} jobs++ } - for i := 0; i < jobs; i++ { - ok = isOkRun(<-errs) && ok - } + Jobs.Wait() + close(errs) + <-okChecker if !ok { tracef(CDebug, "dependants failed, skipping them") return nil } - Jobs.Wait() - close(errs) if jobs == 0 { return seen } @@ -195,17 +207,24 @@ func ifchange(tgts []string, forced, traced bool) (bool, error) { if !IsTopRedo { defer jsAcquire("ifchange exiting") } - defer Jobs.Wait() seen := buildDependants(tgts) if seen == nil { + Jobs.Wait() return false, nil } oodTgtsClear() tracef(CDebug, "building %d targets: %v", len(tgts), tgts) - jobs := 0 - errs := make(chan error, len(tgts)) var ood bool var err error + ok := true + okChecker := make(chan struct{}) + errs := make(chan error, len(tgts)) + go func() { + for err := range errs { + ok = isOkRun(err) && ok + } + close(okChecker) + }() for _, tgt := range tgts { if _, ok := seen[tgt]; ok { tracef(CDebug, "%s was already build as a dependant", tgt) @@ -215,6 +234,8 @@ func ifchange(tgts []string, forced, traced bool) (bool, error) { if !forced { ood, err = isOODWithTrace(Cwd, tgt, 0, seen) if err != nil { + Jobs.Wait() + close(errs) return false, err } } @@ -226,13 +247,13 @@ func ifchange(tgts []string, forced, traced bool) (bool, error) { continue } if err = runScript(tgt, errs, forced, traced); err != nil { + Jobs.Wait() + close(errs) return false, err } - jobs++ - } - ok := true - for ; jobs > 0; jobs-- { - ok = isOkRun(<-errs) && ok } + Jobs.Wait() + close(errs) + <-okChecker return ok, nil } -- 2.44.0