}
}
if len(seen) == 0 {
- return nil
+ return seen
}
levelOrig := Level
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)
}
defer Jobs.Wait()
seen := buildDependants(tgts)
+ if seen == nil {
+ return false, nil
+ }
oodTgtsClear()
tracef(CDebug, "building %d targets: %v", len(tgts), tgts)
jobs := 0
--- /dev/null
+#!/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