From fed124f1460226ab037657bac5717bdb49bf6b78 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Tue, 17 Jan 2023 11:46:33 +0300 Subject: [PATCH] Fix simultaneous duplicate always-ed target run --- doc/news.texi | 7 ++++++ ifchange.go | 12 +++++++---- t/goredo-double-consideration.t | 38 +++++++++++++++++++++++++++++++++ usage.go | 2 +- 4 files changed, 54 insertions(+), 5 deletions(-) create mode 100755 t/goredo-double-consideration.t diff --git a/doc/news.texi b/doc/news.texi index 9786d10..a5b5b35 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -2,6 +2,13 @@ @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 dc5b9da..cbf1c05 100644 --- a/ifchange.go +++ b/ifchange.go @@ -98,7 +98,7 @@ func buildDependants(tgts []string) map[string]struct{} { } } if len(seen) == 0 { - return nil + return seen } levelOrig := Level @@ -135,17 +135,18 @@ func buildDependants(tgts []string) map[string]struct{} { 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 @@ func ifchange(tgts []string, forced, traced bool) (bool, error) { } 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 0000000..b300245 --- /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 <