doc/news.texi | 7 +++++++ ifchange.go | 12 ++++++++---- t/goredo-double-consideration.t | 38 ++++++++++++++++++++++++++++++++++++++ usage.go | 2 +- diff --git a/doc/news.texi b/doc/news.texi index 9aacb3966289cb4e5ef4e916b73f93eed1829f29f157345da594c9ebae5dc98b..3d0c0d80da7c2a6c3c50638686f144e01ab6dfa284631c0ef53d1d5156544d1b 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -2,6 +2,13 @@ @node News @cindex news @unnumbered News +@anchor{Release 1_29_0} +@section Release 1.29.0 +@itemize +@item + Fix possible error when two always-ed targets are run simultaneously. +@end itemize + @anchor{Release 1_28_0} @section Release 1.28.0 @itemize diff --git a/ifchange.go b/ifchange.go index acb58f19b1110e2a8d57ff7773bf0b2f479de5556aa134068c68625d116ab1ab..d71de4d260d5ac73a4db5d2ef4d5f7c5647aea88864423e0150a63d5e6b2832b 100644 --- a/ifchange.go +++ b/ifchange.go @@ -98,7 +98,7 @@ } } } if len(seen) == 0 { - return nil + return seen } levelOrig := Level @@ -135,17 +135,18 @@ } RebuildDeps: tracef(CDebug, "checking %d dependant targets: %v", len(queueSrc), queueSrc) - queue := []string{} + queue := map[string]struct{}{} for _, tgt := range queueSrc { for dep := range deps[tgt] { - queue = append(queue, dep) + queue[dep] = struct{}{} } } + tracef(CDebug, "building %d dependant targets: %v", len(queue), queue) errs = make(chan error, len(queue)) jobs := 0 queueSrc = []string{} - for _, tgt := range queue { + for tgt, _ := range queue { ood, err := isOODWithTrace(Cwd, tgt, 0, seen) if err != nil { tracef(CErr, "dependant error: %s, skipping dependants", err) @@ -196,6 +197,9 @@ defer jsAcquire("ifchange exiting") } defer Jobs.Wait() seen := buildDependants(tgts) + if seen == nil { + return false, nil + } oodTgtsClear() tracef(CDebug, "building %d targets: %v", len(tgts), tgts) jobs := 0 diff --git a/t/goredo-double-consideration.t b/t/goredo-double-consideration.t new file mode 100755 index 0000000000000000000000000000000000000000..837321b172834486b6d53b6415f8bb6b4e2cac3fc97ac38143fb4842897576b0 --- /dev/null +++ b/t/goredo-double-consideration.t @@ -0,0 +1,38 @@ +#!/bin/sh + +testname=`basename "$0"` +test_description="Do not fail if two always-ed targets run simultaneously" +. $SHARNESS_TEST_SRCDIR/sharness.sh +export REDO_TOP_DIR="`pwd`" REDO_NO_PROGRESS=1 + +echo redo-ifchange version.h > all.do +cat > version.h.do < "\$3" +redo-stamp <"\$3" +EOF +cat > version.do < "\$3" +redo-always +redo-stamp <"\$3" +EOF +cat > date.do <"\$3" +redo-always +redo-stamp <"\$3" +EOF +cat > version.h.in <