]> Cypherpunks.ru repositories - goredo.git/commitdiff
Fix simultaneous duplicate always-ed target run
authorSergey Matveev <stargrave@stargrave.org>
Tue, 17 Jan 2023 08:46:33 +0000 (11:46 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Tue, 17 Jan 2023 09:01:33 +0000 (12:01 +0300)
doc/news.texi
ifchange.go
t/goredo-double-consideration.t [new file with mode: 0755]
usage.go

index 9786d10bbb81901b6f92b35dd7e89013f22936c8..a5b5b35189ed525958a0407bdeb92ee660851a72 100644 (file)
@@ -2,6 +2,13 @@
 @cindex news
 @unnumbered 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
 @anchor{Release 1_28_0}
 @section Release 1.28.0
 @itemize
index dc5b9dafba8ecb6fe1284760886d510faff3f218..cbf1c05dbebb81014ad668903d2962c8a9f3fb0c 100644 (file)
@@ -98,7 +98,7 @@ func buildDependants(tgts []string) map[string]struct{} {
                }
        }
        if len(seen) == 0 {
                }
        }
        if len(seen) == 0 {
-               return nil
+               return seen
        }
 
        levelOrig := Level
        }
 
        levelOrig := Level
@@ -135,17 +135,18 @@ func buildDependants(tgts []string) map[string]struct{} {
 
 RebuildDeps:
        tracef(CDebug, "checking %d dependant targets: %v", len(queueSrc), queueSrc)
 
 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] {
        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{}
        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)
                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)
        }
        defer Jobs.Wait()
        seen := buildDependants(tgts)
+       if seen == nil {
+               return false, nil
+       }
        oodTgtsClear()
        tracef(CDebug, "building %d targets: %v", len(tgts), tgts)
        jobs := 0
        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 (executable)
index 0000000..b300245
--- /dev/null
@@ -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 <<EOF
+redo-ifchange date version version.h.in
+VERSION=\$(cat version)
+DATE=\$(cat date)
+cat "\$2".in |
+    sed -e "s/%%VERSION%%/\${VERSION}/g" \
+        -e "s/%%DATE%%/\${DATE}/g" \
+       > "\$3"
+redo-stamp <"\$3"
+EOF
+cat > version.do <<EOF
+git rev-parse --short HEAD > "\$3"
+redo-always
+redo-stamp <"\$3"
+EOF
+cat > date.do <<EOF
+date +'%Y%m%d_%H%M%S' >"\$3"
+redo-always
+redo-stamp <"\$3"
+EOF
+cat > version.h.in <<EOF
+#define PRJ_VERSION "%%VERSION%%"
+#define PRJ_BLDDATE "%%DATE%%"
+EOF
+
+test_expect_success "first run is successful" redo
+sleep 1
+test_expect_success "second run is successful" redo
+
+test_done
index 192761c8a3c76a5e92e25c158159e16f89647b5b..ec46d58e84f911e8259d2a21a9b90ad4eab99dd7 100644 (file)
--- a/usage.go
+++ b/usage.go
@@ -24,7 +24,7 @@ import (
 )
 
 const (
 )
 
 const (
-       Version  = "1.28.0"
+       Version  = "1.29.0"
        Warranty = `Copyright (C) 2020-2023 Sergey Matveev
 
 This program is free software: you can redistribute it and/or modify
        Warranty = `Copyright (C) 2020-2023 Sergey Matveev
 
 This program is free software: you can redistribute it and/or modify