]> Cypherpunks.ru repositories - goredo.git/commitdiff
Import tests from apenwarr/redo and redo.sh v0.6.0
authorSergey Matveev <stargrave@stargrave.org>
Tue, 15 Dec 2020 11:10:09 +0000 (14:10 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Tue, 15 Dec 2020 13:07:06 +0000 (16:07 +0300)
167 files changed:
README
t/.gitignore [deleted file]
t/apenwarr-000-set-minus-e.t [new symlink]
t/apenwarr-010-jobserver.t [new symlink]
t/apenwarr-100-args.t [new symlink]
t/apenwarr-101-atime.t [new symlink]
t/apenwarr-102-empty.t [new symlink]
t/apenwarr-103-unicode.t [new symlink]
t/apenwarr-104-space.t [new symlink]
t/apenwarr-105-sympath.t [new symlink]
t/apenwarr-110-compile.t [new symlink]
t/apenwarr-111-example.t [new symlink]
t/apenwarr-120-defaults-flat.t [new symlink]
t/apenwarr-121-defaults-nested.t [new symlink]
t/apenwarr-122-defaults-parent.t [new symlink]
t/apenwarr-130-mode.t [new symlink]
t/apenwarr/000-set-minus-e/.gitignore [new file with mode: 0644]
t/apenwarr/000-set-minus-e/all.do [new file with mode: 0644]
t/apenwarr/000-set-minus-e/clean.do [new file with mode: 0644]
t/apenwarr/000-set-minus-e/fatal.do [new file with mode: 0644]
t/apenwarr/010-jobserver/.gitignore [new file with mode: 0644]
t/apenwarr/010-jobserver/all.do [new file with mode: 0644]
t/apenwarr/010-jobserver/clean.do [new file with mode: 0644]
t/apenwarr/010-jobserver/default.spin.do [new file with mode: 0644]
t/apenwarr/010-jobserver/default.x.do [new file with mode: 0644]
t/apenwarr/010-jobserver/first.do [new file with mode: 0644]
t/apenwarr/010-jobserver/second.do [new file with mode: 0644]
t/apenwarr/010-jobserver/serialtest.do [new file with mode: 0644]
t/apenwarr/100-args/.gitignore [new file with mode: 0644]
t/apenwarr/100-args/all.do [new file with mode: 0644]
t/apenwarr/100-args/clean.do [new file with mode: 0644]
t/apenwarr/100-args/default.args.do [new file with mode: 0644]
t/apenwarr/100-args/noargs/all.do [new file with mode: 0644]
t/apenwarr/100-args/noargs/run.do [new file with mode: 0644]
t/apenwarr/100-args/passfail.do [new file with mode: 0644]
t/apenwarr/100-args/passfailtest.do [new file with mode: 0644]
t/apenwarr/100-args/test2.args.do [new file with mode: 0644]
t/apenwarr/101-atime/.gitignore [new file with mode: 0644]
t/apenwarr/101-atime/all.do [new file with mode: 0644]
t/apenwarr/101-atime/atime.do [new file with mode: 0644]
t/apenwarr/101-atime/atime2.do [new file with mode: 0644]
t/apenwarr/101-atime/clean.do [new file with mode: 0644]
t/apenwarr/101-atime/tick.py [new file with mode: 0644]
t/apenwarr/102-empty/.gitignore [new file with mode: 0644]
t/apenwarr/102-empty/all.do [new file with mode: 0644]
t/apenwarr/102-empty/blank.do [new file with mode: 0644]
t/apenwarr/102-empty/clean.do [new file with mode: 0644]
t/apenwarr/102-empty/silencetest.do [new file with mode: 0644]
t/apenwarr/102-empty/touchtest.do [new file with mode: 0644]
t/apenwarr/103-unicode/all.do [new file with mode: 0644]
t/apenwarr/103-unicode/clean.do [new file with mode: 0644]
t/apenwarr/103-unicode/unicode.do [new file with mode: 0644]
t/apenwarr/104-space/all.do [new file with mode: 0644]
t/apenwarr/104-space/clean.do [new file with mode: 0644]
t/apenwarr/104-space/space dir/.gitignore [new file with mode: 0644]
t/apenwarr/104-space/space dir/clean.do [new file with mode: 0644]
t/apenwarr/104-space/space dir/space 2.do [new file with mode: 0644]
t/apenwarr/104-space/space dir/space file.do [new file with mode: 0644]
t/apenwarr/104-space/space dir/test.do [new file with mode: 0644]
t/apenwarr/105-sympath/.gitignore [new file with mode: 0644]
t/apenwarr/105-sympath/all.do [new file with mode: 0644]
t/apenwarr/105-sympath/clean.do [new file with mode: 0644]
t/apenwarr/105-sympath/default.dyn.do [new file with mode: 0644]
t/apenwarr/110-compile/.gitignore [new file with mode: 0644]
t/apenwarr/110-compile/CC.do [new file with mode: 0644]
t/apenwarr/110-compile/LD.do [new file with mode: 0644]
t/apenwarr/110-compile/all.do [new file with mode: 0644]
t/apenwarr/110-compile/bellow.do [new file with mode: 0644]
t/apenwarr/110-compile/clean.do [new file with mode: 0644]
t/apenwarr/110-compile/hello.c [new file with mode: 0644]
t/apenwarr/110-compile/hello.do [new file with mode: 0644]
t/apenwarr/110-compile/hello.o.do [new file with mode: 0644]
t/apenwarr/110-compile/yellow.do [new file with mode: 0644]
t/apenwarr/110-compile/yellow.o.do [new file with mode: 0644]
t/apenwarr/111-example/.gitignore [new file with mode: 0644]
t/apenwarr/111-example/CC.do [new file with mode: 0644]
t/apenwarr/111-example/Makefile [new file with mode: 0644]
t/apenwarr/111-example/all.do [new file with mode: 0644]
t/apenwarr/111-example/clean.do [new file with mode: 0644]
t/apenwarr/111-example/config.sh [new file with mode: 0644]
t/apenwarr/111-example/default.o.do [new file with mode: 0644]
t/apenwarr/111-example/hello.do [new file with mode: 0644]
t/apenwarr/111-example/main.c [new file with mode: 0644]
t/apenwarr/111-example/mystr.c [new file with mode: 0644]
t/apenwarr/111-example/mystr.h [new file with mode: 0644]
t/apenwarr/120-defaults-flat/.gitignore [new file with mode: 0644]
t/apenwarr/120-defaults-flat/all.do [new file with mode: 0644]
t/apenwarr/120-defaults-flat/c.c.c.b.b.a [new file with mode: 0644]
t/apenwarr/120-defaults-flat/c.do [new file with mode: 0644]
t/apenwarr/120-defaults-flat/clean.do [new file with mode: 0644]
t/apenwarr/120-defaults-flat/default.b.do [new file with mode: 0644]
t/apenwarr/120-defaults-flat/default.c.c.do [new file with mode: 0644]
t/apenwarr/120-defaults-flat/default.c.do [new file with mode: 0644]
t/apenwarr/120-defaults-flat/default.do [new file with mode: 0644]
t/apenwarr/121-defaults-nested/.gitignore [new file with mode: 0644]
t/apenwarr/121-defaults-nested/a/b/default.y.z.do [new file with mode: 0644]
t/apenwarr/121-defaults-nested/a/b/file.x.y.z.do [new file with mode: 0644]
t/apenwarr/121-defaults-nested/a/d/default.do [new file with mode: 0644]
t/apenwarr/121-defaults-nested/a/default.x.y.z.do [new file with mode: 0644]
t/apenwarr/121-defaults-nested/a/default.z.do [new file with mode: 0644]
t/apenwarr/121-defaults-nested/all.do [new file with mode: 0644]
t/apenwarr/121-defaults-nested/clean.do [new file with mode: 0644]
t/apenwarr/121-defaults-nested/default.do [new file with mode: 0644]
t/apenwarr/121-defaults-nested/test.do [new file with mode: 0644]
t/apenwarr/122-defaults-parent/.gitignore [new file with mode: 0644]
t/apenwarr/122-defaults-parent/all.do [new file with mode: 0644]
t/apenwarr/122-defaults-parent/clean.do [new file with mode: 0644]
t/apenwarr/122-defaults-parent/inner/default.do [new file with mode: 0644]
t/apenwarr/122-defaults-parent/inner2/default.do [new file with mode: 0644]
t/apenwarr/122-defaults-parent/x/file [new file with mode: 0644]
t/apenwarr/130-mode/.gitignore [new file with mode: 0644]
t/apenwarr/130-mode/all.do [new file with mode: 0644]
t/apenwarr/130-mode/clean.do [new file with mode: 0644]
t/apenwarr/130-mode/mode1.do [new file with mode: 0644]
t/apenwarr/README [new file with mode: 0644]
t/apenwarr/all.do [new file with mode: 0644]
t/apenwarr/clean.do [new file with mode: 0644]
t/apenwarr/sleep [new file with mode: 0755]
t/apenwarr/wrapper.rc [new file with mode: 0755]
t/clean.do
t/prepare.do [deleted file]
t/redo-sh.tests/README [new file with mode: 0644]
t/redo-sh.tests/clean.do [new file with mode: 0644]
t/redo-sh.tests/dependency_ne_dofile_1/test [new file with mode: 0755]
t/redo-sh.tests/dependency_ne_dofile_2/test [new file with mode: 0755]
t/redo-sh.tests/dependency_ne_nobuild_1/test [new file with mode: 0755]
t/redo-sh.tests/dependency_ne_rebuild_1/test [new file with mode: 0755]
t/redo-sh.tests/dependency_nobuild_1/test [new file with mode: 0755]
t/redo-sh.tests/dependency_nobuild_2/test [new file with mode: 0755]
t/redo-sh.tests/dependency_nobuild_3/test [new file with mode: 0755]
t/redo-sh.tests/dependency_rebuild_1/test [new file with mode: 0755]
t/redo-sh.tests/dependency_rebuild_2/test [new file with mode: 0755]
t/redo-sh.tests/dependency_rebuild_3/test [new file with mode: 0755]
t/redo-sh.tests/dofile_generated_1/test [new file with mode: 0755]
t/redo-sh.tests/dofile_generated_2/test [new file with mode: 0755]
t/redo-sh.tests/parallel_1/test [new file with mode: 0755]
t/redo-sh.tests/whichdo_absolute_1/test [new file with mode: 0755]
t/redo-sh.tests/whichdo_absolute_2/test [new file with mode: 0755]
t/redo-sh.tests/whichdo_absolute_default_1/test [new file with mode: 0755]
t/redo-sh.tests/whichdo_absolute_default_2/test [new file with mode: 0755]
t/redo-sh.tests/whichdo_relative_1/test [new file with mode: 0755]
t/redo-sh.tests/whichdo_relative_2/test [new file with mode: 0755]
t/redo-sh.tests/whichdo_relative_default_1/test [new file with mode: 0755]
t/redo-sh.tests/whichdo_relative_default_2/test [new file with mode: 0755]
t/redo-sh.tests/wrapper.rc [moved from t/runner.rc with 60% similarity]
t/redosh-dependency_ne_dofile_1.t [new symlink]
t/redosh-dependency_ne_dofile_2.t [new symlink]
t/redosh-dependency_ne_nobuild_1.t [new symlink]
t/redosh-dependency_ne_rebuild_1.t [new symlink]
t/redosh-dependency_nobuild_1.t [new symlink]
t/redosh-dependency_nobuild_2.t [new symlink]
t/redosh-dependency_nobuild_3.t [new symlink]
t/redosh-dependency_rebuild_1.t [new symlink]
t/redosh-dependency_rebuild_2.t [new symlink]
t/redosh-dependency_rebuild_3.t [new symlink]
t/redosh-dofile_generated_1.t [new symlink]
t/redosh-dofile_generated_2.t [new symlink]
t/redosh-parallel_1.t [new symlink]
t/redosh-whichdo_absolute_1.t [new symlink]
t/redosh-whichdo_absolute_2.t [new symlink]
t/redosh-whichdo_absolute_default_1.t [new symlink]
t/redosh-whichdo_absolute_default_2.t [new symlink]
t/redosh-whichdo_relative_1.t [new symlink]
t/redosh-whichdo_relative_2.t [new symlink]
t/redosh-whichdo_relative_default_1.t [new symlink]
t/redosh-whichdo_relative_default_2.t [new symlink]
usage.go

diff --git a/README b/README
index 0cb969af6141cd4b16bbae27017ec7f558562df9..7aaf437a95b7bfc365d12c4c792fe76d2a9f0821 100644 (file)
--- a/README
+++ b/README
@@ -9,6 +9,9 @@ apenwarr/redo (https://redo.readthedocs.io/en/latest/) were also
 implemented. Why yet another implementation? It is feature full and has
 better performance comparing to shell and Python implementation.
 
 implemented. Why yet another implementation? It is feature full and has
 better performance comparing to shell and Python implementation.
 
+It passes tests from dieweltistgarnichtso.net's redo-sh.tests and
+implementation-neutral from apenwarr/redo.
+
 goredo is free software: see the file COPYING for copying conditions.
 Home page: http://www.goredo.cypherpunks.ru/
 
 goredo is free software: see the file COPYING for copying conditions.
 Home page: http://www.goredo.cypherpunks.ru/
 
@@ -25,7 +28,7 @@ problems with the authenticity on your side, then build it manually: >
 
     $ git clone git://git.cypherpunks.ru/goredo.git
     $ cd goredo
 
     $ git clone git://git.cypherpunks.ru/goredo.git
     $ cd goredo
-    $ git tag -v v0.5.0
+    $ git tag -v v0.6.0
     $ git clone git://git.cypherpunks.ru/gorecfile.git
     $ ( cd gorecfile ; git tag -v v0.3.0 )
     $ echo "replace go.cypherpunks.ru/recfile => `pwd`/gorecfile" >> go.mod
     $ git clone git://git.cypherpunks.ru/gorecfile.git
     $ ( cd gorecfile ; git tag -v v0.3.0 )
     $ echo "replace go.cypherpunks.ru/recfile => `pwd`/gorecfile" >> go.mod
@@ -46,7 +49,10 @@ NOTES                                                     *goredo-notes*
   $REDO_TOP_DIR environment variable, or by having .redo/top file in it
 * target's completion messages are written after they finish
 * executable .do is run as is, non-executable is run with /bin/sh -e[x]
   $REDO_TOP_DIR environment variable, or by having .redo/top file in it
 * target's completion messages are written after they finish
 * executable .do is run as is, non-executable is run with /bin/sh -e[x]
-* tracing (-x) can be done only for non-executable .do
+* tracing (-x) can be obviously done only for non-executable .do
+* parallizable build is done only during redo-ifchange for human
+  convenience: you can globally enable REDO_JOBS, but still do for
+  example: redo htmls infos index upload
 
 FEATURES                                               *goredo-features*
 
 
 FEATURES                                               *goredo-features*
 
diff --git a/t/.gitignore b/t/.gitignore
deleted file mode 100644 (file)
index 141f812..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/*.t
diff --git a/t/apenwarr-000-set-minus-e.t b/t/apenwarr-000-set-minus-e.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-010-jobserver.t b/t/apenwarr-010-jobserver.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-100-args.t b/t/apenwarr-100-args.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-101-atime.t b/t/apenwarr-101-atime.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-102-empty.t b/t/apenwarr-102-empty.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-103-unicode.t b/t/apenwarr-103-unicode.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-104-space.t b/t/apenwarr-104-space.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-105-sympath.t b/t/apenwarr-105-sympath.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-110-compile.t b/t/apenwarr-110-compile.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-111-example.t b/t/apenwarr-111-example.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-120-defaults-flat.t b/t/apenwarr-120-defaults-flat.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-121-defaults-nested.t b/t/apenwarr-121-defaults-nested.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-122-defaults-parent.t b/t/apenwarr-122-defaults-parent.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr-130-mode.t b/t/apenwarr-130-mode.t
new file mode 120000 (symlink)
index 0000000..5f1044b
--- /dev/null
@@ -0,0 +1 @@
+apenwarr/wrapper.rc
\ No newline at end of file
diff --git a/t/apenwarr/000-set-minus-e/.gitignore b/t/apenwarr/000-set-minus-e/.gitignore
new file mode 100644 (file)
index 0000000..6bfe6b1
--- /dev/null
@@ -0,0 +1 @@
+log
diff --git a/t/apenwarr/000-set-minus-e/all.do b/t/apenwarr/000-set-minus-e/all.do
new file mode 100644 (file)
index 0000000..fb4b182
--- /dev/null
@@ -0,0 +1,4 @@
+rm -f log
+redo fatal >/dev/null 2>&1 || true
+
+[ "$(cat log)" = "ok" ] || exit 5
diff --git a/t/apenwarr/000-set-minus-e/clean.do b/t/apenwarr/000-set-minus-e/clean.do
new file mode 100644 (file)
index 0000000..4676c2d
--- /dev/null
@@ -0,0 +1 @@
+rm -f log *~ .*~
diff --git a/t/apenwarr/000-set-minus-e/fatal.do b/t/apenwarr/000-set-minus-e/fatal.do
new file mode 100644 (file)
index 0000000..b4037c7
--- /dev/null
@@ -0,0 +1,4 @@
+rm -f log
+echo ok >>log
+this-should-cause-a-fatal-error
+echo fail >>log  # this line should never run
diff --git a/t/apenwarr/010-jobserver/.gitignore b/t/apenwarr/010-jobserver/.gitignore
new file mode 100644 (file)
index 0000000..7430e1d
--- /dev/null
@@ -0,0 +1,6 @@
+*.end
+*.start
+*.sub
+*.spin
+*.log
+*.x
diff --git a/t/apenwarr/010-jobserver/all.do b/t/apenwarr/010-jobserver/all.do
new file mode 100644 (file)
index 0000000..aae44d4
--- /dev/null
@@ -0,0 +1,5 @@
+# We put the -j options at this toplevel to detect an earlier bug
+# where the sub-jobserver wasn't inherited by sub-sub-processes, which
+# accidentally reverted to the parent jobserver instead.
+
+redo -j 1 serialtest
diff --git a/t/apenwarr/010-jobserver/clean.do b/t/apenwarr/010-jobserver/clean.do
new file mode 100644 (file)
index 0000000..80aa8ab
--- /dev/null
@@ -0,0 +1,2 @@
+rm -f *~ .*~ *.log *.sub *.spin *.x *.start *.end \
+       first second parallel parallel2
diff --git a/t/apenwarr/010-jobserver/default.spin.do b/t/apenwarr/010-jobserver/default.spin.do
new file mode 100644 (file)
index 0000000..293f924
--- /dev/null
@@ -0,0 +1,4 @@
+for d in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do
+       redo $2.$d.x
+done
+echo hello
diff --git a/t/apenwarr/010-jobserver/default.x.do b/t/apenwarr/010-jobserver/default.x.do
new file mode 100644 (file)
index 0000000..4662694
--- /dev/null
@@ -0,0 +1 @@
+echo world
diff --git a/t/apenwarr/010-jobserver/first.do b/t/apenwarr/010-jobserver/first.do
new file mode 100644 (file)
index 0000000..2835c19
--- /dev/null
@@ -0,0 +1,24 @@
+# in case we're (erroneously) running in parallel, give second.do some
+# time to start but not finish.
+echo 'first sleep' >&2
+sleep 1
+
+# Because of --shuffle, we can't be sure if first or second ran first, but
+# because all.do uses -j1, we *should* expect that if second ran first, it
+# at least ran to completion before we ran at all.
+if [ -e second.start ]; then
+       echo 'first: second already started before we did...' >&2
+       [ -e second.end ] || exit 21
+       echo 'first: ...and it finished as it should.' >&2
+       # no sense continuing the test; can't test anything if second already
+       # ran.
+       exit 0
+fi
+echo 'first: second has not started yet, good.' >&2
+
+echo 'first spin' >&2
+redo 1.a.spin
+[ -e 1.a.spin ] || exit 11
+echo 'first spin complete' >&2
+
+! [ -e second.start ] || exit 22
diff --git a/t/apenwarr/010-jobserver/second.do b/t/apenwarr/010-jobserver/second.do
new file mode 100644 (file)
index 0000000..de732b4
--- /dev/null
@@ -0,0 +1,8 @@
+rm -f $1.start $1.end
+echo 'second start' >&2
+: >$1.start
+redo 2.x
+echo 'second sleep' >&2
+redo-ifchange first  # wait until 'first' finishes, if it's running
+echo 'second end' >&2
+: >$1.end
diff --git a/t/apenwarr/010-jobserver/serialtest.do b/t/apenwarr/010-jobserver/serialtest.do
new file mode 100644 (file)
index 0000000..b0cb5cf
--- /dev/null
@@ -0,0 +1,3 @@
+# Test that -j1 really serializes all sub-redo processes.
+rm -f *.sub *.spin *.x first second *.start *.end
+redo first second
diff --git a/t/apenwarr/100-args/.gitignore b/t/apenwarr/100-args/.gitignore
new file mode 100644 (file)
index 0000000..020cf06
--- /dev/null
@@ -0,0 +1 @@
+passfail
diff --git a/t/apenwarr/100-args/all.do b/t/apenwarr/100-args/all.do
new file mode 100644 (file)
index 0000000..800400d
--- /dev/null
@@ -0,0 +1 @@
+redo test.args test2.args passfailtest noargs/run
diff --git a/t/apenwarr/100-args/clean.do b/t/apenwarr/100-args/clean.do
new file mode 100644 (file)
index 0000000..c9914e6
--- /dev/null
@@ -0,0 +1 @@
+rm -f passfail *~ .*~ */*~ */.*~ noargs/all
diff --git a/t/apenwarr/100-args/default.args.do b/t/apenwarr/100-args/default.args.do
new file mode 100644 (file)
index 0000000..a79a7da
--- /dev/null
@@ -0,0 +1,3 @@
+[ "$1" = "test.args" ]
+[ "$2" = "test" ]
+[ "$3" != "test.args" ]
diff --git a/t/apenwarr/100-args/noargs/all.do b/t/apenwarr/100-args/noargs/all.do
new file mode 100644 (file)
index 0000000..fa6c74c
--- /dev/null
@@ -0,0 +1 @@
+echo RAN >$3
diff --git a/t/apenwarr/100-args/noargs/run.do b/t/apenwarr/100-args/noargs/run.do
new file mode 100644 (file)
index 0000000..f365ebf
--- /dev/null
@@ -0,0 +1,3 @@
+rm -f all
+redo-ifchange  # should not default to 'all' since not running from top level
+[ ! -e all ] || exit 11
diff --git a/t/apenwarr/100-args/passfail.do b/t/apenwarr/100-args/passfail.do
new file mode 100644 (file)
index 0000000..4042930
--- /dev/null
@@ -0,0 +1,6 @@
+echo $$
+if [ -e pleasefail ]; then
+       exit 1
+else
+       exit 0
+fi
diff --git a/t/apenwarr/100-args/passfailtest.do b/t/apenwarr/100-args/passfailtest.do
new file mode 100644 (file)
index 0000000..52bb0e9
--- /dev/null
@@ -0,0 +1,13 @@
+rm -f pleasefail
+redo passfail
+[ -e passfail ] || exit 42
+PF1=$(cat passfail)
+touch pleasefail
+redo passfail 2>/dev/null && exit 43
+[ -e passfail ] || exit 44
+PF2=$(cat passfail)
+[ "$PF1" = "$PF2" ] || exit 45
+rm -f pleasefail
+redo passfail || exit 46
+PF3=$(cat passfail)
+[ "$PF1" != "$PF3" ] || exit 47
diff --git a/t/apenwarr/100-args/test2.args.do b/t/apenwarr/100-args/test2.args.do
new file mode 100644 (file)
index 0000000..1f136fb
--- /dev/null
@@ -0,0 +1,3 @@
+[ "$1" = "test2.args" ]
+[ "$2" = "test2.args" ]
+[ "$3" != "test2.args" ]
diff --git a/t/apenwarr/101-atime/.gitignore b/t/apenwarr/101-atime/.gitignore
new file mode 100644 (file)
index 0000000..ec08e49
--- /dev/null
@@ -0,0 +1 @@
+atime2
diff --git a/t/apenwarr/101-atime/all.do b/t/apenwarr/101-atime/all.do
new file mode 100644 (file)
index 0000000..082ab7a
--- /dev/null
@@ -0,0 +1 @@
+redo atime
diff --git a/t/apenwarr/101-atime/atime.do b/t/apenwarr/101-atime/atime.do
new file mode 100644 (file)
index 0000000..3543ae1
--- /dev/null
@@ -0,0 +1 @@
+redo atime2
diff --git a/t/apenwarr/101-atime/atime2.do b/t/apenwarr/101-atime/atime2.do
new file mode 100644 (file)
index 0000000..f77931e
--- /dev/null
@@ -0,0 +1,6 @@
+# make sure redo doesn't think merely *reading* the old file counts as
+# modifying it in-place.
+cat $1 >/dev/null 2>/dev/null || true
+${PYTHON:-python} tick.py
+cat $1 >/dev/null 2>/dev/null || true
+echo hello
diff --git a/t/apenwarr/101-atime/clean.do b/t/apenwarr/101-atime/clean.do
new file mode 100644 (file)
index 0000000..0e3ea5a
--- /dev/null
@@ -0,0 +1 @@
+rm -f atime2 *~ .*~
diff --git a/t/apenwarr/101-atime/tick.py b/t/apenwarr/101-atime/tick.py
new file mode 100644 (file)
index 0000000..04a0b04
--- /dev/null
@@ -0,0 +1,6 @@
+import time
+t2 = int(time.time()) + 1.0
+while 1:
+    t = time.time()
+    if t >= t2: break
+    time.sleep(t2 - t + 0.01)
diff --git a/t/apenwarr/102-empty/.gitignore b/t/apenwarr/102-empty/.gitignore
new file mode 100644 (file)
index 0000000..4cc290b
--- /dev/null
@@ -0,0 +1,3 @@
+touch1
+silence
+silence.do
diff --git a/t/apenwarr/102-empty/all.do b/t/apenwarr/102-empty/all.do
new file mode 100644 (file)
index 0000000..6404c98
--- /dev/null
@@ -0,0 +1 @@
+redo silencetest touchtest blank
diff --git a/t/apenwarr/102-empty/blank.do b/t/apenwarr/102-empty/blank.do
new file mode 100644 (file)
index 0000000..d4c3b3f
--- /dev/null
@@ -0,0 +1,3 @@
+redo-ifchange
+redo-ifcreate
+redo
diff --git a/t/apenwarr/102-empty/clean.do b/t/apenwarr/102-empty/clean.do
new file mode 100644 (file)
index 0000000..ec65690
--- /dev/null
@@ -0,0 +1 @@
+rm -f touch1 touch1-ran *~ .*~ silence.do
diff --git a/t/apenwarr/102-empty/silencetest.do b/t/apenwarr/102-empty/silencetest.do
new file mode 100644 (file)
index 0000000..78bdc0a
--- /dev/null
@@ -0,0 +1,11 @@
+# This may have been leftover from a previous run, when switching
+# between "real" redo and minimal/do, so clean it up.
+rm -f silence
+
+echo 'echo hello' >silence.do
+redo silence
+[ -e silence ] || exit 55
+echo 'true' >silence.do
+redo silence
+[ ! -e silence ] || exit 66
+rm -f silence.do
diff --git a/t/apenwarr/102-empty/touchtest.do b/t/apenwarr/102-empty/touchtest.do
new file mode 100644 (file)
index 0000000..2f3d5ca
--- /dev/null
@@ -0,0 +1,41 @@
+# This may have been leftover from a previous run, when switching
+# between "real" redo and minimal/do, so clean it up.
+rm -f touch1
+
+# simply create touch1
+echo 'echo hello' >touch1.do
+redo touch1
+[ -e touch1 ] || exit 55
+[ "$(cat touch1)" = "hello" ] || exit 56
+
+# ensure that 'redo touch1' always re-runs touch1.do even if we have
+# already built touch1 in this session, and even if touch1 already exists.
+echo 'echo hello2' >touch1.do
+redo touch1
+[ "$(cat touch1)" = "hello2" ] || exit 57
+
+# ensure that touch1 is rebuilt even if it got deleted after the last redo
+# inside the same session.  Also ensure that we can produce a zero-byte
+# output file explicitly.
+rm -f touch1
+echo 'touch $3' >touch1.do
+redo touch1
+[ -e touch1 ] || exit 66
+[ -z "$(cat touch1)" ] || exit 67
+
+# Also test that zero bytes of output does not create the file at all, as
+# opposed to creating a zero-byte file.
+rm -f touch1
+echo 'touch touch1-ran' >touch1.do
+redo touch1
+[ -e touch1 ] && exit 75
+[ -e touch1-ran ] || exit 76
+rm -f touch1-ran
+
+# Make sure that redo-ifchange *won't* rebuild touch1 if we have already
+# built it, even if building it did not produce an output file.
+redo-ifchange touch1
+[ -e touch1 ] && exit 77
+[ -e touch1-ran ] && exit 78
+
+rm -f touch1.do
diff --git a/t/apenwarr/103-unicode/all.do b/t/apenwarr/103-unicode/all.do
new file mode 100644 (file)
index 0000000..e76c907
--- /dev/null
@@ -0,0 +1 @@
+redo unicode
diff --git a/t/apenwarr/103-unicode/clean.do b/t/apenwarr/103-unicode/clean.do
new file mode 100644 (file)
index 0000000..25762fa
--- /dev/null
@@ -0,0 +1 @@
+rm -rf *.tmp
diff --git a/t/apenwarr/103-unicode/unicode.do b/t/apenwarr/103-unicode/unicode.do
new file mode 100644 (file)
index 0000000..9297114
--- /dev/null
@@ -0,0 +1,16 @@
+# Test that redo can handle a script whose path contains non-ASCII characters.
+# Note: the test directory is intentionally *not* a normalized unicode
+# string, ie. filesystems like macOS will convert it to a different string
+# at creation time. This tests weird normalization edge cases.
+#
+# Unfortunately, on macOS with APFS, it may helpfully normalize the path at
+# *create* time, but not on future *open* attempts. Thus, we let the shell
+# figure out what directory name actually got created, then pass that to redo.
+# Hence the weird wildcard expansion loop.
+rm -rf test-uni*.tmp
+mkdir "test-uniçøðë.tmp"
+for p in test-uni*.tmp; do
+       : >$p/test1.do
+       redo "$p/test1"
+done
+
diff --git a/t/apenwarr/104-space/all.do b/t/apenwarr/104-space/all.do
new file mode 100644 (file)
index 0000000..c5c576a
--- /dev/null
@@ -0,0 +1 @@
+redo "space dir/test"
diff --git a/t/apenwarr/104-space/clean.do b/t/apenwarr/104-space/clean.do
new file mode 100644 (file)
index 0000000..b5cfeff
--- /dev/null
@@ -0,0 +1 @@
+redo "space dir/clean"
diff --git a/t/apenwarr/104-space/space dir/.gitignore b/t/apenwarr/104-space/space dir/.gitignore
new file mode 100644 (file)
index 0000000..342e2be
--- /dev/null
@@ -0,0 +1,2 @@
+/space file
+/space 2
diff --git a/t/apenwarr/104-space/space dir/clean.do b/t/apenwarr/104-space/space dir/clean.do
new file mode 100644 (file)
index 0000000..0cab67d
--- /dev/null
@@ -0,0 +1 @@
+rm -f *~ .*~ "space 2"
diff --git a/t/apenwarr/104-space/space dir/space 2.do b/t/apenwarr/104-space/space dir/space 2.do
new file mode 100644 (file)
index 0000000..5c73747
--- /dev/null
@@ -0,0 +1 @@
+echo $$
diff --git a/t/apenwarr/104-space/space dir/space file.do b/t/apenwarr/104-space/space dir/space file.do
new file mode 100644 (file)
index 0000000..b683e8a
--- /dev/null
@@ -0,0 +1 @@
+redo-ifchange "space 2"
diff --git a/t/apenwarr/104-space/space dir/test.do b/t/apenwarr/104-space/space dir/test.do
new file mode 100644 (file)
index 0000000..923444e
--- /dev/null
@@ -0,0 +1,6 @@
+redo "space file"
+F1="$(cat "space 2")"
+redo "../space dir/space file"
+F2="$(cat "space 2")"
+[ "$F1" = "$F2" ] || exit 2
+[ -n "$F1" ] || exit 3
diff --git a/t/apenwarr/105-sympath/.gitignore b/t/apenwarr/105-sympath/.gitignore
new file mode 100644 (file)
index 0000000..ad4ad3e
--- /dev/null
@@ -0,0 +1,5 @@
+/*.dyn
+/src
+/x
+/y
+
diff --git a/t/apenwarr/105-sympath/all.do b/t/apenwarr/105-sympath/all.do
new file mode 100644 (file)
index 0000000..7def58d
--- /dev/null
@@ -0,0 +1,26 @@
+rm -f src
+: >src
+
+for iter in 10 20; do
+       rm -rf y
+       rm -f x *.dyn static
+       mkdir y
+       : >y/static
+       ln -s . y/x
+
+       (
+               cd y/x/x/x/x/x
+               IFS=$(printf '\n')
+               redo-ifchange static x/x/x/static $PWD/static \
+                       $(/bin/pwd)/static /etc/passwd
+               # goredo: that symlink path is not resolving even at OS level
+               # redo-ifchange $PWD/../static 2>/dev/null && exit 35
+               redo-ifchange 1.dyn x/x/x/2.dyn $PWD/3.dyn \
+                        $PWD/../4.dyn $(/bin/pwd)/5.dyn
+       )
+       [ -e y/1.dyn ] || exit $((iter + 1))
+       [ -e y/2.dyn ] || exit $((iter + 2))
+       [ -e y/3.dyn ] || exit $((iter + 3))
+       # [ -e 4.dyn ]   || exit $((iter + 4))
+       [ -e y/5.dyn ] || exit $((iter + 5))
+done
diff --git a/t/apenwarr/105-sympath/clean.do b/t/apenwarr/105-sympath/clean.do
new file mode 100644 (file)
index 0000000..6b5d773
--- /dev/null
@@ -0,0 +1,2 @@
+rm -rf y
+rm -f src x *.dyn *~ .*~
diff --git a/t/apenwarr/105-sympath/default.dyn.do b/t/apenwarr/105-sympath/default.dyn.do
new file mode 100644 (file)
index 0000000..0afe756
--- /dev/null
@@ -0,0 +1,2 @@
+redo-ifchange src
+echo dynamic >$3
diff --git a/t/apenwarr/110-compile/.gitignore b/t/apenwarr/110-compile/.gitignore
new file mode 100644 (file)
index 0000000..84e64ab
--- /dev/null
@@ -0,0 +1,5 @@
+CC
+LD
+[yb]ellow
+hello
+*.o
diff --git a/t/apenwarr/110-compile/CC.do b/t/apenwarr/110-compile/CC.do
new file mode 100644 (file)
index 0000000..1f40b2e
--- /dev/null
@@ -0,0 +1,5 @@
+exec >$3
+cat <<-EOF
+       cc -Wall -o /dev/fd/1 -c "\$1"
+EOF
+chmod a+x $3
diff --git a/t/apenwarr/110-compile/LD.do b/t/apenwarr/110-compile/LD.do
new file mode 100644 (file)
index 0000000..2dac2e9
--- /dev/null
@@ -0,0 +1,7 @@
+exec >$3
+cat <<-EOF
+       OUT="\$1"
+       shift
+       cc -Wall -o "\$OUT" "\$@"
+EOF
+chmod a+x $3
diff --git a/t/apenwarr/110-compile/all.do b/t/apenwarr/110-compile/all.do
new file mode 100644 (file)
index 0000000..1b1954a
--- /dev/null
@@ -0,0 +1,6 @@
+if type cc >/dev/null 2>&1; then
+       redo-ifchange hello yellow bellow
+else
+       echo "$0: No C compiler installed; skipping this test." >&2
+       redo-ifcreate /usr/bin/cc
+fi
diff --git a/t/apenwarr/110-compile/bellow.do b/t/apenwarr/110-compile/bellow.do
new file mode 100644 (file)
index 0000000..2d8ac7d
--- /dev/null
@@ -0,0 +1,3 @@
+redo-ifchange LD yellow.o
+./LD "$3" yellow.o
+../sleep 2
diff --git a/t/apenwarr/110-compile/clean.do b/t/apenwarr/110-compile/clean.do
new file mode 100644 (file)
index 0000000..13e374b
--- /dev/null
@@ -0,0 +1,3 @@
+rm -f hello [by]ellow *.o CC LD *~ .*~
+
+
diff --git a/t/apenwarr/110-compile/hello.c b/t/apenwarr/110-compile/hello.c
new file mode 100644 (file)
index 0000000..76bb8fa
--- /dev/null
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+int main()
+{
+    printf("hello, world!\n");
+    return 0;
+}
diff --git a/t/apenwarr/110-compile/hello.do b/t/apenwarr/110-compile/hello.do
new file mode 100644 (file)
index 0000000..b5ef466
--- /dev/null
@@ -0,0 +1,3 @@
+redo-ifchange LD hello.o
+../sleep 1
+./LD "$3" hello.o
diff --git a/t/apenwarr/110-compile/hello.o.do b/t/apenwarr/110-compile/hello.o.do
new file mode 100644 (file)
index 0000000..7ab28a0
--- /dev/null
@@ -0,0 +1,11 @@
+# This test is meant to confirm some basic redo functionality
+# related to static files not in the build tree. But if your
+# system doesn't happen to have stdio.h in the usual location,
+# let's not explode just for that.
+stdio=/usr/include/stdio.h
+[ -e "$stdio" ] || stdio=
+
+redo-ifchange CC hello.c $stdio
+redo-ifcreate stdio.h
+../sleep 3
+./CC hello.c
diff --git a/t/apenwarr/110-compile/yellow.do b/t/apenwarr/110-compile/yellow.do
new file mode 100644 (file)
index 0000000..36609ff
--- /dev/null
@@ -0,0 +1,3 @@
+redo-ifchange LD yellow.o
+../sleep 1.5
+./LD "$3" yellow.o
diff --git a/t/apenwarr/110-compile/yellow.o.do b/t/apenwarr/110-compile/yellow.o.do
new file mode 100644 (file)
index 0000000..9b317b7
--- /dev/null
@@ -0,0 +1,3 @@
+redo-ifchange CC hello.c
+../sleep 2
+cc -o $3 -c hello.c
diff --git a/t/apenwarr/111-example/.gitignore b/t/apenwarr/111-example/.gitignore
new file mode 100644 (file)
index 0000000..0d93ead
--- /dev/null
@@ -0,0 +1,3 @@
+*.o
+CC
+hello
diff --git a/t/apenwarr/111-example/CC.do b/t/apenwarr/111-example/CC.do
new file mode 100644 (file)
index 0000000..177fe41
--- /dev/null
@@ -0,0 +1,11 @@
+redo-ifchange config.sh
+. ./config.sh
+exec >$3
+cat <<-EOF
+       redo-ifchange \$2.c
+       cc $CFLAGS -MD -MF \$3.deps -o \$3 -c \$2.c
+       read DEPS <\$3.deps
+       rm -f \$3.deps
+       redo-ifchange \${DEPS#*:}
+EOF
+chmod +x $3
diff --git a/t/apenwarr/111-example/Makefile b/t/apenwarr/111-example/Makefile
new file mode 100644 (file)
index 0000000..cf36535
--- /dev/null
@@ -0,0 +1,6 @@
+all:
+
+%: FORCE
+       +redo $@
+
+.PHONY: FORCE
diff --git a/t/apenwarr/111-example/all.do b/t/apenwarr/111-example/all.do
new file mode 100644 (file)
index 0000000..14108cf
--- /dev/null
@@ -0,0 +1,6 @@
+if type cc >/dev/null 2>&1; then
+       redo-ifchange hello
+else
+       echo "$0: No C compiler installed; skipping this test." >&2
+       redo-ifcreate /usr/bin/cc
+fi
diff --git a/t/apenwarr/111-example/clean.do b/t/apenwarr/111-example/clean.do
new file mode 100644 (file)
index 0000000..420393f
--- /dev/null
@@ -0,0 +1 @@
+rm -f *.tmp *~ *.o hello CC
diff --git a/t/apenwarr/111-example/config.sh b/t/apenwarr/111-example/config.sh
new file mode 100644 (file)
index 0000000..f37d93a
--- /dev/null
@@ -0,0 +1 @@
+CFLAGS="-Wall"
diff --git a/t/apenwarr/111-example/default.o.do b/t/apenwarr/111-example/default.o.do
new file mode 100644 (file)
index 0000000..d48bdd1
--- /dev/null
@@ -0,0 +1,2 @@
+redo-ifchange CC
+. ./CC "$@"
diff --git a/t/apenwarr/111-example/hello.do b/t/apenwarr/111-example/hello.do
new file mode 100644 (file)
index 0000000..db35184
--- /dev/null
@@ -0,0 +1,4 @@
+DEPS="main.o
+mystr.o"
+redo-ifchange $DEPS
+cc -o $3 $DEPS
diff --git a/t/apenwarr/111-example/main.c b/t/apenwarr/111-example/main.c
new file mode 100644 (file)
index 0000000..35e746b
--- /dev/null
@@ -0,0 +1,8 @@
+#include <stdio.h>
+#include "mystr.h"
+
+int main()
+{
+    printf("%s\n", mystr);
+    return 0;
+}
diff --git a/t/apenwarr/111-example/mystr.c b/t/apenwarr/111-example/mystr.c
new file mode 100644 (file)
index 0000000..b64b7a5
--- /dev/null
@@ -0,0 +1,4 @@
+
+#include "mystr.h"
+
+char *mystr = "Hello, world!";
diff --git a/t/apenwarr/111-example/mystr.h b/t/apenwarr/111-example/mystr.h
new file mode 100644 (file)
index 0000000..1bf584e
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __MYSTR_H
+#define __MYSTR_H
+
+extern char *mystr;
+
+#endif
diff --git a/t/apenwarr/120-defaults-flat/.gitignore b/t/apenwarr/120-defaults-flat/.gitignore
new file mode 100644 (file)
index 0000000..580e8c9
--- /dev/null
@@ -0,0 +1,6 @@
+c
+c.c
+c.c.c
+c.c.c.b
+c.c.c.b.b
+d
diff --git a/t/apenwarr/120-defaults-flat/all.do b/t/apenwarr/120-defaults-flat/all.do
new file mode 100644 (file)
index 0000000..f5753c3
--- /dev/null
@@ -0,0 +1 @@
+redo-ifchange c d
diff --git a/t/apenwarr/120-defaults-flat/c.c.c.b.b.a b/t/apenwarr/120-defaults-flat/c.c.c.b.b.a
new file mode 100644 (file)
index 0000000..4768c08
--- /dev/null
@@ -0,0 +1 @@
+chicken
diff --git a/t/apenwarr/120-defaults-flat/c.do b/t/apenwarr/120-defaults-flat/c.do
new file mode 100644 (file)
index 0000000..3d6bd11
--- /dev/null
@@ -0,0 +1,3 @@
+redo-ifchange $1.c
+echo c.do
+cat $1.c
diff --git a/t/apenwarr/120-defaults-flat/clean.do b/t/apenwarr/120-defaults-flat/clean.do
new file mode 100644 (file)
index 0000000..37c32b0
--- /dev/null
@@ -0,0 +1,2 @@
+rm -f c c.c c.c.c c.c.c.b c.c.c.b.b d \
+       *~ .*~
diff --git a/t/apenwarr/120-defaults-flat/default.b.do b/t/apenwarr/120-defaults-flat/default.b.do
new file mode 100644 (file)
index 0000000..b8c9b1e
--- /dev/null
@@ -0,0 +1,10 @@
+if [ -e "$1.a" -o -e "default${1#$2}.a" ]; then
+       redo-ifchange "$1.a"
+       echo a-to-b
+       cat "$1.a"
+else
+       redo-ifchange "$1.b"
+       echo b-to-b
+       cat "$1.b"
+fi
+../sleep 1.1
diff --git a/t/apenwarr/120-defaults-flat/default.c.c.do b/t/apenwarr/120-defaults-flat/default.c.c.do
new file mode 100644 (file)
index 0000000..12798b4
--- /dev/null
@@ -0,0 +1,4 @@
+redo-ifchange $1.b
+echo b-to-cc
+cat $1.b
+../sleep 1.2
diff --git a/t/apenwarr/120-defaults-flat/default.c.do b/t/apenwarr/120-defaults-flat/default.c.do
new file mode 100644 (file)
index 0000000..9fc8bd7
--- /dev/null
@@ -0,0 +1,4 @@
+redo-ifchange $1.c
+echo c-to-c
+cat $1.c
+../sleep 1.3
diff --git a/t/apenwarr/120-defaults-flat/default.do b/t/apenwarr/120-defaults-flat/default.do
new file mode 100644 (file)
index 0000000..44aecf7
--- /dev/null
@@ -0,0 +1,4 @@
+redo-ifchange c
+echo default-rule
+cat c
+../sleep 1.4
diff --git a/t/apenwarr/121-defaults-nested/.gitignore b/t/apenwarr/121-defaults-nested/.gitignore
new file mode 100644 (file)
index 0000000..b656a9f
--- /dev/null
@@ -0,0 +1,15 @@
+/a/b/file
+/a/b/file.x.y.z
+/a/b/file.y.z
+/a/b/file.z
+/a/d/file
+/a/d/file.x.y.z
+/a/d/file.y.z
+/a/d/file.z
+/a/file
+/a/file.x.y.z
+/a/file.y.z
+/a/file.z
+/file.x.y.z
+/file.z
+/file
diff --git a/t/apenwarr/121-defaults-nested/a/b/default.y.z.do b/t/apenwarr/121-defaults-nested/a/b/default.y.z.do
new file mode 100644 (file)
index 0000000..089cc26
--- /dev/null
@@ -0,0 +1 @@
+echo default.y.z $2 ${1#$2}
diff --git a/t/apenwarr/121-defaults-nested/a/b/file.x.y.z.do b/t/apenwarr/121-defaults-nested/a/b/file.x.y.z.do
new file mode 100644 (file)
index 0000000..88c5d06
--- /dev/null
@@ -0,0 +1 @@
+echo file $2 ${1#$2}
diff --git a/t/apenwarr/121-defaults-nested/a/d/default.do b/t/apenwarr/121-defaults-nested/a/d/default.do
new file mode 100644 (file)
index 0000000..4c10de0
--- /dev/null
@@ -0,0 +1 @@
+echo default $2 ${1#$2}
diff --git a/t/apenwarr/121-defaults-nested/a/default.x.y.z.do b/t/apenwarr/121-defaults-nested/a/default.x.y.z.do
new file mode 100644 (file)
index 0000000..d23f78e
--- /dev/null
@@ -0,0 +1,2 @@
+echo default.x.y.z $2 ${1#$2}
+
diff --git a/t/apenwarr/121-defaults-nested/a/default.z.do b/t/apenwarr/121-defaults-nested/a/default.z.do
new file mode 100644 (file)
index 0000000..2e01a30
--- /dev/null
@@ -0,0 +1 @@
+echo default.z $2 ${1#$2}
diff --git a/t/apenwarr/121-defaults-nested/all.do b/t/apenwarr/121-defaults-nested/all.do
new file mode 100644 (file)
index 0000000..7b789e5
--- /dev/null
@@ -0,0 +1 @@
+redo test
diff --git a/t/apenwarr/121-defaults-nested/clean.do b/t/apenwarr/121-defaults-nested/clean.do
new file mode 100644 (file)
index 0000000..e05aefb
--- /dev/null
@@ -0,0 +1,6 @@
+exec >&2
+find . -name '*~' -exec rm -f {} \;
+rm -f a/b/file a/b/file.x.y.z a/b/file.y.z a/b/file.z \
+       a/d/file a/d/file.x.y.z a/d/file.y.z a/d/file.z \
+       a/file a/file.x.y.z a/file.y.z a/file.z \
+       file.x.y.z file.z file
diff --git a/t/apenwarr/121-defaults-nested/default.do b/t/apenwarr/121-defaults-nested/default.do
new file mode 100644 (file)
index 0000000..dd206f9
--- /dev/null
@@ -0,0 +1 @@
+echo root $2 ${1#$2} "$(dirname $3)"
diff --git a/t/apenwarr/121-defaults-nested/test.do b/t/apenwarr/121-defaults-nested/test.do
new file mode 100644 (file)
index 0000000..7af2031
--- /dev/null
@@ -0,0 +1,36 @@
+exec >&2
+redo-ifchange \
+       file.x.y.z file.z file \
+       a/b/file.x.y.z a/b/file.y.z a/b/file.z a/b/file \
+       a/d/file.x.y.z a/d/file.y.z a/d/file.z a/d/file
+
+(cd a/b && redo-ifchange ../file.x.y.z ../file.y.z ../file.z ../file)
+
+check()
+{
+       if [ "$(cat $1)" != "$2" ]; then
+               echo "$1 should contain '$2'"
+               echo " ...got '$(cat $1)'"
+               exit 44
+       fi
+}
+
+check file.x.y.z "root file.x.y.z ."
+check file.z "root file.z ."
+check file "root file ."
+
+check a/file.x.y.z "default.x.y.z file .x.y.z"
+check a/file.y.z "default.z file.y .z"
+check a/file.z "default.z file .z"
+check a/file "root a/file a"
+
+check a/b/file.x.y.z "file file.x.y.z"
+check a/b/file.y.z "default.y.z file .y.z"
+check a/b/file.z "default.z b/file .z"
+check a/b/file "root a/b/file a/b"
+
+check a/d/file.x.y.z "default file.x.y.z"
+check a/d/file.y.z "default file.y.z"
+check a/d/file.z "default file.z"
+check a/d/file "default file"
+
diff --git a/t/apenwarr/122-defaults-parent/.gitignore b/t/apenwarr/122-defaults-parent/.gitignore
new file mode 100644 (file)
index 0000000..50e1322
--- /dev/null
@@ -0,0 +1 @@
+/*.log
diff --git a/t/apenwarr/122-defaults-parent/all.do b/t/apenwarr/122-defaults-parent/all.do
new file mode 100644 (file)
index 0000000..917d634
--- /dev/null
@@ -0,0 +1,32 @@
+rm -f x/shouldfail
+
+log=$PWD/$1.log
+
+expect_fail() {
+       local rv=$1
+       shift
+       if ("$@") >>$log 2>&1; then
+               cat "$log" >&2
+               echo "unexpected success:" "$@" >&2
+               return $rv
+       else
+               return 0
+       fi
+}
+
+# These should all fail because there is no matching .do file.
+# In previous versions of redo, it would accidentally try to use
+# $PWD/default.do even for ../path/file, which is incorrect.  That
+# could cause it to return success accidentally.
+
+rm -f "$log"
+cd inner
+expect_fail 11 redo ../x/shouldfail
+expect_fail 12 redo-ifchange ../x/shouldfail
+
+rm -f "$log"
+cd ../inner2
+expect_fail 21 redo ../x/shouldfail2
+expect_fail 22 redo-ifchange ../x/shouldfail2
+
+exit 0
diff --git a/t/apenwarr/122-defaults-parent/clean.do b/t/apenwarr/122-defaults-parent/clean.do
new file mode 100644 (file)
index 0000000..b877c59
--- /dev/null
@@ -0,0 +1,2 @@
+rm -f *~ .*~ */*~ */.*~ *.tmp */*.tmp x/shouldfail *.log */*.log
+
diff --git a/t/apenwarr/122-defaults-parent/inner/default.do b/t/apenwarr/122-defaults-parent/inner/default.do
new file mode 100644 (file)
index 0000000..f8283d1
--- /dev/null
@@ -0,0 +1,2 @@
+echo "inner/default.do: PWD=$PWD '$1' '$2' '$3'" >&2
+echo SUSPICIOUS
diff --git a/t/apenwarr/122-defaults-parent/inner2/default.do b/t/apenwarr/122-defaults-parent/inner2/default.do
new file mode 100644 (file)
index 0000000..ee989e6
--- /dev/null
@@ -0,0 +1,2 @@
+echo "inner/default.do: PWD=$PWD '$1' '$2' '$3'" >&2
+# output file is left empty
diff --git a/t/apenwarr/122-defaults-parent/x/file b/t/apenwarr/122-defaults-parent/x/file
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/t/apenwarr/130-mode/.gitignore b/t/apenwarr/130-mode/.gitignore
new file mode 100644 (file)
index 0000000..64c1571
--- /dev/null
@@ -0,0 +1 @@
+mode1
\ No newline at end of file
diff --git a/t/apenwarr/130-mode/all.do b/t/apenwarr/130-mode/all.do
new file mode 100644 (file)
index 0000000..5e0fbe9
--- /dev/null
@@ -0,0 +1,5 @@
+umask 0022
+redo mode1
+MODE=$(${PYTHON:-python} -c \
+       'import os; print(oct(os.stat("mode1").st_mode & 0o7777))')
+[ "$MODE" = "0644" -o "$MODE" = "0o644" ] || exit 78
diff --git a/t/apenwarr/130-mode/clean.do b/t/apenwarr/130-mode/clean.do
new file mode 100644 (file)
index 0000000..defa28c
--- /dev/null
@@ -0,0 +1 @@
+rm -f mode1 *~ .*~
diff --git a/t/apenwarr/130-mode/mode1.do b/t/apenwarr/130-mode/mode1.do
new file mode 100644 (file)
index 0000000..2f08be9
--- /dev/null
@@ -0,0 +1 @@
+echo hello
diff --git a/t/apenwarr/README b/t/apenwarr/README
new file mode 100644 (file)
index 0000000..ae5e7e0
--- /dev/null
@@ -0,0 +1,13 @@
+Those tests are taken from https://github.com/apenwarr/redo.
+
+* Only basic ([01]*) tests taken, because other ones are too apenwarr
+  implementation specific.
+* 140-shuffle and 141-keep-going removed, because apenwarr specific
+* flush-cache removed, as it works directly with apenwarr's database
+* redo/sh and redo/py targets replaced with /bin/sh and ${PYTHON}
+* skip-if-minimal-do.sh removed
+* 010-jobserver/parallel* removed, because goredo intentionally does not
+  parallelize targets building through plain redo invocation for human
+  convenience
+* one of 105-sympath tests commented out, because its symlink path can
+  not be resolved even at OS level
diff --git a/t/apenwarr/all.do b/t/apenwarr/all.do
new file mode 100644 (file)
index 0000000..362d319
--- /dev/null
@@ -0,0 +1,9 @@
+rm -f 000-set-minus-e/log
+redo 000-set-minus-e/all
+if [ "$(cat 000-set-minus-e/log)" != "ok" ]; then
+    echo "FATAL! .do file not run with 'set -e' in effect!" >&2
+    exit 5
+fi
+
+/bin/ls 1[0-9][0-9]*/all.do | sed 's/\.do$//' | xargs redo
+110-compile/hello >&2
diff --git a/t/apenwarr/clean.do b/t/apenwarr/clean.do
new file mode 100644 (file)
index 0000000..ee6ed2b
--- /dev/null
@@ -0,0 +1,3 @@
+/bin/ls [0-9s][0-9][0-9]*/clean.do |
+sed 's/\.do$//' |
+xargs redo
diff --git a/t/apenwarr/sleep b/t/apenwarr/sleep
new file mode 100755 (executable)
index 0000000..7322c5a
--- /dev/null
@@ -0,0 +1,4 @@
+PATH=/bin:/usr/bin
+if [ -n "$SLEEP" ]; then
+       exec sleep "$@"
+fi
diff --git a/t/apenwarr/wrapper.rc b/t/apenwarr/wrapper.rc
new file mode 100755 (executable)
index 0000000..724dc67
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+testname=`basename "$0"`
+testname=${testname#apenwarr-}
+testname=${testname%.t}
+testdir=`dirname $0`/apenwarr/$testname
+cd $testdir
+testdir=`pwd`
+test_description="none"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+cd $testdir
+test_expect_success itself redo
+test_done
index 530bbbe03046e9a1addd6f9a837f0d67f5cec08f..80f432db1631f1cd75e56c132cf20b433e0813a9 100644 (file)
@@ -1,5 +1,2 @@
-rm -f *.t
-[ -e redo-sh.tests ] || exit 0
-cd redo-sh.tests/
-redo-cleanup full >&2
-find . -type f ! -name test -delete
+redo apenwarr/clean redo-sh.tests/clean
+for d in apenwarr redo-sh.tests ; do ( cd $d ; redo-cleanup full >/dev/null ) ; done
diff --git a/t/prepare.do b/t/prepare.do
deleted file mode 100644 (file)
index 1b94b48..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-tests=redo-sh.tests
-[ -e $tests ] || {
-    cat >&2 <<EOF
-No $tests found. Provide them manually, for example with:
-    $ git clone http://news.dieweltistgarnichtso.net/bin.git
-    $ cd bin
-    $ git checkout 6e45ad16ad0513d1a6a4a0539a9d01d39d3e7490
-    $ ln -s `pwd`/redo-sh.tests /path/to/goredo/t/redo.sh.tests
-EOF
-    exit 1
-}
-( cd $tests ; ls ) | while read testname ; do
-    ln -s runner.rc ${testname}.t
-done
-
-echo Skipping parallel_2.t, that assumes --jobs option availability >&2
-rm parallel_2.t
diff --git a/t/redo-sh.tests/README b/t/redo-sh.tests/README
new file mode 100644 (file)
index 0000000..08b4ae8
--- /dev/null
@@ -0,0 +1,3 @@
+Those tests are taken from http://news.dieweltistgarnichtso.net/bin.git.
+Test parallel_2 removed, because goredo has no --jobs.
+Test always_rebuild_1 removed, because always-target is rebuilt once per run.
diff --git a/t/redo-sh.tests/clean.do b/t/redo-sh.tests/clean.do
new file mode 100644 (file)
index 0000000..dec6f7b
--- /dev/null
@@ -0,0 +1,4 @@
+for f in * ; do
+    [ -d $f ] || continue
+    find $f ! -name test -delete
+done
diff --git a/t/redo-sh.tests/dependency_ne_dofile_1/test b/t/redo-sh.tests/dependency_ne_dofile_1/test
new file mode 100755 (executable)
index 0000000..f89d2f4
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh -eu
+# A target built with a default dofile in the same directory must be rebuilt if a more specific dofile appears.
+
+test -e a.b.c && \
+ rm -- a.b.c
+
+>all.do cat <<EOF
+redo-ifchange a.b.c
+EOF
+
+dofiles="default.do default.c.do default.b.c.do a.b.c.do"
+
+for dofile in ${dofiles}; do
+ [ -e "${dofile}" ] && \
+  rm -- "${dofile}" || :
+done
+
+for dofile in ${dofiles}; do
+ >"${dofile}" cat <<EOF
+printf '${dofile}\n'
+EOF
+
+ redo
+ <a.b.c read -r text
+ if ! [ "${text}" = "${dofile}" ]; then
+  >&2 printf 'a.b.c was built with %s, should have been built with %s\n' \
+   "${text}" "${dofile}"
+  exit 1
+ fi
+done
diff --git a/t/redo-sh.tests/dependency_ne_dofile_2/test b/t/redo-sh.tests/dependency_ne_dofile_2/test
new file mode 100755 (executable)
index 0000000..c55e1e9
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/sh -eu
+# A target built with a default dofile in the parent directory must be rebuilt if a more specific dofile appears.
+
+[ -e dir ] \
+ || mkdir dir
+
+[ -e default.do ] \
+ && rm default.do
+
+[ -e dir/default.do ] \
+ && rm dir/default.do
+
+[ -e dir/a.do ] \
+ && rm dir/a.do
+>default.do cat <<EOF
+printf '1\n'
+EOF
+
+redo dir/a
+
+<dir/a read -r number_a1
+
+>dir/default.do cat <<EOF
+printf '2\n'
+EOF
+
+redo dir/a
+
+<dir/a read -r number_a2
+
+>dir/a.do cat <<EOF
+printf '3\n'
+EOF
+
+redo dir/a
+
+<dir/a read -r number_a3
+
+test 1 -eq "${number_a1}"
+test 2 -eq "${number_a2}"
+test 3 -eq "${number_a3}"
diff --git a/t/redo-sh.tests/dependency_ne_nobuild_1/test b/t/redo-sh.tests/dependency_ne_nobuild_1/test
new file mode 100755 (executable)
index 0000000..5a843c9
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh -eu
+# A target must not be rebuilt when a non-existence dependency does not exist.
+
+>all.do printf 'redo-ifchange a\n'
+>a.do printf 'test -e b || redo-ifcreate b\ndate +%s\n'
+
+redo
+<a read -r timestamp_a1
+
+sleep 1
+
+redo
+<a read -r timestamp_a2
+
+test ${timestamp_a2} -eq ${timestamp_a1}
diff --git a/t/redo-sh.tests/dependency_ne_rebuild_1/test b/t/redo-sh.tests/dependency_ne_rebuild_1/test
new file mode 100755 (executable)
index 0000000..b4b7061
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh -eu
+# A target must be rebuilt when a non-existence dependency exists.
+
+>all.do printf 'redo-ifchange a\n'
+>a.do printf 'test -e b || redo-ifcreate b\ndate +%s\n'
+
+redo
+<a read -r timestamp_a1
+
+>b :
+sleep 1
+
+redo
+<a read -r timestamp_a2
+
+test ${timestamp_a2} -gt ${timestamp_a1}
diff --git a/t/redo-sh.tests/dependency_nobuild_1/test b/t/redo-sh.tests/dependency_nobuild_1/test
new file mode 100755 (executable)
index 0000000..8f9fe64
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh -eu
+# A target must not be rebuilt when a dependency does not change.
+>all.do printf 'redo-ifchange a\n'
+>a.do printf 'redo-ifchange b\ndate +%s\n'
+>b printf '1'
+
+redo
+<a read -r timestamp_a1
+
+sleep 1
+>b printf '1'
+
+redo
+<a read -r timestamp_a2
+
+test ${timestamp_a2} -eq ${timestamp_a1}
diff --git a/t/redo-sh.tests/dependency_nobuild_2/test b/t/redo-sh.tests/dependency_nobuild_2/test
new file mode 100755 (executable)
index 0000000..c3e4836
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh -eu
+# A target must not be rebuilt when a dependency of a dependency does not change.
+>all.do printf 'redo-ifchange a\n'
+>a.do printf 'redo-ifchange b\ndate +%s\n'
+>b.do printf 'redo-ifchange c\ndate +%s\n'
+>c printf '1'
+
+redo
+<a read -r timestamp_a1
+<b read -r timestamp_b1
+
+sleep 1
+>c printf '1'
+
+redo
+<a read -r timestamp_a2
+<b read -r timestamp_b2
+
+test ${timestamp_a2} -eq ${timestamp_a1}
+test ${timestamp_b2} -eq ${timestamp_b1}
diff --git a/t/redo-sh.tests/dependency_nobuild_3/test b/t/redo-sh.tests/dependency_nobuild_3/test
new file mode 100755 (executable)
index 0000000..544218c
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh -eu
+# A target must not be rebuilt when a dependency of a dependency of a dependency does not change.
+>all.do printf 'redo-ifchange a\n'
+>a.do printf 'redo-ifchange b\ndate +%s\n'
+>b.do printf 'redo-ifchange c\ndate +%s\n'
+>c.do printf 'redo-ifchange d\ndate +%s\n'
+>d printf '1'
+
+redo
+<a read -r timestamp_a1
+<b read -r timestamp_b1
+<c read -r timestamp_c1
+
+sleep 1
+>d printf '1'
+
+redo
+<a read -r timestamp_a2
+<b read -r timestamp_b2
+<c read -r timestamp_c2
+
+test ${timestamp_a2} -eq ${timestamp_a1}
+test ${timestamp_b2} -eq ${timestamp_b1}
+test ${timestamp_c2} -eq ${timestamp_c1}
diff --git a/t/redo-sh.tests/dependency_rebuild_1/test b/t/redo-sh.tests/dependency_rebuild_1/test
new file mode 100755 (executable)
index 0000000..ea3a7cd
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh -eu
+# A target must be rebuilt when a dependency changes.
+>all.do printf 'redo-ifchange a\n'
+>a.do printf 'redo-ifchange b\ndate +%s\n'
+>b printf '1'
+
+redo
+<a read -r timestamp_a1
+
+sleep 1
+>b printf '2'
+
+redo
+<a read -r timestamp_a2
+
+test ${timestamp_a2} -gt ${timestamp_a1}
diff --git a/t/redo-sh.tests/dependency_rebuild_2/test b/t/redo-sh.tests/dependency_rebuild_2/test
new file mode 100755 (executable)
index 0000000..044104c
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh -eu
+# A target must be rebuilt when a dependency of a dependency changes.
+>all.do printf 'redo-ifchange a\n'
+>a.do printf 'redo-ifchange b\ndate +%s\n'
+>b.do printf 'redo-ifchange c\ndate +%s\n'
+>c printf '1'
+
+redo
+<a read -r timestamp_a1
+<b read -r timestamp_b1
+
+sleep 1
+>c printf '2'
+
+redo
+<a read -r timestamp_a2
+<b read -r timestamp_b2
+
+test ${timestamp_a2} -gt ${timestamp_a1}
+test ${timestamp_b2} -gt ${timestamp_b1}
diff --git a/t/redo-sh.tests/dependency_rebuild_3/test b/t/redo-sh.tests/dependency_rebuild_3/test
new file mode 100755 (executable)
index 0000000..22911df
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh -eu
+# A target must be rebuilt when a dependency of a dependency of a dependency changes.
+>all.do printf 'redo-ifchange a\n'
+>a.do printf 'redo-ifchange b\ndate +%s\n'
+>b.do printf 'redo-ifchange c\ndate +%s\n'
+>c.do printf 'redo-ifchange d\ndate +%s\n'
+>d printf '1'
+
+redo
+<a read -r timestamp_a1
+<b read -r timestamp_b1
+<c read -r timestamp_c1
+
+sleep 1
+>d printf '2'
+
+redo
+<a read -r timestamp_a2
+<b read -r timestamp_b2
+<c read -r timestamp_c2
+
+test ${timestamp_a2} -gt ${timestamp_a1}
+test ${timestamp_b2} -gt ${timestamp_b1}
+test ${timestamp_c2} -gt ${timestamp_c1}
diff --git a/t/redo-sh.tests/dofile_generated_1/test b/t/redo-sh.tests/dofile_generated_1/test
new file mode 100755 (executable)
index 0000000..5373079
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/sh -eu
+# A target built by a dofile built during the build must be built.
+
+test -e a.do && rm a.do
+test -e a && rm a
+
+>a.do.do cat <<DODO
+cat <<DO
+date +%s
+DO
+DODO
+
+redo a.do
+redo a
+
+test -e a.do
+test -e a
diff --git a/t/redo-sh.tests/dofile_generated_2/test b/t/redo-sh.tests/dofile_generated_2/test
new file mode 100755 (executable)
index 0000000..1a0b17c
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh -eu
+# A target built by a dofile built during the build by a dofile built during the build must be built.
+
+test -e a.do.do && rm a.do.do
+test -e a.do && rm a.do
+test -e a && rm a
+
+>a.do.do.do cat <<DODODO
+cat <<DODO
+cat <<DO
+date +%s
+DO
+DODO
+DODODO
+
+redo a.do.do
+redo a.do
+redo a
+
+test -e a.do.do
+test -e a.do
+test -e a
diff --git a/t/redo-sh.tests/parallel_1/test b/t/redo-sh.tests/parallel_1/test
new file mode 100755 (executable)
index 0000000..254b717
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/sh -eu
+# Targets must be built in parallel if “-j” option is given.
+
+targets="a b c d e f g h "
+num_targets=$(( ${#targets} / 2 ))
+
+>all.do cat <<EOF
+redo-ifchange ${targets}
+EOF
+
+>default.do cat <<EOF
+redo-always
+sleep 1
+EOF
+
+for jobs in 4 8; do
+ timestamp_before=$(date +%s)
+ redo -j "${jobs}"
+ timestamp_after=$(date +%s)
+
+ duration_observed=$(( ${timestamp_after} - ${timestamp_before} ))
+ duration_expected=$(( ${num_targets} / ${jobs} + 1 ))
+
+ test ${duration_observed} -le ${duration_expected}
+done
diff --git a/t/redo-sh.tests/whichdo_absolute_1/test b/t/redo-sh.tests/whichdo_absolute_1/test
new file mode 100755 (executable)
index 0000000..45f845c
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/sh -eux
+# When invoked with an absolute path name as an argument, redo-whichdo
+# must output non-existent dofiles in the same directory until it
+# outputs one that exists.
+
+dofiles="default.do default.c.do default.b.c.do a.b.c.do"
+
+for dofile in ${dofiles}; do
+ if test -e "${dofile}"; then
+  rm -- "${dofile}"
+ fi
+done
+
+for dofile in ${dofiles}; do
+ >"${dofile}" cat <<EOF
+printf '${dofile}\n'
+EOF
+
+ whichdo_dofiles=$(
+  redo-whichdo "${PWD}/a.b.c" \
+   |tr '\0' '\n'
+ )
+
+ whichdo_dofiles_nonexistent=$(
+  printf '%s\n' "${whichdo_dofiles}" \
+   |sed '$d'  # BusyBox v.1.19.3 has no “head -n-1”
+ )
+ for whichdo_dofile_nonexistent in ${whichdo_dofiles_nonexistent}; do
+  if test -e "${whichdo_dofile_nonexistent}"; then
+   >&2 printf 'redo-whichdo prints %s as nonexistent dofile, but it exists.\n' \
+    "${whichdo_dofile_nonexistent}"
+   exit 1
+  fi
+ done
+
+ whichdo_dofile_existent=$(
+  printf '%s\n' "${whichdo_dofiles}" \
+   |tail -n1
+ )
+ if ! test -e "${whichdo_dofile_existent}"; then
+  >&2 printf 'redo-whichdo prints %s as existent dofile, but it does not exist.\n' \
+   "${whichdo_dofile_existent}"
+  exit 1
+ fi
+
+done
diff --git a/t/redo-sh.tests/whichdo_absolute_2/test b/t/redo-sh.tests/whichdo_absolute_2/test
new file mode 100755 (executable)
index 0000000..2d240b2
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/sh -eu
+# When invoked with an absolute path name as an argument, redo-whichdo
+# must output non-existent dofiles in the parent directory and the
+# same directory until it outputs one that exists.
+
+if ! test -d a; then
+ mkdir a
+fi
+
+dofiles="default.do default.c.do default.b.c.do a/default.do a/default.c.do a/default.b.c.do a/a.b.c.do"
+
+for dofile in ${dofiles}; do
+ if test -e "${dofile}"; then
+  rm -- "${dofile}"
+ fi
+done
+
+for dofile in ${dofiles}; do
+ >"${dofile}" cat <<EOF
+printf '${dofile}\n'
+EOF
+
+ whichdo_dofiles=$(
+  redo-whichdo "${PWD}/a.b.c" \
+   |tr '\0' '\n'
+ )
+
+ whichdo_dofiles_nonexistent=$(
+  printf '%s\n' "${whichdo_dofiles}" \
+   |sed '$d'  # BusyBox v.1.19.3 has no “head -n-1”
+ )
+ for whichdo_dofile_nonexistent in ${whichdo_dofiles_nonexistent}; do
+  if test -e "${whichdo_dofile_nonexistent}"; then
+   >&2 printf 'redo-whichdo prints %s as nonexistent dofile, but it exists.\n' \
+    "${whichdo_dofile_nonexistent}"
+   exit 1
+  fi
+ done
+
+ whichdo_dofile_existent=$(
+  printf '%s\n' "${whichdo_dofiles}" \
+   |tail -n1
+ )
+ if ! test -e "${whichdo_dofile_existent}"; then
+  >&2 printf 'redo-whichdo prints %s as existent dofile, but it does not exist.\n' \
+   "${whichdo_dofile_existent}"
+  exit 1
+ fi
+
+done
diff --git a/t/redo-sh.tests/whichdo_absolute_default_1/test b/t/redo-sh.tests/whichdo_absolute_default_1/test
new file mode 100755 (executable)
index 0000000..ed34483
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh -eu
+# When invoked with an absolute path name with the prefix “default” as
+# an argument, redo-whichdo must not output any dofile filename twice.
+
+default_files="default default.a default.a.b default.do default.a.do default.a.b.do"
+
+for default_file in ${default_files}; do
+ whichdo_dofiles_duplicates=$(
+  redo-whichdo "${PWD}/${default_file}" \
+   |tr '\0' '\n' \
+   |sort \
+   |uniq -d
+ )
+ case "${whichdo_dofiles_duplicates}" in
+  '')
+   ;;
+  *)
+   >&2 printf 'redo-whichdo duplicate output: %s \n' ${whichdo_dofiles_duplicates}
+   exit 1
+  ;;
+ esac
+done
diff --git a/t/redo-sh.tests/whichdo_absolute_default_2/test b/t/redo-sh.tests/whichdo_absolute_default_2/test
new file mode 100755 (executable)
index 0000000..9b4024f
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh -eu
+# When invoked with an absolute filename for the file “default.do” as
+# an argument, redo-whichdo must not output that filename as possible
+# dofile.
+
+default_dofile="${PWD}/default.do"
+
+whichdo_dofiles=$(
+ redo-whichdo "${default_dofile}" \
+   |tr '\0' '\n'
+)
+
+for whichdo_dofile in ${whichdo_dofiles}; do
+ case "${whichdo_dofile}" in
+  "${default_dofile}")
+   >&2 printf 'redo-whichdo outputs that this file is its own dofile: %s\n' \
+    "${whichdo_dofile}"
+   exit 1
+  ;;
+ esac
+done
diff --git a/t/redo-sh.tests/whichdo_relative_1/test b/t/redo-sh.tests/whichdo_relative_1/test
new file mode 100755 (executable)
index 0000000..b47924b
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/sh -eu
+# When invoked with a relative path name as an argument, redo-whichdo
+# must output non-existent dofiles in the same directory until it
+# outputs one that exists.
+
+dofiles="default.do default.c.do default.b.c.do a.b.c.do"
+
+for dofile in ${dofiles}; do
+ if test -e "${dofile}"; then
+  rm -- "${dofile}"
+ fi
+done
+
+for dofile in ${dofiles}; do
+ >"${dofile}" cat <<EOF
+printf '${dofile}\n'
+EOF
+
+ whichdo_dofiles=$(
+  redo-whichdo a.b.c \
+   |tr '\0' '\n'
+ )
+
+ whichdo_dofiles_nonexistent=$(
+  printf '%s\n' "${whichdo_dofiles}" \
+   |sed '$d'  # BusyBox v.1.19.3 has no “head -n-1”
+ )
+ for whichdo_dofile_nonexistent in ${whichdo_dofiles_nonexistent}; do
+  if test -e "${whichdo_dofile_nonexistent}"; then
+   >&2 printf 'redo-whichdo prints %s as nonexistent dofile, but it exists.\n' \
+    "${whichdo_dofile_nonexistent}"
+   exit 1
+  fi
+ done
+
+ whichdo_dofile_existent=$(
+  printf '%s\n' "${whichdo_dofiles}" \
+   |tail -n1
+ )
+ if ! test -e "${whichdo_dofile_existent}"; then
+  >&2 printf 'redo-whichdo prints %s as existent dofile, but it does not exist.\n' \
+   "${whichdo_dofile_existent}"
+  exit 1
+ fi
+
+done
diff --git a/t/redo-sh.tests/whichdo_relative_2/test b/t/redo-sh.tests/whichdo_relative_2/test
new file mode 100755 (executable)
index 0000000..424da5d
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/sh -eu
+# When invoked with a relative path name as an argument, redo-whichdo
+# must output non-existent dofiles in the parent directory and the
+# same directory until it outputs one that exists.
+
+if ! test -d a; then
+ mkdir a
+fi
+
+dofiles="default.do default.c.do default.b.c.do a/default.do a/default.c.do a/default.b.c.do a/a.b.c.do"
+
+for dofile in ${dofiles}; do
+ if test -e "${dofile}"; then
+  rm -- "${dofile}"
+ fi
+done
+
+for dofile in ${dofiles}; do
+ >"${dofile}" cat <<EOF
+printf '${dofile}\n'
+EOF
+
+ whichdo_dofiles=$(
+  redo-whichdo a.b.c \
+   |tr '\0' '\n'
+ )
+
+ whichdo_dofiles_nonexistent=$(
+  printf '%s\n' "${whichdo_dofiles}" \
+   |sed '$d'  # BusyBox v.1.19.3 has no “head -n-1”
+ )
+ for whichdo_dofile_nonexistent in ${whichdo_dofiles_nonexistent}; do
+  if test -e "${whichdo_dofile_nonexistent}"; then
+   >&2 printf 'redo-whichdo prints %s as nonexistent dofile, but it exists.\n' \
+    "${whichdo_dofile_nonexistent}"
+   exit 1
+  fi
+ done
+
+ whichdo_dofile_existent=$(
+  printf '%s\n' "${whichdo_dofiles}" \
+   |tail -n1
+ )
+ if ! test -e "${whichdo_dofile_existent}"; then
+  >&2 printf 'redo-whichdo prints %s as existent dofile, but it does not exist.\n' \
+   "${whichdo_dofile_existent}"
+  exit 1
+ fi
+
+done
diff --git a/t/redo-sh.tests/whichdo_relative_default_1/test b/t/redo-sh.tests/whichdo_relative_default_1/test
new file mode 100755 (executable)
index 0000000..9ef5597
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh -eu
+# When invoked with a relative path name with the prefix “default” as
+# an argument, redo-whichdo must not output any dofile filename twice.
+
+default_files="default default.a default.a.b default.do default.a.do default.a.b.do"
+
+for default_file in ${default_files}; do
+ whichdo_dofiles_duplicates=$(
+  redo-whichdo "${default_file}" \
+   |tr '\0' '\n' \
+   |sort \
+   |uniq -d
+ )
+ case "${whichdo_dofiles_duplicates}" in
+  '')
+   ;;
+  *)
+   >&2 printf 'redo-whichdo duplicate output: %s \n' ${whichdo_dofiles_duplicates}
+   exit 1
+  ;;
+ esac
+done
diff --git a/t/redo-sh.tests/whichdo_relative_default_2/test b/t/redo-sh.tests/whichdo_relative_default_2/test
new file mode 100755 (executable)
index 0000000..385cf5f
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh -eu
+# When invoked with a relative filename for the file “default.do” as
+# an argument, redo-whichdo must not output that filename as possible
+# dofile.
+
+default_dofile="default.do"
+
+whichdo_dofiles=$(
+ redo-whichdo "${default_dofile}" \
+   |tr '\0' '\n'
+)
+
+for whichdo_dofile in ${whichdo_dofiles}; do
+ case "${whichdo_dofile}" in
+  "${PWD}/${default_dofile}")
+   >&2 printf 'redo-whichdo outputs that this file is its own dofile: %s\n' \
+    "${whichdo_dofile}"
+   exit 1
+  ;;
+ esac
+done
similarity index 60%
rename from t/runner.rc
rename to t/redo-sh.tests/wrapper.rc
index b51d15dc56f24fb2294ba1eedb81a05ce284c36b..092d588d99ca9f6dccb84d3df83f5b915e8af62f 100755 (executable)
@@ -1,6 +1,9 @@
 #!/bin/sh
 
 #!/bin/sh
 
-testdir=`dirname $0`/redo-sh.tests/`basename "${0%.t}"`
+testname=`basename "$0"`
+testname=${testname#redosh-}
+testname=${testname%.t}
+testdir=`dirname $0`/redo-sh.tests/$testname
 cd $testdir
 testdir=`pwd`
 test_description="`sed -n '2,/^$/p' test | sed 's/# //'`"
 cd $testdir
 testdir=`pwd`
 test_description="`sed -n '2,/^$/p' test | sed 's/# //'`"
diff --git a/t/redosh-dependency_ne_dofile_1.t b/t/redosh-dependency_ne_dofile_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dependency_ne_dofile_2.t b/t/redosh-dependency_ne_dofile_2.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dependency_ne_nobuild_1.t b/t/redosh-dependency_ne_nobuild_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dependency_ne_rebuild_1.t b/t/redosh-dependency_ne_rebuild_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dependency_nobuild_1.t b/t/redosh-dependency_nobuild_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dependency_nobuild_2.t b/t/redosh-dependency_nobuild_2.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dependency_nobuild_3.t b/t/redosh-dependency_nobuild_3.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dependency_rebuild_1.t b/t/redosh-dependency_rebuild_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dependency_rebuild_2.t b/t/redosh-dependency_rebuild_2.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dependency_rebuild_3.t b/t/redosh-dependency_rebuild_3.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dofile_generated_1.t b/t/redosh-dofile_generated_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-dofile_generated_2.t b/t/redosh-dofile_generated_2.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-parallel_1.t b/t/redosh-parallel_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-whichdo_absolute_1.t b/t/redosh-whichdo_absolute_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-whichdo_absolute_2.t b/t/redosh-whichdo_absolute_2.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-whichdo_absolute_default_1.t b/t/redosh-whichdo_absolute_default_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-whichdo_absolute_default_2.t b/t/redosh-whichdo_absolute_default_2.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-whichdo_relative_1.t b/t/redosh-whichdo_relative_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-whichdo_relative_2.t b/t/redosh-whichdo_relative_2.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-whichdo_relative_default_1.t b/t/redosh-whichdo_relative_default_1.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
diff --git a/t/redosh-whichdo_relative_default_2.t b/t/redosh-whichdo_relative_default_2.t
new file mode 120000 (symlink)
index 0000000..3f2c214
--- /dev/null
@@ -0,0 +1 @@
+redo-sh.tests/wrapper.rc
\ No newline at end of file
index 48fee289996057c06fe62fcf06cdf3b3e1c32017..f9b8616b82723590fa2ca573a6f85c7a1f595703 100644 (file)
--- a/usage.go
+++ b/usage.go
@@ -26,7 +26,7 @@ import (
 )
 
 const (
 )
 
 const (
-       Version  = "0.5.0"
+       Version  = "0.6.0"
        Warranty = `This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, version 3 of the License.
        Warranty = `This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, version 3 of the License.
@@ -58,7 +58,7 @@ be linked to goredo executable. It determines the command by its own name.
 You can create them by running: goredo -symlinks.
 
 * redo [options] [target ...]
 You can create them by running: goredo -symlinks.
 
 * redo [options] [target ...]
-  forcefully and sequentially build specified targets
+  forcefully and *sequentially* build specified targets
 * redo-always
   always build current target. Unusable outside .do
 * redo-cleanup {full,log,tmp} [...]
 * redo-always
   always build current target. Unusable outside .do
 * redo-cleanup {full,log,tmp} [...]