]> Cypherpunks repositories - goredo.git/commitdiff
Move to SWG documentation format
authorSergey Matveev <stargrave@stargrave.org>
Wed, 14 Jan 2026 15:21:13 +0000 (18:21 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Thu, 15 Jan 2026 10:49:45 +0000 (13:49 +0300)
57 files changed:
doc/.swgignore [new file with mode: 0644]
doc/Download [new file with mode: 0644]
doc/Env [new file with mode: 0644]
doc/FAQ/OODsUnchangedOutput [new file with mode: 0644]
doc/FAQ/PermanentErrors [new file with mode: 0644]
doc/FAQ/Stamping [new file with mode: 0644]
doc/FAQ/redo-always [new file with mode: 0644]
doc/Features [new file with mode: 0644]
doc/INSTALL [new file with mode: 0644]
doc/Integrity [new file with mode: 0644]
doc/Jobserver [new file with mode: 0644]
doc/NEWS [new file with mode: 0644]
doc/Notes [new file with mode: 0644]
doc/OOD [new file with mode: 0644]
doc/Rules [new file with mode: 0644]
doc/State [new file with mode: 0644]
doc/THANKS [new file with mode: 0644]
doc/cmd/Debug [new file with mode: 0644]
doc/cmd/Fsync [new file with mode: 0644]
doc/cmd/Parallel [new file with mode: 0644]
doc/cmd/Progress [new file with mode: 0644]
doc/cmd/Tracing [new file with mode: 0644]
doc/cmd/redo [new file with mode: 0644]
doc/cmd/redo-affects [new file with mode: 0644]
doc/cmd/redo-always [new file with mode: 0644]
doc/cmd/redo-cleanup [new file with mode: 0644]
doc/cmd/redo-dep2rec [new file with mode: 0644]
doc/cmd/redo-depfix [new file with mode: 0644]
doc/cmd/redo-dot [new file with mode: 0644]
doc/cmd/redo-ifchange [new file with mode: 0644]
doc/cmd/redo-ifcreate [new file with mode: 0644]
doc/cmd/redo-log [new file with mode: 0644]
doc/cmd/redo-ood [new file with mode: 0644]
doc/cmd/redo-sources [new file with mode: 0644]
doc/cmd/redo-stamp [new file with mode: 0644]
doc/cmd/redo-targets [new file with mode: 0644]
doc/cmd/redo-whichdo [new file with mode: 0644]
doc/cmds.texi [deleted file]
doc/download.texi [deleted file]
doc/faq.texi [deleted file]
doc/features.texi [deleted file]
doc/goredo.info.do [deleted file]
doc/index [new file with mode: 0644]
doc/index.texi [deleted file]
doc/install.texi [deleted file]
doc/integrity.texi [deleted file]
doc/jobserver.texi [deleted file]
doc/logs.texi [deleted file]
doc/mk-html [moved from doc/www.do with 50% similarity, mode: 0755]
doc/mk-info [new file with mode: 0755]
doc/news.texi [deleted file]
doc/notes.texi [deleted file]
doc/ood.texi [deleted file]
doc/rules.texi [deleted file]
doc/state.texi [deleted file]
doc/thanks.texi [deleted file]
makedist

diff --git a/doc/.swgignore b/doc/.swgignore
new file mode 100644 (file)
index 0000000..a638e44
--- /dev/null
@@ -0,0 +1,4 @@
+^mk-info$
+^mk-html$
+^goredo.html/
+^goredo.info$
diff --git a/doc/Download b/doc/Download
new file mode 100644 (file)
index 0000000..608ce9d
--- /dev/null
@@ -0,0 +1,323 @@
+Release [NEWS]#2.8.0 | 2025-12-16 | 479 KiB
+    => download/goredo-2.8.0.tar.zst.meta4 meta4\r
+    => download/goredo-2.8.0.tar.zst tar\r
+    => download/goredo-2.8.0.tar.zst.asc pgp\r
+    => download/goredo-2.8.0.tar.zst.sig ssh\r
+
+Release [NEWS]#2.6.5 | 2025-10-26 | 478 KiB
+    => download/goredo-2.6.5.tar.zst.meta4 meta4\r
+    => download/goredo-2.6.5.tar.zst tar\r
+    => download/goredo-2.6.5.tar.zst.asc pgp\r
+    => download/goredo-2.6.5.tar.zst.sig ssh\r
+
+Release [NEWS]#2.6.4 | 2025-01-04 | 471 KiB
+    => download/goredo-2.6.4.tar.zst.meta4 meta4\r
+    => download/goredo-2.6.4.tar.zst tar\r
+    => download/goredo-2.6.4.tar.zst.asc pgp\r
+    => download/goredo-2.6.4.tar.zst.sig ssh\r
+
+Release [NEWS]#2.6.3 | 2024-11-24 | 471 KiB
+    => download/goredo-2.6.3.tar.zst.meta4 meta4\r
+    => download/goredo-2.6.3.tar.zst tar\r
+    => download/goredo-2.6.3.tar.zst.asc pgp\r
+    => download/goredo-2.6.3.tar.zst.sig ssh\r
+
+Release [NEWS]#2.6.2 | 2024-02-29 | 455 KiB
+    => download/goredo-2.6.2.tar.zst.meta4 meta4\r
+    => download/goredo-2.6.2.tar.zst tar\r
+    => download/goredo-2.6.2.tar.zst.asc pgp\r
+    => download/goredo-2.6.2.tar.zst.sig ssh\r
+
+Release [NEWS]#2.6.1 | 2024-02-19 | 455 KiB
+    => download/goredo-2.6.1.tar.zst.meta4 meta4\r
+    => download/goredo-2.6.1.tar.zst tar\r
+    => download/goredo-2.6.1.tar.zst.asc pgp\r
+    => download/goredo-2.6.1.tar.zst.sig ssh\r
+
+Release [NEWS]#2.6.0 | 2023-12-19 | 455 KiB
+    => download/goredo-2.6.0.tar.zst.meta4 meta4\r
+    => download/goredo-2.6.0.tar.zst tar\r
+    => download/goredo-2.6.0.tar.zst.asc pgp\r
+    => download/goredo-2.6.0.tar.zst.sig ssh\r
+
+Release [NEWS]#2.5.0 | 2023-11-26 | 455 KiB
+    => download/goredo-2.5.0.tar.zst.meta4 meta4\r
+    => download/goredo-2.5.0.tar.zst tar\r
+    => download/goredo-2.5.0.tar.zst.asc pgp\r
+    => download/goredo-2.5.0.tar.zst.sig ssh\r
+
+Release [NEWS]#2.4.0 | 2023-11-17 | 455 KiB
+    => download/goredo-2.4.0.tar.zst.meta4 meta4\r
+    => download/goredo-2.4.0.tar.zst tar\r
+    => download/goredo-2.4.0.tar.zst.asc pgp\r
+    => download/goredo-2.4.0.tar.zst.sig ssh\r
+
+Release [NEWS]#2.3.0 | 2023-11-11 | 455 KiB
+    => download/goredo-2.3.0.tar.zst.meta4 meta4\r
+    => download/goredo-2.3.0.tar.zst tar\r
+    => download/goredo-2.3.0.tar.zst.asc pgp\r
+    => download/goredo-2.3.0.tar.zst.sig ssh\r
+
+Release [NEWS]#2.2.0 | 2023-10-16 | 455 KiB
+    => download/goredo-2.2.0.tar.zst.meta4 meta4\r
+    => download/goredo-2.2.0.tar.zst tar\r
+    => download/goredo-2.2.0.tar.zst.asc pgp\r
+    => download/goredo-2.2.0.tar.zst.sig ssh\r
+
+Release [NEWS]#2.1.0 | 2023-10-09 | 455 KiB
+    => download/goredo-2.1.0.tar.zst.meta4 meta4\r
+    => download/goredo-2.1.0.tar.zst tar\r
+    => download/goredo-2.1.0.tar.zst.asc pgp\r
+    => download/goredo-2.1.0.tar.zst.sig ssh\r
+
+Release [NEWS]#2.0.0 | 2023-10-08 | 455 KiB
+    => download/goredo-2.0.0.tar.zst.meta4 meta4\r
+    => download/goredo-2.0.0.tar.zst tar\r
+    => download/goredo-2.0.0.tar.zst.asc pgp\r
+    => download/goredo-2.0.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.32.0 | 2023-09-25 | 439 KiB
+    => download/goredo-1.32.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.32.0.tar.zst tar\r
+    => download/goredo-1.32.0.tar.zst.asc pgp\r
+    => download/goredo-1.32.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.31.0 | 2023-09-23 | 439 KiB
+    => download/goredo-1.31.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.31.0.tar.zst tar\r
+    => download/goredo-1.31.0.tar.zst.asc pgp\r
+    => download/goredo-1.31.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.30.0 | 2023-01-18 | 431 KiB
+    => download/goredo-1.30.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.30.0.tar.zst tar\r
+    => download/goredo-1.30.0.tar.zst.asc pgp\r
+    => download/goredo-1.30.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.29.0 | 2023-01-17 | 431 KiB
+    => download/goredo-1.29.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.29.0.tar.zst tar\r
+    => download/goredo-1.29.0.tar.zst.asc pgp\r
+    => download/goredo-1.29.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.28.0 | 2022-11-14 | 429 KiB
+    => download/goredo-1.28.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.28.0.tar.zst tar\r
+    => download/goredo-1.28.0.tar.zst.asc pgp\r
+    => download/goredo-1.28.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.27.1 | 2022-09-09 | 424 KiB
+    => download/goredo-1.27.1.tar.zst.meta4 meta4\r
+    => download/goredo-1.27.1.tar.zst tar\r
+    => download/goredo-1.27.1.tar.zst.asc pgp\r
+    => download/goredo-1.27.1.tar.zst.sig ssh\r
+
+Release [NEWS]#1.27.0 | 2022-08-28 | 424 KiB
+    => download/goredo-1.27.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.27.0.tar.zst tar\r
+    => download/goredo-1.27.0.tar.zst.asc pgp\r
+    => download/goredo-1.27.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.26.0 | 2022-08-26 | 424 KiB
+    => download/goredo-1.26.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.26.0.tar.zst tar\r
+    => download/goredo-1.26.0.tar.zst.asc pgp\r
+    => download/goredo-1.26.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.25.0 | 2022-05-08 | 402 KiB
+    => download/goredo-1.25.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.25.0.tar.zst tar\r
+    => download/goredo-1.25.0.tar.zst.asc pgp\r
+    => download/goredo-1.25.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.24.0 | 2022-03-01 | 401 KiB
+    => download/goredo-1.24.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.24.0.tar.zst tar\r
+    => download/goredo-1.24.0.tar.zst.asc pgp\r
+    => download/goredo-1.24.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.23.0 | 2022-02-23 | 401 KiB
+    => download/goredo-1.23.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.23.0.tar.zst tar\r
+    => download/goredo-1.23.0.tar.zst.asc pgp\r
+    => download/goredo-1.23.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.22.0 | 2022-01-26 | 388 KiB
+    => download/goredo-1.22.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.22.0.tar.zst tar\r
+    => download/goredo-1.22.0.tar.zst.asc pgp\r
+    => download/goredo-1.22.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.21.0 | 2021-11-20 | 387 KiB
+    => download/goredo-1.21.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.21.0.tar.zst tar\r
+    => download/goredo-1.21.0.tar.zst.asc pgp\r
+    => download/goredo-1.21.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.20.0 | 2021-11-19 | 385 KiB
+    => download/goredo-1.20.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.20.0.tar.zst tar\r
+    => download/goredo-1.20.0.tar.zst.asc pgp\r
+    => download/goredo-1.20.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.19.0 | 2021-11-09 | 385 KiB
+    => download/goredo-1.19.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.19.0.tar.zst tar\r
+    => download/goredo-1.19.0.tar.zst.asc pgp\r
+    => download/goredo-1.19.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.18.0 | 2021-10-27 | 388 KiB
+    => download/goredo-1.18.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.18.0.tar.zst tar\r
+    => download/goredo-1.18.0.tar.zst.asc pgp\r
+    => download/goredo-1.18.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.17.0 | 2021-10-19 | 387 KiB
+    => download/goredo-1.17.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.17.0.tar.zst tar\r
+    => download/goredo-1.17.0.tar.zst.asc pgp\r
+    => download/goredo-1.17.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.16.0 | 2021-10-14 | 387 KiB
+    => download/goredo-1.16.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.16.0.tar.zst tar\r
+    => download/goredo-1.16.0.tar.zst.asc pgp\r
+    => download/goredo-1.16.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.15.0 | 2021-09-30 | 392 KiB
+    => download/goredo-1.15.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.15.0.tar.zst tar\r
+    => download/goredo-1.15.0.tar.zst.asc pgp\r
+    => download/goredo-1.15.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.14.0 | 2021-09-15 | 392 KiB
+    => download/goredo-1.14.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.14.0.tar.zst tar\r
+    => download/goredo-1.14.0.tar.zst.asc pgp\r
+    => download/goredo-1.14.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.13.0 | 2021-08-06 | 392 KiB
+    => download/goredo-1.13.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.13.0.tar.zst tar\r
+    => download/goredo-1.13.0.tar.zst.asc pgp\r
+    => download/goredo-1.13.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.12.0 | 2021-08-01 | 392 KiB
+    => download/goredo-1.12.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.12.0.tar.zst tar\r
+    => download/goredo-1.12.0.tar.zst.asc pgp\r
+    => download/goredo-1.12.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.11.0 | 2021-08-01 | 392 KiB
+    => download/goredo-1.11.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.11.0.tar.zst tar\r
+    => download/goredo-1.11.0.tar.zst.asc pgp\r
+    => download/goredo-1.11.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.10.0 | 2021-08-01 | 392 KiB
+    => download/goredo-1.10.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.10.0.tar.zst tar\r
+    => download/goredo-1.10.0.tar.zst.asc pgp\r
+    => download/goredo-1.10.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.9.0 | 2021-07-31 | 392 KiB
+    => download/goredo-1.9.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.9.0.tar.zst tar\r
+    => download/goredo-1.9.0.tar.zst.asc pgp\r
+    => download/goredo-1.9.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.8.0 | 2021-07-02 | 389 KiB
+    => download/goredo-1.8.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.8.0.tar.zst tar\r
+    => download/goredo-1.8.0.tar.zst.asc pgp\r
+    => download/goredo-1.8.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.7.0 | 2021-06-23 | 389 KiB
+    => download/goredo-1.7.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.7.0.tar.zst tar\r
+    => download/goredo-1.7.0.tar.zst.asc pgp\r
+    => download/goredo-1.7.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.6.0 | 2021-06-22 | 387 KiB
+    => download/goredo-1.6.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.6.0.tar.zst tar\r
+    => download/goredo-1.6.0.tar.zst.asc pgp\r
+    => download/goredo-1.6.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.5.0 | 2021-06-21 | 387 KiB
+    => download/goredo-1.5.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.5.0.tar.zst tar\r
+    => download/goredo-1.5.0.tar.zst.asc pgp\r
+    => download/goredo-1.5.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.4.1 | 2021-04-29 | 383 KiB
+    => download/goredo-1.4.1.tar.zst.meta4 meta4\r
+    => download/goredo-1.4.1.tar.zst tar\r
+    => download/goredo-1.4.1.tar.zst.asc pgp\r
+    => download/goredo-1.4.1.tar.zst.sig ssh\r
+
+Release [NEWS]#1.4.0 | 2021-04-29 | 383 KiB
+    => download/goredo-1.4.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.4.0.tar.zst tar\r
+    => download/goredo-1.4.0.tar.zst.asc pgp\r
+    => download/goredo-1.4.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.3.0 | 2021-02-15 | 339 KiB
+    => download/goredo-1.3.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.3.0.tar.zst tar\r
+    => download/goredo-1.3.0.tar.zst.asc pgp\r
+    => download/goredo-1.3.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.2.0 | 2021-01-29 | 338 KiB
+    => download/goredo-1.2.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.2.0.tar.zst tar\r
+    => download/goredo-1.2.0.tar.zst.asc pgp\r
+    => download/goredo-1.2.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.1.0 | 2021-01-24 | 338 KiB
+    => download/goredo-1.1.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.1.0.tar.zst tar\r
+    => download/goredo-1.1.0.tar.zst.asc pgp\r
+    => download/goredo-1.1.0.tar.zst.sig ssh\r
+
+Release [NEWS]#1.0.0 | 2021-01-16 | 338 KiB
+    => download/goredo-1.0.0.tar.zst.meta4 meta4\r
+    => download/goredo-1.0.0.tar.zst tar\r
+    => download/goredo-1.0.0.tar.zst.asc pgp\r
+    => download/goredo-1.0.0.tar.zst.sig ssh\r
+
+Release [NEWS]#0.12.3 | 2021-01-13 | 336 KiB
+    => download/goredo-0.12.3.tar.zst.meta4 meta4\r
+    => download/goredo-0.12.3.tar.zst tar\r
+    => download/goredo-0.12.3.tar.zst.asc pgp\r
+    => download/goredo-0.12.3.tar.zst.sig ssh\r
+
+Release [NEWS]#0.12.2 | 2021-01-13 | 336 KiB
+    => download/goredo-0.12.2.tar.zst.meta4 meta4\r
+    => download/goredo-0.12.2.tar.zst tar\r
+    => download/goredo-0.12.2.tar.zst.asc pgp\r
+    => download/goredo-0.12.2.tar.zst.sig ssh\r
+
+Release [NEWS]#0.12.1 | 2021-01-13 | 336 KiB
+    => download/goredo-0.12.1.tar.zst.meta4 meta4\r
+    => download/goredo-0.12.1.tar.zst tar\r
+    => download/goredo-0.12.1.tar.zst.asc pgp\r
+    => download/goredo-0.12.1.tar.zst.sig ssh\r
+
+Release [NEWS]#0.12.0 | 2021-01-12 | 379 KiB
+    => download/goredo-0.12.0.tar.zst.meta4 meta4\r
+    => download/goredo-0.12.0.tar.zst tar\r
+    => download/goredo-0.12.0.tar.zst.asc pgp\r
+    => download/goredo-0.12.0.tar.zst.sig ssh\r
+
+Release [NEWS]#0.11.0 | 2021-01-10 | 379 KiB
+    => download/goredo-0.11.0.tar.zst.meta4 meta4\r
+    => download/goredo-0.11.0.tar.zst tar\r
+    => download/goredo-0.11.0.tar.zst.asc pgp\r
+    => download/goredo-0.11.0.tar.zst.sig ssh\r
+
+Release [NEWS]#0.10.0 | 2021-01-09 | 436 KiB
+    => download/goredo-0.10.0.tar.zst.meta4 meta4\r
+    => download/goredo-0.10.0.tar.zst tar\r
+    => download/goredo-0.10.0.tar.zst.asc pgp\r
+    => download/goredo-0.10.0.tar.zst.sig ssh\r
diff --git a/doc/Env b/doc/Env
new file mode 100644 (file)
index 0000000..7d099fe
--- /dev/null
+++ b/doc/Env
@@ -0,0 +1,2 @@
+Environment variables:
+do-backs\r
diff --git a/doc/FAQ/OODsUnchangedOutput b/doc/FAQ/OODsUnchangedOutput
new file mode 100644 (file)
index 0000000..4ffe3a0
--- /dev/null
@@ -0,0 +1,16 @@
+    What to do with OOD targets, that has not changed their output?
+
+How to prevent building of targets, who depend on the OOD target, that
+produced the same output? If the target is already decided to be OOD,
+then the whole tree becomes OOD too. It is clear, simple, reliable and
+honest way of do-ing things.
+
+Building of the lower level OOD target first is unfair and dishonest
+thing to do, because probably top level target, being the OOD, won't be
+dependant on lower level target anymore at all. Actually goredo does
+this as a shameful hack and only for always-targets, still existing in
+the wild. The whole redo-always idea is considered harmful.
+
+If you wish to run something and decide if it must OOD the toplevel
+targets, then just run redo to forcefully rebuild it and then run the
+ordinary top level targets.
diff --git a/doc/FAQ/PermanentErrors b/doc/FAQ/PermanentErrors
new file mode 100644 (file)
index 0000000..b6837e8
--- /dev/null
@@ -0,0 +1,8 @@
+     Can removed .do lead to permanent errors of its non existence?
+
+Yes, because dependency on it was recorded previously. Is it safe to
+assume that .do-less target now is an ordinary source-file? I have no
+confidence in such behaviour. So it is user's decision how to deal with
+it, probably it was just his inaccuracy mistake. If you really want to
+get rid of that dependency knowledge for foo/bar target, then remove
+foo/.redo/bar.dep.
diff --git a/doc/FAQ/Stamping b/doc/FAQ/Stamping
new file mode 100644 (file)
index 0000000..e46afcc
--- /dev/null
@@ -0,0 +1,35 @@
+                          Hashing and stamping
+
+All targets are checksummed if target's size, ctime/mtime differs from
+the previous one (depending on [OOD]'s $REDO_INODE_TRUST value).
+apenwarr/redo gives many reasons
+=> https://redo.readthedocs.io/en/latest/FAQImpl/#why-not-always-use-checksum-based-dependencies-instead-of-timestamps why\r
+every time checksumming is bad, but in my opinion in practice all of
+them do not apply.
+
+* Aggregate targets and willing to be out-of-date ones just must not
+  produce empty output files. apenwarr/*, redo-c and goredo
+  implementations treat non existing file as an out-of-date target
+* If you really wish to produce an empty target file, just touch $3
+
+Those who create an empty file if no stdout was written -- are failed
+implementations.
+
+redo is a tool to help people. Literally all targets can be safely
+"redo-stamp <$3"-ed, reducing false positive out-of-dates. Of course,
+with the correct stdout/$3 working and placing necessary results in $3,
+instead of just silently feeding them in redo-stamp.
+
+redo implementations already automatically record -ifchange on .do files
+and -ifcreate on non-existing .do files. So why they can not record
+redo-stamp the same way implicitly? No, Zen of Python is not applicable
+there, because -ifchange/-ifcreate contradicts it already.
+
+Modern cryptographic hash algorithms and CPUs are so fast, that even all
+read and writes to or from hard drive arrays can be easily checksummed
+and transparently compressed, as ZFS with LZ4/Zstandard and
+Skein/BLAKE[23] algorithms demonstrate us.
+
+goredo includes redo-stamp, that really records the stamp in the .dep
+file, but it does not play any role later. It is stayed just for
+compatibility.
diff --git a/doc/FAQ/redo-always b/doc/FAQ/redo-always
new file mode 100644 (file)
index 0000000..d56ad83
--- /dev/null
@@ -0,0 +1,13 @@
+                Does redo-always always rebuilds target?
+
+By definition, it should be built always, as
+=> http://news.dieweltistgarnichtso.net/bin/redo-sh.html#why-built-twice redo-sh\r
+and redo-c implementations do. But that ruins the whole redo usability,
+potentially rebuilding everything again and again. apenwarr/redo and
+goredo tries to build always-targets only once per run, as a some kind
+of optimization.
+
+For example if you need to rebuild TeX documents (case mentioned in
+redo-sh's FAQ) until all references and numbers are ready, then you must
+naturally expectedly explicitly use while cycle in your .do, as
+apenwarr/redo already suggests.
diff --git a/doc/Features b/doc/Features
new file mode 100644 (file)
index 0000000..a3d589a
--- /dev/null
@@ -0,0 +1,33 @@
+Notable features that differentiate goredo from many other implementations.
+
+* explicit useful and convenient checks from apenwarr/redo:
+    * check that $1 was not touched during .do execution
+    * check that stdout and $3 are not written simultaneously
+    * check that generated target was not modified "externally" outside
+      the redo, preventing its overwriting, but continuing the build
+      (optionally can stop)
+* recursive, indented and serialized logs display ability, with
+  priority to the depth and bad return codes, like in apenwarr/redo,
+  thanks to
+  => https://apenwarr.ca/log/20181106 apenwarr's article\r
+* all environment variables, working directory, command line
+  arguments, start/finish times, duration, participated PIDs, return
+  codes can be saved for later investigation
+* targets, dependency information and their directories are explicitly
+  synced (can be disabled, should work faster)
+* file's change is detected by comparing its size, and
+  => https://github.com/BLAKE3-team/BLAKE3 BLAKE3 hash.\r
+  Also as an optimization, by default if file's ctime is same, then hash
+  check is skipped. Optionally you can disable that behaviour, or even
+  enable trust to file's mtime
+* files creation is umask-friendly (unlike mkstemp() used in redo-c)
+* parallel build with jobs limit, optionally in infinite mode
+* optional coloured messages
+* verbose debug messages, including out-of-date determination, PIDs,
+  lock and jobserver acquirings/releases
+* displaying of each target's execution time
+* each target's stderr can be prefixed with the PID
+* optional statusline with currently running/waiting/done jobs
+* target's stderr can be stored on the disk with TAI64N timestamped
+  prefixes for each line. Look at [Logs].
+* [Jobserver] compatibility support with GNU Make and NetBSD bmake.
diff --git a/doc/INSTALL b/doc/INSTALL
new file mode 100644 (file)
index 0000000..8f781a9
--- /dev/null
@@ -0,0 +1,44 @@
+Possibly goredo package already exists for your distribution:
+
+=> https://packages.altlinux.org/en/sisyphus/srpms/goredo/ ALT Linux Sisyphus\r
+=> https://aur.archlinux.org/packages/goredo Arch Linux AUR\r
+=> https://github.com/rdavid/goredoer Container image\r
+=> https://github.com/rpmsphere/source/tree/master/g Fedora RPM Sphere\r
+=> https://www.freshports.org/devel/goredo/ FreeBSD ports\r
+=> https://formulae.brew.sh/formula/goredo macOS Homebrew\r
+=> https://pkgsrc.se/devel/goredo NetBSD package\r
+=> https://github.com/NixOS/nixpkgs/tree/master/pkgs/by-name/go/goredo NixOS packages\r
+
+Preferable way is to [Download] tarball with the signature from website:
+
+    $ v=2.8.0
+    $ [fetch|wget] http://www.goredo.cypherpunks.su/download/goredo-$v.tar.zst
+    $ [fetch|wget] http://www.goredo.cypherpunks.su/download/goredo-$v.tar.zst.{asc,sig}
+    [Integrity] verify
+    $ zstd -d <goredo-$v.tar.zst | tar xf -
+    $ cd goredo-$v/src
+    $ go build -mod=vendor
+    $ ./goredo -symlinks        # create redo-* commands symlinks
+    $ export PATH=`pwd`:$PATH   # let your system know about goredo
+
+A [Env] GOPRIVATE\r
+If you have problems with *.golang.org's inability to verify
+authenticity of go.cypherpunks.su TLS connection, then you can
+disable their usage by setting $GOPRIVATE=go.cypherpunks.su. You
+can override CA certificate file path with $SSL_CERT_FILE and
+$GIT_SSL_CAINFO environment variables.
+
+You can obtain development source code with
+    git clone git://git.cypherpunks.su/goredo.git
+You can also use URLs instead:
+    anongit@master.git.stargrave.org:cypherpunks.su/goredo.git
+    anongit@slave.git.stargrave.org:cypherpunks.su/goredo.git
+    anongit@master.git.cypherpunks.su:cypherpunks.su/goredo.git
+    anongit@slave.git.cypherpunks.su:cypherpunks.su/goredo.git
+    git://git.stargrave.org/goredo.git
+    git://y.git.stargrave.org/goredo.git
+    git://y.git.cypherpunks.su/goredo.git}
+
+Also there is
+=> http://y.www.goredo.cypherpunks.su/ Yggdrasil-available endpoint\r
+=> https://yggdrasil-network.github.io/ Yggdrasil\r
diff --git a/doc/Integrity b/doc/Integrity
new file mode 100644 (file)
index 0000000..04b041c
--- /dev/null
@@ -0,0 +1,25 @@
+You *have to* verify downloaded tarballs authenticity to be sure
+that you retrieved trusted and untampered software. There are two options:
+
+=> https://librepgp.org/ LibrePGP .asc signature\r
+    Use GNU Privacy Guard free software implementation.
+    For the very first time it is necessary to get signing public key and
+    import it. It is provided in PUBKEY-PGP.asc}, but you should check
+    alternate resources.
+    => https://www.gnupg.org/ GNU Privacy Guard\r
+    => PUBKEY-PGP.asc\r
+
+    pub   ed25519/0x3A528DDE952C7E93 2021-01-09
+          7531BB84FAF0BF35960C63B93A528DDE952C7E93
+    uid   goredo releases <goredo@cypherpunks.su>
+
+    $ gpg --auto-key-locate dane --locate-keys goredo at cypherpunks dot su
+    $ gpg --auto-key-locate  wkd --locate-keys goredo at cypherpunks dot su
+
+=> https://www.openssh.com/ OpenSSH .sig signature\r
+    => PUBKEY-SSH.pub Public key\r
+    => PUBKEY-SSH.pub.asc, its LibrePGP signature\r
+    Its fingerprint: SHA256:ddOaswnUBtNbuoEBYQtfcF59sR3Bvzo9pIfSlw9sKx8.
+
+    $ ssh-keygen -Y verify -f PUBKEY-SSH.pub -I goredo@cypherpunks.su -n file \
+        -s goredo-$v.tar.zst.sig <goredo-$v.tar.zst
diff --git a/doc/Jobserver b/doc/Jobserver
new file mode 100644 (file)
index 0000000..06da9c8
--- /dev/null
@@ -0,0 +1,26 @@
+Parallel builds are made by utilizing the jobserver protocol. Each job
+have to take so called token and return it when it finishes. Jobserver
+creates the pipe, consisting of read and write files, that are passed to
+each goredo instance. Job takes the token by reading the single byte
+from that pipe, writing it back for returning. Pipe is pre-filled with
+required number of tokens.
+
+goredo can be integrated with
+=> http://netbsd.org/ NetBSD's\r
+=> http://www.crufty.net/help/sjg/bmake.htm (bmake)\r
+=> https://www.gnu.org/software/make/ GNU Make (gmake)\r
+jobserver protocol. Three of them use the same principle of
+jobserver, but different ways of passing pipe's file descriptors
+numbers to child process.
+
+A [Env] REDO_MAKE\r
+$REDO_MAKE environment variable controls the compatibility behaviour:
+
+bmake
+    Pass "-j 1 -J X,Y" arguments through $MAKEFLAGS variable.
+gmake
+    Pass "--jobserver-auth=X,Y" arguments through $MAKEFLAGS variable.
+    Beware that only --jobserver-style=pipe protocol is supported!
+none
+    Pass "X,Y" arguments through $REDO_JS_FD variable.
+    Used by default, if $REDO_MAKE is not set.
diff --git a/doc/NEWS b/doc/NEWS
new file mode 100644 (file)
index 0000000..9044072
--- /dev/null
+++ b/doc/NEWS
@@ -0,0 +1,328 @@
+A 2.8.0\r
+2.8.0
+    * Fix always-OOD .do-targets with nearby default.do.
+
+A 2.7.0\r
+2.7.0
+    * Proper .do file searching during source file determination.
+
+A 2.6.5\r
+2.6.5
+    * Fix file's executable bit check, which may lead to inadmissible
+      /bin/sh run in case of symbolic links presence.
+    * Fix proper mtime's nanoseconds storage.
+
+A 2.6.4\r
+2.6.4
+    * Fix possible NFS locking issue.
+    * Updated dependant libraries.
+
+A 2.6.3\r
+2.6.3
+    * Updated dependant libraries. Should fix workability on modern OpenBSD.
+
+A 2.6.2\r
+2.6.2
+    * Integration tests do not depend on non-portable "stat" command.
+
+A 2.6.1\r
+2.6.1
+    * Integration tests do not depend on Python or Git.
+
+A 2.6.0\r
+2.6.0
+    * Omit possible obtrusive error of non-existent .dep file opening of
+      the failed target.
+
+A 2.5.0\r
+2.5.0
+    * Prevent rare race in the code, where externally modified target
+      may panic the program.
+
+A 2.4.0\r
+2.4.0
+    * Continue regression fixing of redo-whichdo.
+
+A 2.3.0\r
+2.3.0
+    * Fix regressions in redo-whichdo happened after huge refactoring.
+
+A 2.2.0\r
+2.2.0
+    * Prefix target's output lines with the name of the target.
+
+A 2.1.0\r
+2.1.0
+    * Mistakenly path to .do file was not absolute and OS can refuse to
+      run it because it is not in $PATH.
+
+A 2.0.0\r
+2.0.0
+    * Huge quantity of performance optimisations.
+    * Fixed possible unexpected lock file closing.
+    * When resulting target has the same contents, it does not replace
+      already existing one. That was done previously. But now it also
+      copies the file's mode flags to the target (for example making it
+      executable).
+    * If redo-* command runs under control of another (top-level) redo,
+      then it does not parse the flags as options and treat each
+      argument as a target, allowing passing the targets with dashes in
+      the beginning.
+    * Prevented possible concurrent stderr writing by multiple running
+      targets.
+    * redo-depfix command now always rewrites dependency files and
+      calculates checksums of the files.
+    * Own binary format is used for dependency files (.dep), instead of
+      recfile (.rec) one. It is several times smaller and much faster to
+      parse. You must run redo-depfix to convert all existing
+      .redo/*.rec files to that binary format.
+    * redo-dep2rec command appeared, that can convert .dep to recfile on
+      stdout.
+
+A 1.32.0\r
+1.32.0
+    * Omit printing of the "resource deadlock avoided" warning when
+      trying to take the lock.
+
+A 1.31.0\r
+1.31.0
+    * Fixed possible race when target can be built more than once.
+    * Print out finished targets much more quickly.
+
+A 1.30.0\r
+1.30.0
+    * Fixed wrong OOD-cache value of source file dependency.
+    * Targets could be rebuilt without any reason.
+
+A 1.29.0\r
+1.29.0
+    * Fix possible error when two always-ed targets are run simultaneously.
+    * Updated dependant libraries.
+
+A 1.28.0\r
+1.28.0
+    * Do not remove .lock files, that leads to possible races between
+      running targets. Although nncp-cleanup lock can be used to
+      cleanup.
+    * Updated dependant libraries.
+
+A 1.27.1\r
+1.27.1
+    * Fixed lack of .redo.-prefix in temporary file names.
+
+A 1.27.0\r
+1.27.0
+    * Improved out-of-date check and .do files search performance,
+      because of caching their results.
+
+A 1.26.0\r
+1.26.0
+    * Debug output contained colour-related attribute even if
+      $NO_COLOR=1 was set.
+    * Updated dependant libraries.
+
+A 1.25.0\r
+1.25.0
+    * Target's lock file requires a token from the jobserver now. So
+      amount of simultaneously opened lock files depends on job slots
+      available.
+
+A 1.24.0\r
+1.24.0
+    * "redo-cleanup tmp" also removes temporary ($3) created
+      directories.
+
+A 1.23.0\r
+1.23.0
+    * redo-ifchange's -f option forces each target rebuilding. Similarly
+      to redo, it will parallelize the process.
+    * Inode's number is also stored as dependency information, just to
+      prevent possible ctime collision of two files.
+    * Performance optimization: do not use target's temporary output
+      file at all, if its hash equals to already existing target's one.
+      Just touch existing target file instead.
+
+A 1.22.0\r
+1.22.0
+    * "flock" locks replaced with POSIX "fcntl" ones. They could be more
+      portable.
+    * redo-depfix command appeared, that traverses through all .redo
+      directories and their dependency files, checks if corresponding
+      targets has the same content but different ctime/mtime values and
+      rewrites dependencies with that updated inode information.
+    * With $REDO_STOP_IF_MODIFIED=1 environment variable redo will stop
+      and fail if it meet externally modified file. By default user is
+      only warned about it, but building continues for convenience.
+
+A 1.21.0\r
+1.21.0
+    * $REDO_INODE_NO_TRUST is replaced with $REDO_INODE_TRUST
+      environment variable, that takes either "none", or "ctime" (the
+      default one), or "mtime" (new one). Check documentation's separate
+      page about that option.
+
+A 1.20.0\r
+1.20.0
+    Print warning message if both ifcreate and ifchange records were
+    discovered after the target is done.
+
+A 1.19.0\r
+1.19.0
+    * Skip target itself, when searching for corresponding .do file.
+      For example default.do must use ../default.do instead of the self.
+
+A 1.18.0\r
+1.18.0
+    * Fix regression of known OODs passing since 1.3.0, that leads to
+      rebuilding of already built targets.
+
+A 1.17.0\r
+1.17.0
+    * If redo* process is killed, then it sends SIGTERM to all his
+      children too, properly terminating the whole job queue.
+
+A 1.16.0\r
+1.16.0
+    * Non-existent targets are considered always out-of-date, as it should be.
+    * Do not panic if $REDO_LOGS=1 and we were unable to start the command.
+
+A 1.15.0\r
+1.15.0
+    * Explicitly check if $1 target is touched and then fail.
+      Previously we check if $1 was only altered.
+
+A 1.14.0\r
+1.14.0
+    * Fixed redo-ifcreate's targets proper relative paths to the target.
+
+A 1.13.0\r
+1.13.0
+    * Use .log-rec extension, instead of .log.rec, that won't collide
+      with already existing .log and .rec in .redo directory.
+
+A 1.12.0\r
+1.12.0
+    * Fix possible lack of success finish message printing if any of
+      targets fail.
+
+A 1.11.0\r
+1.11.0
+    * Fix nasty bug with incorrect .redo/tgt.rec files renaming.
+
+A 1.10.0\r
+1.10.0
+    * redo-cleanup now also cleans .redo/tgt.log.rec files.
+    * Recursive logs do not require .redo/tgt.rec existence anymore.
+
+A 1.9.0\r
+1.9.0
+    * Do not enable command line options not applicable to the command.
+      For example -j option is only applicable to redo and redo-ifchange
+      commands.
+    * -dry-run option is renamed to -n
+    * -logs option is renamed to -k
+    * -silent option is renamed to -s
+    * When stderr logs are kept, all environment variables, working
+      directory, command line arguments, start/finish times, duration,
+      participated PIDs, return codes are saved in corresponding
+      .redo/tgt.log.rec file. Some of them can be viewed with -c option
+      to redo-log.
+    * redo-log's -r option allows recursive, indented viewing of the
+      whole redo commands invocations for the given target in serialized
+      way.
+
+A 1.8.0\r
+1.8.0
+    * Fixed possibly wrong relative path record of the dependency,
+      when redo commands are run in different directory from the .do.
+    * Fixed possible failing in redo-sources if no .dep is found.
+
+A 1.7.0\r
+1.7.0
+    * Optional compatibility (through $REDO_MAKE={bmake|gmake}) with
+      either NetBSD's bmake or GNU Make jobserver protocols, being able
+      to tightly integrate goredo with the make.
+
+A 1.6.0\r
+1.6.0
+    * redo-affects command appeared, that shows all targets that will be
+      affected by changing the specified ones.
+
+A 1.5.0\r
+1.5.0
+    * redo-ood, redo-sources and redo-targets can optionally take list
+      of targets to apply the command on, to narrow the result.
+    * redo-sources mistakenly missed .do files in the output.
+    * redo-sources now recursively searches for all source files, not
+      the "first" depth level ones.
+
+A 1.4.1\r
+1.4.1
+    * Even more simpler statusline cleaning function.
+
+A 1.4.0\r
+1.4.0
+    * Fixed proper -xx and $REDO_TRACE workability, that previously was
+      not applied to all targets.
+    * Simpler statusline cleaning function, does not leading to
+      whitespace junk after long lines.
+    * Updated dependant libraries.
+
+A 1.3.0\r
+1.3.0
+    * Experimental redo-sources, redo-targets and redo-ood commands.
+    * Repetitive OOD determination optimization: pass all already known
+      to be OOD targets to redoing targets.
+
+A 1.2.0\r
+1.2.0
+    * Dependency files .dep extension changed to .rec, to reflect its
+      recfile format nature and editors file type better determination.
+    * Reduce number of file descriptors kept open (1 instead of 4) while
+      waiting for job slot token.
+
+A 1.1.0\r
+1.1.0
+    * redo-cleanup gained -dry-run option.
+
+A 1.0.0\r
+1.0.0
+    * "Size" is stored in the state, for faster OOD detection. Previous
+      goredo state files won't work.
+    * Setting of $REDO_INODE_NO_TRUST environment variable brings no
+      trust to file inode's information (except for its size), forcing
+      its checksum checking.
+    * redo-whichdo resembles apenwarr/redo's one behaviour more.
+
+A 0.12.3\r
+0.12.3
+    * Use an updated lukechampine.com/blake3 with possibly working
+      arm64 macOS fix.
+
+A 0.12.2\r
+0.12.2
+    * Try to fix failing lukechampine.com/blake3 on arm64 macOS.
+    * Fixed tests permissions in the tarball.
+
+A 0.12.1\r
+0.12.1
+    * Tarball uses vendor directory without $GOPATH overriding. goredo
+      and its dependencies anyway uses Go 1.12+ versions, that have
+      vendor-ing support.
+
+A 0.12.0\r
+0.12.0
+    * Do not forget to save even output-less target as a dependency.
+    * -debug option renamed to shorter -d.
+
+A 0.11.0\r
+0.11.0
+    * Previously $REDO_JOBS override even explicitly specified -j
+      option. Fix that behaviour -- command line options must precede
+      environment variables.
+    * BLAKE3 replaces BLAKE2b hashing algorithm for even better
+      performance.
+
+A 0.10.0\r
+0.10.0
+    * Initial tarballed release.
diff --git a/doc/Notes b/doc/Notes
new file mode 100644 (file)
index 0000000..41f2d63
--- /dev/null
+++ b/doc/Notes
@@ -0,0 +1,15 @@
+Since there are no strict rules about redo behaviour, here are some
+remarks about goredo's one:
+
+* "all" target is default
+* stdout is always captured, but no target is created if it was empty
+* non-existent targets are considered always out of date
+* .do's $3 is relative path to the file in target directory
+* .do search goes up to / by default, but can be limited with either
+  $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
+* tracing (-x) can be obviously done only for non-executable .do
+* Parallelizable 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
diff --git a/doc/OOD b/doc/OOD
new file mode 100644 (file)
index 0000000..a764e43
--- /dev/null
+++ b/doc/OOD
@@ -0,0 +1,54 @@
+                       Out-of-date determination
+
+The main task for build system is deciding if the target is out-of-date
+and needs rebuilding. The single most reliable way to do that is to
+compare file's content with previously recorded one. But that is too
+expensive.
+
+So direct content storage/comparison can be replaced with
+collision-resistant hash function of enough length. goredo
+uses BLAKE3 with 256-bit output for that purpose.
+=> https://github.com/BLAKE3-team/BLAKE3 BLAKE3\r
+
+Also it stores file's size and its inode number. Obviously if size
+differs, then file's content too and there is no need to read and hash it.
+
+A [Env] REDO_INODE_TRUST\r
+But still it could be relatively expensive. So there are additional
+possible checks that can skip need of hash checking, based on some trust
+to the underlying filesystem and operating system behaviour, controlled
+by $REDO_INODE_TRUST environment variable value:
+
+$REDO_INODE_TRUST=none
+    Do not trust filesystem at all, except for file's size knowledge.
+    Most reliable mode.
+
+$REDO_INODE_TRUST=ctime
+    Trust ctime value of file's inode. It should change every time inode
+    is updated. If nothing is touched and ctime is the same, then assume
+    that file was not modified and we do not try to read its content.
+    Unfortunately ctime also changes if link count is updated and
+    ownership, that could give false positive decision and force file's
+    rereading.
+
+$REDO_INODE_TRUST=mtime
+    Trust mtime value of file's inode. It should change every time
+    file's content is updated. But unfortunately there are
+    => https://apenwarr.ca/log/20181113 many issues\r
+
+Pay attention that although mtime is considered harmful (link above),
+and is hardly acceptable in build system like Make, because it compares
+timestamps of two files, redo is satisfied only with the fact of its
+changing, so badly jumping clocks are not so devastating. Modern
+filesystem and operating systems with micro- and nano-seconds resolution
+timestamps should be pretty good choice for $REDO_INODE_TRUST=mtime.
+However GNU/Linux with ext4 filesystem can easily have pretty big
+granularity of 10ms.
+
+goredo uses $REDO_INODE_TRUST=ctime by default.
+
+If you move your worktree to different place, then all ctimes
+(probably mtimes if you are inaccurate) will be also changed. OOD
+check will be much slower after that, because it has to fallback to
+content/hash checking all the time. You can use [cmd/redo-depfix]
+utility to rebuild dependency files.
diff --git a/doc/Rules b/doc/Rules
new file mode 100644 (file)
index 0000000..c1b3b82
--- /dev/null
+++ b/doc/Rules
@@ -0,0 +1,78 @@
+* Target is the single file.
+  Target's result probably won't create file at all.
+
+* Build rules for the target "target" are placed in target.do file.
+
+* By default .do file is run as "/bin/sh -e" script.
+  If [cmd/redo] is run with an -x argument,
+  then "/bin/sh -ex" is used instead.
+
+* Executable .do file is run as is, by direct execution.
+
+* Targets can be placed in other directories, probably with relatives paths.
+
+* Following .do files are searched for "dir/base.a.b" target:
+
+    dir/base.a.b.do
+    dir/default.a.b.do
+    dir/default.b.do
+    dir/default.do
+    default.a.b.do
+    default.b.do
+    default.do
+
+    and for "../a/b/xtarget.y" target:
+
+    ./../a/b/xtarget.y.do
+    ./../a/b/default.y.do
+    ./../a/b/default.do
+    ./../a/default.y.do
+    ./../a/default.do
+    ./../default.y.do
+    ./../default.do
+
+* .do file search goes up to / by default, but can be limited with
+  either $REDO_TOP_DIR environment variable, or by having .redo/top file
+  in it.
+
+* .do runs in the same directory where it is placed.
+
+* .do runs with the three arguments:
+    * $1 -- name of the target.
+    * $2 -- base name of the target.
+      Equals to $1 if it is not default.* file.
+      Otherwise it lacks the extension.
+        a.b.c.do       -> $2=a.b.c
+        default.do     -> $2=a.b.c
+        default.c.do   -> $2=a.b
+        default.b.c.do -> $2=a
+    * $3 -- path to the temporary file, that will be renamed to the
+      target itself. It is relative to the file in the target directory.
+
+* .do's stdout is captured and written to the $3 file. You have to
+  produce either stdout output, or use $3 directly, but not both.
+
+* If neither stdout output nor $3 file were explicitly created, then no
+  output file is created at all. Target does not produce anything, it is
+  "non-existent".
+
+* stderr is not captured at all and can be seen by default.
+
+* Non-existent targets are considered always out-of-date.
+
+* Dependency information is recorded by [cmd/redo-ifchange] command
+  invocation. It takes list of dependencies (targets), on whose the
+  currently build target is dependant. Current .do file is implicitly
+  added as a dependency.
+
+* If no redo-ifchange's dependency target exists, then it is build
+  (according to build rules in corresponding .do). If dependency has not
+  been changed, then it is not rebuilt.
+
+* Non-existent files dependencies are created with [cmd/redo-ifcreate]
+  command. If specified dependency target file appears, then current
+  target will be rebuilt. Intermediate higher priority .do files
+  dependency is implicitly recorded. For example, if your "foo" target
+  currently uses default.do script, then foo.do is automatically
+  recorded as a non-existent dependency, forcing "foo" to be rebuilt if
+  foo.do appears.
diff --git a/doc/State b/doc/State
new file mode 100644 (file)
index 0000000..3bd2840
--- /dev/null
+++ b/doc/State
@@ -0,0 +1,64 @@
+Dependency and build state is kept inside .redo subdirectory in
+each directory related the build. Each corresponding target has its own,
+recreated with every rebuild, binary .dep file.
+
+It starts with the header:
+    "GOREDO" || 0x01 || BuildUUID
+0x01 is format's version number. BuildUUID is 128-bit UUID.
+
+After the header comes concatenation of length-prefixed chunks. Length
+is the length of the whole chunk, including the size of the encoded
+length itself. It is 16-bit big-endian integer. After the length comes
+single byte type of the chunk:
+
+ifcreate
+    LEN || 0x01 || target
+"target" is UTF-8 encoded target's name.
+
+ifchange
+    LEN || 0x02 ||
+        size || inodeNum ||
+        ctimeSec || ctimeNsec ||
+        mtimeSec || mtimeNsec ||
+        hash || target
+"target" is UTF-8 encoded target's name. "hash" is 256-bit BLAKE3 hash.
+All other inode-related fields are 64-bit big-endian integers.
+
+always
+    LEN || 0x03
+
+stamp
+    LEN || 0x04 || hash
+"hash" is 256-bit BLAKE3 hash.
+
+ifchange-nonexistent
+    LEN || 0x05 || target
+"target" is UTF-8 encoded target's name.
+
+That .dep file can be converted to human-readable
+=> https://www.gnu.org/software/recutils/ recfile format\r
+
+For example:
+
+    Build: 80143f04-bfff-4673-950c-081d712f573d
+
+    Type: ifcreate
+    Target: foo.o.do
+
+    Type: ifchange
+    Target: default.o.do
+    Size: 123
+    InodeNum: 2345
+    CtimeSec: 1605721341
+    CtimeNsec: 253305000
+    MtimeSec: 1645606823
+    MtimeNsec: 369936700
+    Hash: f4929732f96f11e6d4ebe94536b5edef426d00ed0146853e37a87f4295e18eda
+
+    Type: always
+
+    Type: stamp
+    Hash: 5bbdf635932cb16b9127e69b6f3872577efed338f0a4ab6f2c7ca3df6ce50cc9
+
+And its schema definition:
+<<    [../dep.rec]\r
diff --git a/doc/THANKS b/doc/THANKS
new file mode 100644 (file)
index 0000000..ea59d8b
--- /dev/null
@@ -0,0 +1,13 @@
+There are people deserving to be thanked for helping this project:
+
+=> mailto:hendry@iki.fi Kai Hendry\r
+for his bugreports, AUR port, and Homebrew formula maintaining.
+
+=> mailto:spacefrogg-git@meterriblecrew.net Michael Raitz\r
+for his bugreports and various useful suggestions.
+
+=> mailto:mail@jnboehm.com Jan Niklas Böh\r
+for his suggestions and bugreports.
+
+=> mailto:ew.tmp2016@nassur.net\r
+for his bugreports and examples.
diff --git a/doc/cmd/Debug b/doc/cmd/Debug
new file mode 100644 (file)
index 0000000..183237a
--- /dev/null
@@ -0,0 +1,5 @@
+A [Env] REDO_LOG_PID\r
+A [Env] REDO_DEBUG\r
+-log-pid ($REDO_LOG_PID=1) can be used to prefix job's stderr with the
+PID, that could be useful during parallel builds. -d ($REDO_DEBUG=1)
+enables debug messages.
diff --git a/doc/cmd/Fsync b/doc/cmd/Fsync
new file mode 100644 (file)
index 0000000..09b12f8
--- /dev/null
@@ -0,0 +1,4 @@
+A [Env] REDO_NO_SYNC\r
+By default all build commands use fsync to assure data is reached the
+disk. You can disable its usage with $REDO_NO_SYNC=1 environment
+variable, for speeding up the build process.
diff --git a/doc/cmd/Parallel b/doc/cmd/Parallel
new file mode 100644 (file)
index 0000000..ba2321e
--- /dev/null
@@ -0,0 +1,4 @@
+A [Env] REDO_JOBS\r
+With -j option you can enable parallel builds, probably with an infinite
+number of workers (=0). Also you can set $REDO_JOBS to automatically
+apply that setting globally.
diff --git a/doc/cmd/Progress b/doc/cmd/Progress
new file mode 100644 (file)
index 0000000..6c39df7
--- /dev/null
@@ -0,0 +1,6 @@
+A [Env] REDO_NO_PROGRESS\r
+A [Env] REDO_NO_STATUS\r
+A [Env] NO_COLOR\r
+-no-progress ($REDO_NO_PROGRESS=1) and -no-status ($REDO_NO_STATUS=1)
+disable statusline and progress display.
+$NO_COLOR=1 disables progress/debug messages colouring.
diff --git a/doc/cmd/Tracing b/doc/cmd/Tracing
new file mode 100644 (file)
index 0000000..2a750f1
--- /dev/null
@@ -0,0 +1,3 @@
+-x option can be used to enable tracing (set -x) of the currently run
+shell script .do file. -xx option enables tracing for all invoked .do
+files further.
diff --git a/doc/cmd/redo b/doc/cmd/redo
new file mode 100644 (file)
index 0000000..9171cbb
--- /dev/null
@@ -0,0 +1,3 @@
+Forcefully and sequentially build specified targets. This is the main
+command you will explicitly use from the command line. If no targets are
+given, then "all" target will be used by default.
diff --git a/doc/cmd/redo-affects b/doc/cmd/redo-affects
new file mode 100644 (file)
index 0000000..9486533
--- /dev/null
@@ -0,0 +1,3 @@
+It is not in other distributions, but it is some kind of opposite
+of [cmd/redo-sources] -- shows the targets that will be affected
+by specified files change.
diff --git a/doc/cmd/redo-always b/doc/cmd/redo-always
new file mode 100644 (file)
index 0000000..e597fba
--- /dev/null
@@ -0,0 +1,3 @@
+Record current target as an always-do dependency. By definition it
+should be always build. goredo tries to build it once per run.
+Also look at [FAQ/redo-always].
diff --git a/doc/cmd/redo-cleanup b/doc/cmd/redo-cleanup
new file mode 100644 (file)
index 0000000..da9151c
--- /dev/null
@@ -0,0 +1,2 @@
+Removes either temporary ("tmp"), log files ("log"), lock files ("lock"),
+or everything related to goredo ("full").
diff --git a/doc/cmd/redo-dep2rec b/doc/cmd/redo-dep2rec
new file mode 100644 (file)
index 0000000..054eb8f
--- /dev/null
@@ -0,0 +1,2 @@
+Convert specified .dep ([State]) file to recfile on stdout.
+Aimed to be used mainly for debugging purposes.
diff --git a/doc/cmd/redo-depfix b/doc/cmd/redo-depfix
new file mode 100644 (file)
index 0000000..a2f9cb1
--- /dev/null
@@ -0,0 +1,10 @@
+When you copy your worktree to different place, then copied files
+ctime will change. And because recorded dependency information
+differs from updated ctimes, out-of-date algorithm will fallback to
+rereading the whole files for hash calculation, that is much slower.
+If you do not want to rebuild your targets from the ground, then
+redo-depfix can traverse through all dependency files and recalculate
+dependency information.
+
+Also if it finds legacy .rec dependency files, it converts them to
+binary format.
diff --git a/doc/cmd/redo-dot b/doc/cmd/redo-dot
new file mode 100644 (file)
index 0000000..828dc05
--- /dev/null
@@ -0,0 +1,7 @@
+Dependency graph generator.
+=> https://en.wikipedia.org/wiki/DOT_(graph_description_language) DOT\r
+For example to visualize your dependencies with GraphViz:
+
+    $ redo target [...] # to assure that **/.redo/*.dep are filled up
+    $ redo-dot target [...] >whatever.dot
+    $ dot -Tpng whatever.dot >whatever.png # possibly add -Gsplines=ortho
diff --git a/doc/cmd/redo-ifchange b/doc/cmd/redo-ifchange
new file mode 100644 (file)
index 0000000..4d22c23
--- /dev/null
@@ -0,0 +1,15 @@
+Rebuild specified targets if they are out-of-date and record them as
+a dependency for the currently run target. This is the main command
+you will use in .do files.
+
+Pay attention that redo-ifchange enables parallel builds of the given
+targets, but ordinary redo is not: it builds specified targets
+sequentially and stops when error happens.
+
+A [Env] REDO_STOP_IF_MODIFIED\r
+If redo sees some target modified externally, then by default it warns
+user about that, does not build that target, but continues the build
+process further. That is convenient in most cases: you can build your
+project with manual target modifications, without touching possibly more
+complicated .do files. With $REDO_STOP_IF_MODIFIED=1 redo won't continue
+and will exit with failure message.
diff --git a/doc/cmd/redo-ifcreate b/doc/cmd/redo-ifcreate
new file mode 100644 (file)
index 0000000..71513c7
--- /dev/null
@@ -0,0 +1,3 @@
+Record the non-existent file dependency for the currently run
+target. Target will be rebuilt if any of the given files appear.
+Can be used only inside .do file.
diff --git a/doc/cmd/redo-log b/doc/cmd/redo-log
new file mode 100644 (file)
index 0000000..01a75a5
--- /dev/null
@@ -0,0 +1,61 @@
+A [Env] REDO_LOGS\r
+A [Env] REDO_SILENT\r
+stderr of the running targets can be kept on the disk by specifying -k
+option (or by setting $REDO_LOGS=1 environment variable) to redo. You
+can simultaneously use also -s option ($REDO_SILENT=1) to silence stderr
+output, but still keeping it on the disk for possible further debug
+investigation. *Only* the latest build is kept, previous one is
+overwritten.
+
+    $ redo -xx -k -s build-the-whole-huge-project
+
+Logs are stored in corresponding .redo/tgt.log file.
+Each line of it is prefixed with
+=> http://cr.yp.to/libtai/tai64.html TAI64N timestamp\r
+that you can decode with tai64nlocal utility from
+  => http://cr.yp.to/daemontools.html daemontools\r
+or similar one:
+    go install go.cypherpunks.su/tai64n/v4/cmd/tai64nlocal@latest
+
+When -k is in use, all environment variables, working directory, command
+line arguments, start/finish times, duration, participated PIDs, return
+codes are also saved in corresponding .redo/tgt.log.rec file.
+
+You can view any target's output with redo-log command (possibly piping
+to tai64nlocal). -c option also shows how exactly it was started, when
+started/finished and how long did it take.
+
+-r option enables recursive serialized indented output. When you run
+redo in parallel, then all stderr (if no (-s)ilence was enabled) is
+printed as it appears, mixing output from all commands, that is hard to
+read and investigate. Serialized redo-log output rearranges output. I
+will take example from original apenwarr's idea
+=> https://apenwarr.ca/log/20181106 article\r
+Serialized output will look like this:
+
+    $ redo-log -r A
+    A: ...A stuff...
+    A: redo-ifchange J
+    J: > redo J
+    J: > ...J stuff...
+    J: > redo-ifchange X Y
+    X: > > redo X
+    X: > > ...X stuff...
+    X: > > done X
+    J: > > redo Y
+    Y: > > ...Y stuff...
+    Z: > > > redo Z
+    Z: > > > ...Z stuff...
+    Z: > > > done Z
+    Y: > > ...more Y stuff...
+    Y: > > done Y
+    J: > ...more J stuff...
+    J: > done J
+    A: ...more A stuff...
+
+It will output depth first logs. It can rearrange some "events" (redo
+invocations): failed targets will be at the very end, because they are
+the most interesting ones for the human.
+
+Pay attention that recursive output is more CPU hungry. Single target
+output is literally copying of .redo/tgt.log file to stdout.
diff --git a/doc/cmd/redo-ood b/doc/cmd/redo-ood
new file mode 100644 (file)
index 0000000..03a48ae
--- /dev/null
@@ -0,0 +1 @@
+Similarly to [cmd/redo-targets] shows the targets, but only out-of-date ones.
diff --git a/doc/cmd/redo-sources b/doc/cmd/redo-sources
new file mode 100644 (file)
index 0000000..a8aad69
--- /dev/null
@@ -0,0 +1 @@
+Recursively show all source files the given targets depend on.
diff --git a/doc/cmd/redo-stamp b/doc/cmd/redo-stamp
new file mode 100644 (file)
index 0000000..0dbee5c
--- /dev/null
@@ -0,0 +1,4 @@
+Record "stamp" dependency. It reads stdin and stores its hash
+in the dependency database. It is not used anyhow, it is dummy.
+Read about [Stamping] in the FAQ. It is left only for
+compatibility with some other implementations.
diff --git a/doc/cmd/redo-targets b/doc/cmd/redo-targets
new file mode 100644 (file)
index 0000000..10ad2dc
--- /dev/null
@@ -0,0 +1 @@
+Show all known targets, possibly limited by specified directories.
diff --git a/doc/cmd/redo-whichdo b/doc/cmd/redo-whichdo
new file mode 100644 (file)
index 0000000..82f0891
--- /dev/null
@@ -0,0 +1,16 @@
+Display .do search paths for specified target (similar to apenwarr/redo):
+
+    $ redo-whichdo x/y/a.b.o
+    x/y/a.b.o.do
+    x/y/default.b.o.do
+    x/y/default.o.do
+    x/y/default.do
+    x/default.b.o.do
+    x/default.o.do
+    x/default.do
+    default.b.o.do
+    default.o.do
+    default.do
+    ../default.b.o.do
+    ../default.o.do
+    ../default.do
diff --git a/doc/cmds.texi b/doc/cmds.texi
deleted file mode 100644 (file)
index 6507eca..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-@node Commands
-@unnumbered Commands
-
-There are three basic main commands, originally suggested by DJB in his
-articles:
-
-@table @command
-@pindex redo
-@item redo
-    Forcefully and sequentially build specified targets. This is the
-    main command you will explicitly use from the command line. If no
-    targets are given, then @file{all} target will be used by default.
-
-@pindex redo-ifchange
-@item redo-ifchange
-    Rebuild specified targets if they are out-of-date and record them as
-    a dependency for the currently run target. This is the main command
-    you will use in @file{.do} files.
-
-@pindex redo-ifcreate
-@item redo-ifcreate
-    Record the non-existent file dependency for the currently run
-    target. Target will be rebuilt if any of the given files appear. Can
-    be used only inside @file{.do} file.
-@end table
-
-Pay attention that @command{redo-ifchange} enables parallel builds of
-the given targets, but ordinary @command{redo} is not: it builds
-specified targets sequentially and stops when error happens.
-
-@cindex tracing
-@option{-x} option can be used to enable tracing (@code{set -x}) of the
-currently run shell script @file{.do} file. @option{-xx} option enables
-tracing for all invoked @file{.do} files further.
-
-@cindex parallel build
-With @option{-j} option you can enable parallel builds, probably with an
-infinite number of workers (@code{=0}). Also you can set
-@env{$REDO_JOBS} to automatically apply that setting globally.
-
-Read about @ref{Logs, log storage capabilities}.
-
-@cindex debug
-@vindex REDO_LOG_PID
-@vindex REDO_DEBUG
-@option{-log-pid} (@env{$REDO_LOG_PID=1}) can be used to prefix job's
-@code{stderr} with the PID, that could be useful during parallel builds.
-@option{-d} (@env{$REDO_DEBUG=1}) enables debug messages.
-
-@cindex progress
-@vindex REDO_NO_PROGRESS
-@vindex REDO_NO_STATUS
-@vindex NO_COLOR
-@option{-no-progress} (@env{$REDO_NO_PROGRESS=1}) and
-@option{-no-status} (@env{$REDO_NO_STATUS=1}) disable statusline and
-progress display. @env{$NO_COLOR=1} disables progress/debug messages
-colouring.
-
-@cindex fsync
-@vindex REDO_NO_SYNC
-By default all build commands use @code{fsync} to assure data is reached
-the disk. You can disable its usage with @env{$REDO_NO_SYNC=1}
-environment variable, for speeding up the build process.
-
-@vindex REDO_STOP_IF_MODIFIED
-If redo sees some target modified externally, then by default it warns
-user about that, does not build that target, but continues the build
-process further. That is convenient in most cases: you can build your
-project with manual targets alterings, without touching possibly more
-complicated @file{.do} files. With @env{$REDO_STOP_IF_MODIFIED=1} redo
-won't continue and will exit with failure message.
-
-There are other commands that could be found in other implementations too:
-
-@table @command
-@pindex redo-always
-@item redo-always
-    Record current target as an always-do dependency. By definition it
-    should be always build. @command{goredo} tries to build it once per
-    @strong{run}.
-
-@pindex redo-stamp
-@item redo-stamp
-    Record "stamp" dependency. It reads @code{stdin} and stores its hash
-    in the dependency database. It is not used anyhow, it is dummy. Read
-    about @ref{Stamping, stamping} in the FAQ. It is left only for
-    compatibility with some other implementations.
-
-@pindex redo-targets
-@pindex redo-ood
-@item redo-targets, redo-ood
-    Show all known targets, possibly limited by specified directories.
-    @command{redo-ood} shows only the out-of-date ones.
-
-@pindex redo-sources
-@item redo-sources
-    Recursively show all source files the given targets depend on.
-
-@pindex redo-affects
-@item redo-affects
-    It is not in other distributions, but it is some kind of opposite of
-    @command{redo-sources} -- shows the targets that will be affected by
-    specified files change.
-@end table
-
-And there are some maintenance and debug commands:
-
-@table @command
-@pindex redo-cleanup
-@item redo-cleanup
-    Removes either temporary (@option{tmp}), log files (@option{log}),
-    lock files (@option{lock}), or everything related to @command{goredo}
-    (@option{full}).
-
-@pindex redo-whichdo
-@item redo-whichdo
-    Display @file{.do} search paths for specified target (similar to
-    @command{apenwarr/redo}):
-@example
-$ redo-whichdo x/y/a.b.o
-x/y/a.b.o.do
-x/y/default.b.o.do
-x/y/default.o.do
-x/y/default.do
-x/default.b.o.do
-x/default.o.do
-x/default.do
-default.b.o.do
-default.o.do
-default.do
-../default.b.o.do
-../default.o.do
-../default.do
-@end example
-
-@pindex redo-dot
-@item redo-dot
-    Dependency
-    @url{https://en.wikipedia.org/wiki/DOT_(graph_description_language), DOT}
-    graph generator. For example to visualize your dependencies with GraphViz:
-@example
-$ redo target [...] # to assure that **/.redo/*.dep are filled up
-$ redo-dot target [...] >whatever.dot
-$ dot -Tpng whatever.dot >whatever.png # possibly add -Gsplines=ortho
-@end example
-
-@pindex redo-depfix
-@item redo-depfix
-    When you copy your worktree to different place, then copied files
-    ctime will change. And because recorded dependency information
-    differs from updated ctimes, out-of-date algorithm will fallback to
-    rereading the whole files for hash calculation, that is much slower.
-    If you do not want to rebuild your targets from the ground, then
-    @command{redo-depfix} can traverse through all dependency files and
-    recalculate dependency information.
-
-    Also if it finds legacy @command{.rec} dependency files, it converts
-    them to binary format.
-
-@pindex redo-dep2rec
-@item redo-dep2rec
-    Convert specified @file{.dep} file to recfile on stdout.
-    Aimed to be used mainly for debugging purposes.
-
-@end table
diff --git a/doc/download.texi b/doc/download.texi
deleted file mode 100644 (file)
index c9c643b..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-@multitable {XXXXX} {XXXX-XX-XX} {XXXX KiB} {meta4 tar pgp ssh}
-@headitem Version @tab Date @tab Size @tab Tarball
-
-@item @ref{Release 2_8_0, 2.8.0} @tab 2025-12-16 @tab 479 KiB @tab
-@url{download/goredo-2.8.0.tar.zst.meta4, meta4}
-@url{download/goredo-2.8.0.tar.zst, tar}
-@url{download/goredo-2.8.0.tar.zst.asc, pgp}
-@url{download/goredo-2.8.0.tar.zst.sig, ssh}
-
-@item @ref{Release 2_6_5, 2.6.5} @tab 2025-10-26 @tab 478 KiB @tab
-@url{download/goredo-2.6.5.tar.zst.meta4, meta4}
-@url{download/goredo-2.6.5.tar.zst, tar}
-@url{download/goredo-2.6.5.tar.zst.asc, pgp}
-@url{download/goredo-2.6.5.tar.zst.sig, ssh}
-
-@item @ref{Release 2_6_4, 2.6.4} @tab 2025-01-04 @tab 471 KiB @tab
-@url{download/goredo-2.6.4.tar.zst.meta4, meta4}
-@url{download/goredo-2.6.4.tar.zst, tar}
-@url{download/goredo-2.6.4.tar.zst.asc, pgp}
-@url{download/goredo-2.6.4.tar.zst.sig, ssh}
-
-@item @ref{Release 2_6_3, 2.6.3} @tab 2024-11-24 @tab 471 KiB @tab
-@url{download/goredo-2.6.3.tar.zst.meta4, meta4}
-@url{download/goredo-2.6.3.tar.zst, tar}
-@url{download/goredo-2.6.3.tar.zst.asc, pgp}
-@url{download/goredo-2.6.3.tar.zst.sig, ssh}
-
-@item @ref{Release 2_6_2, 2.6.2} @tab 2024-02-29 @tab 455 KiB @tab
-@url{download/goredo-2.6.2.tar.zst.meta4, meta4}
-@url{download/goredo-2.6.2.tar.zst, tar}
-@url{download/goredo-2.6.2.tar.zst.asc, pgp}
-@url{download/goredo-2.6.2.tar.zst.sig, ssh}
-
-@item @ref{Release 2_6_1, 2.6.1} @tab 2024-02-19 @tab 455 KiB @tab
-@url{download/goredo-2.6.1.tar.zst.meta4, meta4}
-@url{download/goredo-2.6.1.tar.zst, tar}
-@url{download/goredo-2.6.1.tar.zst.asc, pgp}
-@url{download/goredo-2.6.1.tar.zst.sig, ssh}
-
-@item @ref{Release 2_6_0, 2.6.0} @tab 2023-12-19 @tab 455 KiB @tab
-@url{download/goredo-2.6.0.tar.zst.meta4, meta4}
-@url{download/goredo-2.6.0.tar.zst, tar}
-@url{download/goredo-2.6.0.tar.zst.asc, pgp}
-@url{download/goredo-2.6.0.tar.zst.sig, ssh}
-
-@item @ref{Release 2_5_0, 2.5.0} @tab 2023-11-26 @tab 455 KiB @tab
-@url{download/goredo-2.5.0.tar.zst.meta4, meta4}
-@url{download/goredo-2.5.0.tar.zst, tar}
-@url{download/goredo-2.5.0.tar.zst.asc, pgp}
-@url{download/goredo-2.5.0.tar.zst.sig, ssh}
-
-@item @ref{Release 2_4_0, 2.4.0} @tab 2023-11-17 @tab 455 KiB @tab
-@url{download/goredo-2.4.0.tar.zst.meta4, meta4}
-@url{download/goredo-2.4.0.tar.zst, tar}
-@url{download/goredo-2.4.0.tar.zst.asc, pgp}
-@url{download/goredo-2.4.0.tar.zst.sig, ssh}
-
-@item @ref{Release 2_3_0, 2.3.0} @tab 2023-11-11 @tab 455 KiB @tab
-@url{download/goredo-2.3.0.tar.zst.meta4, meta4}
-@url{download/goredo-2.3.0.tar.zst, tar}
-@url{download/goredo-2.3.0.tar.zst.asc, pgp}
-@url{download/goredo-2.3.0.tar.zst.sig, ssh}
-
-@item @ref{Release 2_2_0, 2.2.0} @tab 2023-10-16 @tab 455 KiB @tab
-@url{download/goredo-2.2.0.tar.zst.meta4, meta4}
-@url{download/goredo-2.2.0.tar.zst, tar}
-@url{download/goredo-2.2.0.tar.zst.asc, pgp}
-@url{download/goredo-2.2.0.tar.zst.sig, ssh}
-
-@item @ref{Release 2_1_0, 2.1.0} @tab 2023-10-09 @tab 455 KiB @tab
-@url{download/goredo-2.1.0.tar.zst.meta4, meta4}
-@url{download/goredo-2.1.0.tar.zst, tar}
-@url{download/goredo-2.1.0.tar.zst.asc, pgp}
-@url{download/goredo-2.1.0.tar.zst.sig, ssh}
-
-@item @ref{Release 2_0_0, 2.0.0} @tab 2023-10-08 @tab 455 KiB @tab
-@url{download/goredo-2.0.0.tar.zst.meta4, meta4}
-@url{download/goredo-2.0.0.tar.zst, tar}
-@url{download/goredo-2.0.0.tar.zst.asc, pgp}
-@url{download/goredo-2.0.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_32_0, 1.32.0} @tab 2023-09-25 @tab 439 KiB @tab
-@url{download/goredo-1.32.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.32.0.tar.zst, tar}
-@url{download/goredo-1.32.0.tar.zst.asc, pgp}
-@url{download/goredo-1.32.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_31_0, 1.31.0} @tab 2023-09-23 @tab 439 KiB @tab
-@url{download/goredo-1.31.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.31.0.tar.zst, tar}
-@url{download/goredo-1.31.0.tar.zst.asc, pgp}
-@url{download/goredo-1.31.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_30_0, 1.30.0} @tab 2023-01-18 @tab 431 KiB @tab
-@url{download/goredo-1.30.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.30.0.tar.zst, tar}
-@url{download/goredo-1.30.0.tar.zst.asc, pgp}
-@url{download/goredo-1.30.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_29_0, 1.29.0} @tab 2023-01-17 @tab 431 KiB @tab
-@url{download/goredo-1.29.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.29.0.tar.zst, tar}
-@url{download/goredo-1.29.0.tar.zst.asc, pgp}
-@url{download/goredo-1.29.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_28_0, 1.28.0} @tab 2022-11-14 @tab 429 KiB @tab
-@url{download/goredo-1.28.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.28.0.tar.zst, tar}
-@url{download/goredo-1.28.0.tar.zst.asc, pgp}
-@url{download/goredo-1.28.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_27_1, 1.27.1} @tab 2022-09-09 @tab 424 KiB @tab
-@url{download/goredo-1.27.1.tar.zst.meta4, meta4}
-@url{download/goredo-1.27.1.tar.zst, tar}
-@url{download/goredo-1.27.1.tar.zst.asc, pgp}
-@url{download/goredo-1.27.1.tar.zst.sig, ssh}
-
-@item @ref{Release 1_27_0, 1.27.0} @tab 2022-08-28 @tab 424 KiB @tab
-@url{download/goredo-1.27.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.27.0.tar.zst, tar}
-@url{download/goredo-1.27.0.tar.zst.asc, pgp}
-@url{download/goredo-1.27.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_26_0, 1.26.0} @tab 2022-08-26 @tab 424 KiB @tab
-@url{download/goredo-1.26.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.26.0.tar.zst, tar}
-@url{download/goredo-1.26.0.tar.zst.asc, pgp}
-@url{download/goredo-1.26.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_25_0, 1.25.0} @tab 2022-05-08 @tab 402 KiB @tab
-@url{download/goredo-1.25.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.25.0.tar.zst, tar}
-@url{download/goredo-1.25.0.tar.zst.asc, pgp}
-@url{download/goredo-1.25.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_24_0, 1.24.0} @tab 2022-03-01 @tab 401 KiB @tab
-@url{download/goredo-1.24.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.24.0.tar.zst, tar}
-@url{download/goredo-1.24.0.tar.zst.asc, pgp}
-@url{download/goredo-1.24.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_23_0, 1.23.0} @tab 2022-02-23 @tab 401 KiB @tab
-@url{download/goredo-1.23.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.23.0.tar.zst, tar}
-@url{download/goredo-1.23.0.tar.zst.asc, pgp}
-@url{download/goredo-1.23.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_22_0, 1.22.0} @tab 2022-01-26 @tab 388 KiB @tab
-@url{download/goredo-1.22.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.22.0.tar.zst, tar}
-@url{download/goredo-1.22.0.tar.zst.asc, pgp}
-@url{download/goredo-1.22.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_21_0, 1.21.0} @tab 2021-11-20 @tab 387 KiB @tab
-@url{download/goredo-1.21.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.21.0.tar.zst, tar}
-@url{download/goredo-1.21.0.tar.zst.asc, pgp}
-@url{download/goredo-1.21.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_20_0, 1.20.0} @tab 2021-11-19 @tab 385 KiB @tab
-@url{download/goredo-1.20.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.20.0.tar.zst, tar}
-@url{download/goredo-1.20.0.tar.zst.asc, pgp}
-@url{download/goredo-1.20.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_19_0, 1.19.0} @tab 2021-11-09 @tab 385 KiB @tab
-@url{download/goredo-1.19.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.19.0.tar.zst, tar}
-@url{download/goredo-1.19.0.tar.zst.asc, pgp}
-@url{download/goredo-1.19.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_18_0, 1.18.0} @tab 2021-10-27 @tab 388 KiB @tab
-@url{download/goredo-1.18.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.18.0.tar.zst, tar}
-@url{download/goredo-1.18.0.tar.zst.asc, pgp}
-@url{download/goredo-1.18.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_17_0, 1.17.0} @tab 2021-10-19 @tab 387 KiB @tab
-@url{download/goredo-1.17.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.17.0.tar.zst, tar}
-@url{download/goredo-1.17.0.tar.zst.asc, pgp}
-@url{download/goredo-1.17.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_16_0, 1.16.0} @tab 2021-10-14 @tab 387 KiB @tab
-@url{download/goredo-1.16.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.16.0.tar.zst, tar}
-@url{download/goredo-1.16.0.tar.zst.asc, pgp}
-@url{download/goredo-1.16.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_15_0, 1.15.0} @tab 2021-09-30 @tab 392 KiB @tab
-@url{download/goredo-1.15.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.15.0.tar.zst, tar}
-@url{download/goredo-1.15.0.tar.zst.asc, pgp}
-@url{download/goredo-1.15.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_14_0, 1.14.0} @tab 2021-09-15 @tab 392 KiB @tab
-@url{download/goredo-1.14.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.14.0.tar.zst, tar}
-@url{download/goredo-1.14.0.tar.zst.asc, pgp}
-@url{download/goredo-1.14.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_13_0, 1.13.0} @tab 2021-08-06 @tab 392 KiB @tab
-@url{download/goredo-1.13.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.13.0.tar.zst, tar}
-@url{download/goredo-1.13.0.tar.zst.asc, pgp}
-@url{download/goredo-1.13.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_12_0, 1.12.0} @tab 2021-08-01 @tab 392 KiB @tab
-@url{download/goredo-1.12.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.12.0.tar.zst, tar}
-@url{download/goredo-1.12.0.tar.zst.asc, pgp}
-@url{download/goredo-1.12.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_11_0, 1.11.0} @tab 2021-08-01 @tab 392 KiB @tab
-@url{download/goredo-1.11.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.11.0.tar.zst, tar}
-@url{download/goredo-1.11.0.tar.zst.asc, pgp}
-@url{download/goredo-1.11.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_10_0, 1.10.0} @tab 2021-08-01 @tab 392 KiB @tab
-@url{download/goredo-1.10.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.10.0.tar.zst, tar}
-@url{download/goredo-1.10.0.tar.zst.asc, pgp}
-@url{download/goredo-1.10.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_9_0, 1.9.0} @tab 2021-07-31 @tab 392 KiB @tab
-@url{download/goredo-1.9.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.9.0.tar.zst, tar}
-@url{download/goredo-1.9.0.tar.zst.asc, pgp}
-@url{download/goredo-1.9.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_8_0, 1.8.0} @tab 2021-07-02 @tab 389 KiB @tab
-@url{download/goredo-1.8.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.8.0.tar.zst, tar}
-@url{download/goredo-1.8.0.tar.zst.asc, pgp}
-@url{download/goredo-1.8.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_7_0, 1.7.0} @tab 2021-06-23 @tab 389 KiB @tab
-@url{download/goredo-1.7.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.7.0.tar.zst, tar}
-@url{download/goredo-1.7.0.tar.zst.asc, pgp}
-@url{download/goredo-1.7.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_6_0, 1.6.0} @tab 2021-06-22 @tab 387 KiB @tab
-@url{download/goredo-1.6.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.6.0.tar.zst, tar}
-@url{download/goredo-1.6.0.tar.zst.asc, pgp}
-@url{download/goredo-1.6.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_5_0, 1.5.0} @tab 2021-06-21 @tab 387 KiB @tab
-@url{download/goredo-1.5.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.5.0.tar.zst, tar}
-@url{download/goredo-1.5.0.tar.zst.asc, pgp}
-@url{download/goredo-1.5.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_4_1, 1.4.1} @tab 2021-04-29 @tab 383 KiB @tab
-@url{download/goredo-1.4.1.tar.zst.meta4, meta4}
-@url{download/goredo-1.4.1.tar.zst, tar}
-@url{download/goredo-1.4.1.tar.zst.asc, pgp}
-@url{download/goredo-1.4.1.tar.zst.sig, ssh}
-
-@item @ref{Release 1_4_0, 1.4.0} @tab 2021-04-29 @tab 383 KiB @tab
-@url{download/goredo-1.4.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.4.0.tar.zst, tar}
-@url{download/goredo-1.4.0.tar.zst.asc, pgp}
-@url{download/goredo-1.4.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_3_0, 1.3.0} @tab 2021-02-15 @tab 339 KiB @tab
-@url{download/goredo-1.3.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.3.0.tar.zst, tar}
-@url{download/goredo-1.3.0.tar.zst.asc, pgp}
-@url{download/goredo-1.3.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_2_0, 1.2.0} @tab 2021-01-29 @tab 338 KiB @tab
-@url{download/goredo-1.2.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.2.0.tar.zst, tar}
-@url{download/goredo-1.2.0.tar.zst.asc, pgp}
-@url{download/goredo-1.2.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_1_0, 1.1.0} @tab 2021-01-24 @tab 338 KiB @tab
-@url{download/goredo-1.1.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.1.0.tar.zst, tar}
-@url{download/goredo-1.1.0.tar.zst.asc, pgp}
-@url{download/goredo-1.1.0.tar.zst.sig, ssh}
-
-@item @ref{Release 1_0_0, 1.0.0} @tab 2021-01-16 @tab 338 KiB @tab
-@url{download/goredo-1.0.0.tar.zst.meta4, meta4}
-@url{download/goredo-1.0.0.tar.zst, tar}
-@url{download/goredo-1.0.0.tar.zst.asc, pgp}
-@url{download/goredo-1.0.0.tar.zst.sig, ssh}
-
-@item @ref{Release 0_12_3, 0.12.3} @tab 2021-01-13 @tab 336 KiB @tab
-@url{download/goredo-0.12.3.tar.zst.meta4, meta4}
-@url{download/goredo-0.12.3.tar.zst, tar}
-@url{download/goredo-0.12.3.tar.zst.asc, pgp}
-@url{download/goredo-0.12.3.tar.zst.sig, ssh}
-
-@item @ref{Release 0_12_2, 0.12.2} @tab 2021-01-13 @tab 336 KiB @tab
-@url{download/goredo-0.12.2.tar.zst.meta4, meta4}
-@url{download/goredo-0.12.2.tar.zst, tar}
-@url{download/goredo-0.12.2.tar.zst.asc, pgp}
-@url{download/goredo-0.12.2.tar.zst.sig, ssh}
-
-@item @ref{Release 0_12_1, 0.12.1} @tab 2021-01-13 @tab 336 KiB @tab
-@url{download/goredo-0.12.1.tar.zst.meta4, meta4}
-@url{download/goredo-0.12.1.tar.zst, tar}
-@url{download/goredo-0.12.1.tar.zst.asc, pgp}
-@url{download/goredo-0.12.1.tar.zst.sig, ssh}
-
-@item @ref{Release 0_12_0, 0.12.0} @tab 2021-01-12 @tab 379 KiB @tab
-@url{download/goredo-0.12.0.tar.zst.meta4, meta4}
-@url{download/goredo-0.12.0.tar.zst, tar}
-@url{download/goredo-0.12.0.tar.zst.asc, pgp}
-@url{download/goredo-0.12.0.tar.zst.sig, ssh}
-
-@item @ref{Release 0_11_0, 0.11.0} @tab 2021-01-10 @tab 379 KiB @tab
-@url{download/goredo-0.11.0.tar.zst.meta4, meta4}
-@url{download/goredo-0.11.0.tar.zst, tar}
-@url{download/goredo-0.11.0.tar.zst.asc, pgp}
-@url{download/goredo-0.11.0.tar.zst.sig, ssh}
-
-@item @ref{Release 0_10_0, 0.10.0} @tab 2021-01-09 @tab 436 KiB @tab
-@url{download/goredo-0.10.0.tar.zst.meta4, meta4}
-@url{download/goredo-0.10.0.tar.zst, tar}
-@url{download/goredo-0.10.0.tar.zst.asc, pgp}
-@url{download/goredo-0.10.0.tar.zst.sig, ssh}
-
-@end multitable
diff --git a/doc/faq.texi b/doc/faq.texi
deleted file mode 100644 (file)
index 5f15fd2..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-@node FAQ
-@cindex FAQ
-@unnumbered FAQ
-
-@anchor{Stamping}
-@cindex hashing
-@cindex stamping
-@section Hashing and stamping
-
-All targets are checksummed if target's size, @code{ctime}/@code{mtime}
-differs from the previous one (depending on @ref{OOD, @env{$REDO_INODE_TRUST}}
-value). @command{apenwarr/redo} gives
-@url{https://redo.readthedocs.io/en/latest/FAQImpl/#why-not-always-use-checksum-based-dependencies-instead-of-timestamps, many reasons}
-why every time checksumming is bad, but in my opinion in practice all of
-them do not apply.
-
-@itemize
-@item Aggregate targets and willing to be out-of-date ones just must not
-  produce empty output files. @command{apenwarr/*}, @command{redo-c} and
-  @command{goredo} implementations treat non existing file as an
-  out-of-date target
-@item If you really wish to produce an empty target file, just touch @file{$3}
-@end itemize
-
-Those who create an empty file if no @file{stdout} was written -- are
-failed implementations.
-
-redo is a tool to help people. Literally all targets can be safely
-@code{redo-stamp <$3}-ed, reducing false positive out-of-dates. Of
-course, with the correct @file{stdout}/@file{$3} working and placing
-necessary results in @file{$3}, instead of just silently feeding them in
-@command{redo-stamp}.
-
-redo implementations already automatically record -ifchange on
-@file{.do} files and -ifcreate on non-existing @file{.do} files. So why
-they can not record @command{redo-stamp} the same way implicitly? No,
-Zen of Python is not applicable there, because -ifchange/-ifcreate
-contradicts it already.
-
-Modern cryptographic hash algorithms and CPUs are so fast, that even all
-read and writes to or from hard drive arrays can be easily checksummed
-and transparently compressed, as ZFS with LZ4/Zstandard and
-Skein/BLAKE[23] algorithms demonstrate us.
-
-@command{goredo} includes @command{redo-stamp}, that really records the
-stamp in the @file{.dep} file, but it does not play any role later. It
-is stayed just for compatibility.
-
-@section Can removed .do lead to permanent errors of its non existence?
-
-Yes, because dependency on it was recorded previously. Is it safe to
-assume that @file{.do}-less target now is an ordinary source-file? I
-have no confidence in such behaviour. So it is user's decision how to
-deal with it, probably it was just his inaccuracy mistake. If you really
-want to get rid of that dependency knowledge for @file{foo/bar} target,
-then remove @file{foo/.redo/bar.dep}.
-
-@section Does redo-always always rebuilds target?
-
-By definition, it should be built always, as
-@url{http://news.dieweltistgarnichtso.net/bin/redo-sh.html#why-built-twice,
-redo-sh} and @command{redo-c} implementations do. But that ruins the
-whole redo usability, potentially rebuilding everything again and again.
-@command{apenwarr/redo} and @command{goredo} tries to build
-always-targets only once per @strong{run}, as a some kind of optimization.
-
-For example if you need to rebuild TeX documents (case mentioned in
-redo-sh's FAQ) until all references and numbers are ready, then you must
-naturally expectedly explicitly use while cycle in your @file{.do}, as
-@command{apenwarr/redo} already suggests.
-
-@section What to do with OOD targets, that has not changed their output?
-
-How to prevent building of targets, who depend on the OOD target, that
-produced the same output? If the target is already decided to be OOD,
-then the whole tree becomes OOD too. It is clear, simple, reliable and
-honest way of do-ing things.
-
-Building of the lower level OOD target first is unfair and dishonest
-thing to do, because probably top level target, being the OOD, won't be
-dependant on lower level target anymore at all. Actually @command{goredo}
-does this as a shameful hack and only for always-targets, still existing
-in the wild. The whole @command{redo-always} idea is considered harmful.
-
-If you wish to run something and decide if it must OOD the toplevel
-targets, then just run @command{redo} to forcefully rebuild it and then
-run the ordinary top level targets.
diff --git a/doc/features.texi b/doc/features.texi
deleted file mode 100644 (file)
index 4d4c9a3..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-@node Features
-@cindex features
-@unnumbered Features
-
-Notable features that differentiate @command{goredo} from many other
-implementations.
-
-@itemize
-
-@item explicit useful and convenient checks from @command{apenwarr/redo}:
-    @itemize
-    @item check that @file{$1} was not touched during .do execution
-    @item check that @file{stdout} and @file{$3} are not written simultaneously
-    @item check that generated target was not modified "externally" outside
-      the redo, preventing its overwriting, but continuing the build
-      (optionally can stop)
-    @end itemize
-@item recursive, indented and serialized logs display ability, with
-    priority to the depth and bad return codes, like in @command{apenwarr/redo},
-    thanks to @url{https://apenwarr.ca/log/20181106, apenwarr's article}
-@item all environment variables, working directory, command line
-    arguments, start/finish times, duration, participated PIDs, return
-    codes can be saved for later investigation
-@item targets, dependency information and their directories are explicitly
-  synced (can be disabled, should work faster)
-@item file's change is detected by comparing its size, and
-    @url{https://github.com/BLAKE3-team/BLAKE3, BLAKE3} hash. Also as an
-    optimization, by default if file's @code{ctime} is same, then hash
-    check is skipped. Optionally you can disable that behaviour, or even
-    enable trust to file's @code{mtime}
-@item files creation is @code{umask}-friendly (unlike @code{mkstemp()}
-    used in @command{redo-c})
-@item parallel build with jobs limit, optionally in infinite mode
-@item optional coloured messages
-@item verbose debug messages, including out-of-date determination, PIDs,
-  lock and jobserver acquirings/releases
-@item displaying of each target's execution time
-@item each target's @file{stderr} can be prefixed with the PID
-@item optional statusline with currently running/waiting/done jobs
-@item target's @file{stderr} can be stored on the disk with
-    @url{http://cr.yp.to/libtai/tai64.html, TAI64N} timestamp prefixes
-    for each line. To convert them to localtime you can use either
-    @command{tai64nlocal} utility from
-    @url{http://cr.yp.to/daemontools.html, daemontools}, or similar one:
-    @code{go install go.cypherpunks.su/tai64n/v4/cmd/tai64nlocal@@latest}
-@item Either @url{https://www.gnu.org/software/make/, GNU Make}
-    or @url{http://netbsd.org/, NetBSD}'s @command{bmake}
-    @ref{Jobserver, jobserver} compatibility support
-
-@end itemize
diff --git a/doc/goredo.info.do b/doc/goredo.info.do
deleted file mode 100644 (file)
index ceb2617..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-redo-ifchange *.texi ../VERSION
-${MAKEINFO:-makeinfo} \
-    -D "VERSION `cat ../VERSION`" \
-    --set-customization-variable SECTION_NAME_IN_TITLE=1 \
-    --set-customization-variable TREE_TRANSFORMATIONS=complete_tree_nodes_menus \
-    --set-customization-variable ASCII_PUNCTUATION=1 \
-    --output $3 index.texi
diff --git a/doc/index b/doc/index
new file mode 100644 (file)
index 0000000..c859bf0
--- /dev/null
+++ b/doc/index
@@ -0,0 +1,43 @@
+Go implementation of
+=> http://cr.yp.to/redo.html djb's redo\r
+Makefile replacement that sucks less. redo is recursive general-purpose
+build system, that is simple, flexible and easier to use.
+=> https://suckless.org/philosophy/ suckless philosophy\r
+
+Originally it was just a rewrite of redo-c, but later most features of
+apenwarr/redo were also implemented. Why yet another implementation? It
+is feature full and has better performance comparing to shell and Python
+implementation.
+=> https://github.com/leahneukirchen/redo-c redo-c\r
+=> https://redo.readthedocs.io/en/latest/ apenwarr/redo\r
+
+It passes tests from redo-sh and apenwarr/redo's implementation-neutral ones.
+=> http://news.dieweltistgarnichtso.net/bin/redo-sh.html redo-sh\r
+
+If you are not familiar with the redo, here are advisable links to read:
+
+=> https://redo.readthedocs.io/en/latest/ apenwarr/redo documentation\r
+=> http://jdebp.uk/FGA/introduction-to-redo.html Introduction to redo\r
+=> https://apenwarr.ca/log/20101214 The only build system that might someday replace make... is djb redo\r
+=> https://habr.com/ru/articles/517490/ Make на мыло, redo сила (in russian)\r
+=> gemini://ew.srht.site/en/2022/20221218-redo-0.gmi ~ew's descriptive intro with many examples\r
+
+goredo is
+=> https://www.gnu.org/licenses/gpl-3.0.html GNU GPLv3\r
+=> https://www.gnu.org/philosophy/pragmatic.html copylefted\r
+=> https://www.gnu.org/philosophy/free-sw.html free software\r
+It should work on all POSIX-compatible systems.
+
+                            [NEWS] [INSTALL]
+                           [Features] [Notes]
+                     Usage [Rules], list of [cmd/]s
+                        [Env]ironment variables
+                              [FAQ/] [OOD]
+                          [State] [Jobserver]
+                                [THANKS]
+
+Please send questions, bug reports and patches to
+=> http://lists.cypherpunks.su/goredo-devel.html goredo-devel maillist\r
+Announcements also go to this mailing list.
+
+Copyright (C) 2020-2026 Sergey Matveev
diff --git a/doc/index.texi b/doc/index.texi
deleted file mode 100644 (file)
index 4dc523b..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-\input texinfo
-@settitle goredo
-
-@copying
-Copyright @copyright{} 2020-2026 @email{stargrave@@stargrave.org, Sergey Matveev}
-@end copying
-
-@node Top
-@top goredo
-
-@url{https://go.dev/, Go} implementation of
-@url{http://cr.yp.to/redo.html, djb's redo},
-Makefile replacement that @url{https://suckless.org/philosophy/, sucks less}.
-@command{redo} is recursive general-purpose build system, that is simple,
-flexible and easier to use.
-
-Originally it was just a rewrite of
-@url{https://github.com/leahneukirchen/redo-c, redo-c}, but later most
-features of @url{https://redo.readthedocs.io/en/latest/, apenwarr/redo}
-were also implemented. Why yet another implementation? It is feature
-full and has better performance comparing to shell and Python
-implementation.
-
-It passes tests from
-@url{http://news.dieweltistgarnichtso.net/bin/redo-sh.html, redo-sh.tests}
-and implementation-neutral ones from @command{apenwarr/redo}.
-
-If you are not familiar with the redo, here are advisable links to read:
-
-@itemize
-@item @url{https://redo.readthedocs.io/en/latest/, apenwarr/redo documentation}
-@item @url{http://jdebp.uk/FGA/introduction-to-redo.html, Introduction to redo}
-@item @url{https://apenwarr.ca/log/20101214, The only build system that might someday replace make... is djb redo}
-@item @url{https://habr.com/ru/articles/517490/,, Make на мыло, redo сила} (in russian)
-@item @url{gemini://ew.srht.site/en/2022/20221218-redo-0.gmi, ~ew's descriptive intro with many examples}
-@end itemize
-
-@command{goredo} is
-@url{https://www.gnu.org/philosophy/pragmatic.html, copylefted}
-@url{https://www.gnu.org/philosophy/free-sw.html, free software}
-licenced under @url{https://www.gnu.org/licenses/gpl-3.0.html, GNU GPLv3}.
-It should work on all
-@url{https://en.wikipedia.org/wiki/POSIX, POSIX}-compatible systems.
-
-@cindex contacts
-@cindex bugs
-@cindex patches
-Please send questions, bug reports and patches to
-@url{http://lists.cypherpunks.su/goredo-devel.html, goredo-devel}
-maillist. Announcements also go to this mailing list.
-
-@insertcopying
-
-@include features.texi
-@include notes.texi
-@include rules.texi
-@include cmds.texi
-@include ood.texi
-@include logs.texi
-@include news.texi
-@include install.texi
-@include faq.texi
-@include state.texi
-@include jobserver.texi
-@include thanks.texi
-
-@node Indices
-@unnumbered Indices
-
-@node Concepts Index
-@section Concepts Index
-@printindex cp
-
-@node Programs Index
-@section Programs Index
-@printindex pg
-
-@node Variables Index
-@section Variables Index
-@printindex vr
-
-@bye
diff --git a/doc/install.texi b/doc/install.texi
deleted file mode 100644 (file)
index f1222cd..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-@node Install
-@cindex install
-@cindex packages
-@cindex ports
-@cindex tarball
-@cindex download
-@cindex PGP
-@unnumbered Install
-
-Possibly @command{goredo} package already exists for your distribution:
-@itemize
-
-@cindex ALT Linux
-@item ALT Linux @url{https://packages.altlinux.org/en/sisyphus/srpms/goredo/, Sisyphus}
-
-@cindex Arch Linux
-@item Arch Linux @url{https://aur.archlinux.org/packages/goredo, AUR}
-
-@cindex container image
-@item Container @url{https://github.com/rdavid/goredoer, image}
-
-@cindex Fedora
-@item Fedora @url{https://github.com/rpmsphere/source/tree/master/g, RPM Sphere}
-
-@cindex FreeBSD
-@item @url{https://www.freshports.org/devel/goredo/, FreeBSD ports}
-
-@cindex Homebrew
-@cindex macOS
-@item macOS @url{https://formulae.brew.sh/formula/goredo, Homebrew}
-
-@cindex NetBSD
-@item @url{https://pkgsrc.se/devel/goredo, NetBSD package}
-
-@cindex NixOS
-@item @url{https://github.com/NixOS/nixpkgs/tree/master/pkgs/by-name/go/goredo, NixOS packages}
-
-@end itemize
-
-Preferable way is to download tarball with the signature from website:
-
-@example
-$ [fetch|wget] http://www.goredo.cypherpunks.su/download/goredo-@value{VERSION}.tar.zst
-$ [fetch|wget] http://www.goredo.cypherpunks.su/download/goredo-@value{VERSION}.tar.zst.@{asc,sig@}
-[verify signature]
-$ zstd -d <goredo-@value{VERSION}.tar.zst | tar xf -
-$ cd goredo-@value{VERSION}/src
-$ go build -mod=vendor
-$ ./goredo -symlinks        # create redo-* commands symlinks
-$ export PATH=`pwd`:$PATH   # let your system know about goredo
-@end example
-
-@include download.texi
-@include integrity.texi
-
-@vindex GOPRIVATE
-If you have problems with @code{*.golang.org}'s inability to verify
-authenticity of @code{go.cypherpunks.su} TLS connection, then you can
-disable their usage by setting @env{$GOPRIVATE=go.cypherpunks.su}. You
-can override CA certificate file path with @env{$SSL_CERT_FILE} and
-@env{$GIT_SSL_CAINFO} environment variables.
-
-@cindex git
-You can obtain development source code with
-@command{git clone git://git.cypherpunks.su/goredo.git}.
-You can also use
-@code{anongit@@master.git.stargrave.org:cypherpunks.su/goredo.git},
-@code{anongit@@slave.git.stargrave.org:cypherpunks.su/goredo.git},
-@code{anongit@@master.git.cypherpunks.su:cypherpunks.su/goredo.git},
-@code{anongit@@slave.git.cypherpunks.su:cypherpunks.su/goredo.git},
-@url{git://git.stargrave.org/goredo.git},
-@url{git://y.git.stargrave.org/goredo.git},
-@url{git://y.git.cypherpunks.su/goredo.git} URLs instead.
-
-Also there is @url{https://yggdrasil-network.github.io/, Yggdrasil}
-accessible address: @url{http://y.www.goredo.cypherpunks.su/}.
diff --git a/doc/integrity.texi b/doc/integrity.texi
deleted file mode 100644 (file)
index 3dc5cf1..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-You @strong{have to} verify downloaded tarballs authenticity to be sure
-that you retrieved trusted and untampered software. There are two options:
-
-@table @asis
-
-@item @url{https://www.openpgp.org/, OpenPGP} @file{.asc} signature
-    Use @url{https://www.gnupg.org/, GNU Privacy Guard} free software
-    implementation.
-    For the very first time it is necessary to get signing public key and
-    import it. It is provided @url{PUBKEY-PGP.asc, here}, but you should
-    check alternate resources.
-
-@verbatim
-pub   ed25519/0x3A528DDE952C7E93 2021-01-09
-      7531BB84FAF0BF35960C63B93A528DDE952C7E93
-uid   goredo releases <goredo@cypherpunks.su>
-@end verbatim
-
-@example
-$ gpg --auto-key-locate dane --locate-keys goredo at cypherpunks dot su
-$ gpg --auto-key-locate  wkd --locate-keys goredo at cypherpunks dot su
-@end example
-
-@item @url{https://www.openssh.com/, OpenSSH} @file{.sig} signature
-    @url{PUBKEY-SSH.pub, Public key} and its OpenPGP
-    @url{PUBKEY-SSH.pub.asc, signature} made with the key above.
-    Its fingerprint: @code{SHA256:ddOaswnUBtNbuoEBYQtfcF59sR3Bvzo9pIfSlw9sKx8}.
-
-@example
-$ ssh-keygen -Y verify -f PUBKEY-SSH.pub -I goredo@@cypherpunks.su -n file \
-    -s goredo-@value{VERSION}.tar.zst.sig <goredo-@value{VERSION}.tar.zst
-@end example
-
-@end table
diff --git a/doc/jobserver.texi b/doc/jobserver.texi
deleted file mode 100644 (file)
index e1e7329..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-@node Jobserver
-@cindex jobserver
-@unnumbered Jobserver
-
-Parallel builds are made by utilizing the jobserver protocol. Each job
-have to take so called token and return it when it finishes. Jobserver
-creates the pipe, consisting of read and write files, that are passed
-to each @command{goredo} instance. Job takes the token by reading the
-single byte from that pipe, writing it back for returning. Pipe is
-pre-filled with required number of tokens.
-
-@pindex bmake
-@pindex gmake
-@command{goredo} can be integrated with
-@url{http://netbsd.org/, NetBSD}'s
-@url{http://www.crufty.net/help/sjg/bmake.htm, bmake} and
-@url{https://www.gnu.org/software/make/, GNU Make} (@command{gmake})
-jobserver protocol. All three of them use the same principle of
-jobserver, but different ways of passing pipe's file descriptors
-numbers to child process.
-
-@vindex REDO_MAKE
-@env{$REDO_MAKE} environment variable controls the compatibility behaviour:
-
-@table @command
-@item bmake
-Pass @code{-j 1 -J X,Y} arguments through @env{$MAKEFLAGS} variable.
-@item gmake
-Pass @code{--jobserver-auth=X,Y} arguments through @env{$MAKEFLAGS} variable.
-Beware that only @option{--jobserver-style=pipe} protocol is supported!
-@item none
-Pass @code{X,Y} arguments through @env{$REDO_JS_FD} variable.
-Used by default, if @env{$REDO_MAKE} is not set.
-@end table
diff --git a/doc/logs.texi b/doc/logs.texi
deleted file mode 100644 (file)
index 4da829f..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-@node Logs
-@cindex logging
-@unnumbered Logs
-
-@vindex REDO_LOGS
-@vindex REDO_SILENT
-@code{stderr} of the running targets can be kept on the disk by
-specifying @option{-k} option (or by setting @env{$REDO_LOGS=1}
-environment variable) to @command{redo}. You can simultaneously
-use also @option{-s} option (@env{$REDO_SILENT=1} environment variable)
-to silence @code{stderr} output, but still keeping it on the disk for
-possible further debug investigation. @strong{Only} the latest build is
-kept, previous one is overwritten.
-
-@example
-$ redo -xx -k -s build-the-whole-huge-project
-@end example
-
-@cindex TAI64
-@cindex TAI64N
-@pindex tai64nlocal
-Logs are stored in corresponding @file{.redo/tgt.log} file. Each line of
-it is prefixed with @url{http://cr.yp.to/libtai/tai64.html, TAI64N}
-timestamp, that you can decode with @command{tai64nlocal} utility from
-@url{http://cr.yp.to/daemontools.html, daemontools}, or similar one:
-@code{go install go.cypherpunks.su/tai64n/v4/cmd/tai64nlocal}.
-
-When @option{-k} is in use, all environment variables, working
-directory, command line arguments, start/finish times, duration,
-participated PIDs, return codes are also saved in corresponding
-@file{.redo/tgt.log.reg} file.
-
-You can view any target's output with @command{redo-log} command
-(possibly piping to @command{tai64nlocal}). @option{-c} option also
-shows how exactly it was started, when started/finished and how long did
-it take.
-
-@option{-r} option enables recursive serialized indented output. When
-you run @command{redo} in parallel, then all @code{stderr} (if no
-@option{-s}ilence was enabled) is printed as it appears, mixing output
-from all commands, that is hard to read and investigate. Serialized
-@command{redo-log} output rearranges output. I will take example from
-original apenwarr's idea @url{https://apenwarr.ca/log/20181106, article}.
-Serialized output will look like this:
-
-@verbatim
-$ redo-log -r A
-A: ...A stuff...
-A: redo-ifchange J
-J: > redo J
-J: > ...J stuff...
-J: > redo-ifchange X Y
-X: > > redo X
-X: > > ...X stuff...
-X: > > done X
-J: > > redo Y
-Y: > > ...Y stuff...
-Z: > > > redo Z
-Z: > > > ...Z stuff...
-Z: > > > done Z
-Y: > > ...more Y stuff...
-Y: > > done Y
-J: > ...more J stuff...
-J: > done J
-A: ...more A stuff...
-@end verbatim
-
-It will output depth first logs. It can rearrange some "events" (redo
-invocations): failed targets will be at the very end, because they are
-the most interesting ones for the human.
-
-Pay attention that recursive output is more CPU hungry. Single target
-output is literally copying of @file{.redo/tgt.log} file to @code{stdout}.
old mode 100644 (file)
new mode 100755 (executable)
similarity index 50%
rename from doc/www.do
rename to doc/mk-html
index add049d..64514ed
@@ -1,15 +1,9 @@
-redo-ifchange *.texi ../VERSION
+#!/bin/sh
+
 html=goredo.html
 rm -f $html/*.html
-${MAKEINFO:=makeinfo} --html \
-    -D "VERSION `cat ../VERSION`" \
-    --set-customization-variable NO_CSS=1 \
-    --set-customization-variable SECTION_NAME_IN_TITLE=1 \
-    --set-customization-variable TREE_TRANSFORMATIONS=complete_tree_nodes_menus \
-    --set-customization-variable FORMAT_MENU=menu \
-    --set-customization-variable DATE_IN_HEADER=1 \
-    --set-customization-variable ASCII_PUNCTUATION=1 \
-    --output $html index.texi
+SWG_DO_SRC=0 SWG_DO_BACKS=0 swg htmls goredo.html
+perl -i -npe 's#^<title>.*$#<title>goredo</title>#' $html/index.html
 cp ../PUBKEY-* $html/
 (
     cd $html/download
@@ -19,6 +13,6 @@ cp ../PUBKEY-* $html/
     export AUTHOR_EMAIL=goredo@cypherpunks.su
     ~/work/releases-feed/releases.atom.zsh
 )
-perl -i -npe 'print "<link rel=\"alternate\" title=\"Releases\" href=\"download/releases.atom\" type=\"application/atom+xml\">\n" if /^<\/head>/' $html/Install.html
+perl -i -npe 'print "<link rel=\"alternate\" title=\"Releases\" href=\"download/releases.atom\" type=\"application/atom+xml\">\n" if /^<\/head>/' $html/Download.html
 find $html -type d -exec chmod 755 {} +
 find $html -type f -exec chmod 644 {} +
diff --git a/doc/mk-info b/doc/mk-info
new file mode 100755 (executable)
index 0000000..587b65f
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+# http://www.git.stargrave.org/?p=swg.git;a=blob;f=README
+
+SWG_DO_SRC=0 SWG_DO_BACKS=0 exec swg info >goredo.info
diff --git a/doc/news.texi b/doc/news.texi
deleted file mode 100644 (file)
index 49cc825..0000000
+++ /dev/null
@@ -1,546 +0,0 @@
-@node News
-@cindex news
-@unnumbered News
-
-@anchor{Release 2_8_0}
-@section Release 2.8.0
-@itemize
-@item
-    Fix always-OOD @file{.do}-targets with nearby @file{default.do}.
-@end itemize
-
-@anchor{Release 2_7_0}
-@section Release 2.7.0
-@itemize
-@item
-    Proper @file{.do} file searching during source file determination.
-@end itemize
-
-@anchor{Release 2_6_5}
-@section Release 2.6.5
-@itemize
-@item
-    Fix file's executable bit check, which may lead to inadmissible
-    @command{/bin/sh} run in case of symbolic links presence.
-@item
-    Fix proper @command{mtime}'s nanoseconds storage.
-@end itemize
-
-@anchor{Release 2_6_4}
-@section Release 2.6.4
-@itemize
-@item
-    Fix possible NFS locking issue.
-@item
-    Updated dependant libraries.
-@end itemize
-
-@anchor{Release 2_6_3}
-@section Release 2.6.3
-@itemize
-@item
-    Updated dependant libraries. Should fix workability on modern OpenBSD.
-@end itemize
-
-@anchor{Release 2_6_2}
-@section Release 2.6.2
-@itemize
-@item
-    Integration tests do not depend on non-portable @command{stat} command.
-@end itemize
-
-@anchor{Release 2_6_1}
-@section Release 2.6.1
-@itemize
-@item
-    Integration tests do not depend on Python or Git.
-@end itemize
-
-@anchor{Release 2_6_0}
-@section Release 2.6.0
-@itemize
-@item
-    Omit possible obtrusive error of non-existent @file{.dep} file
-    opening of the failed target.
-@end itemize
-
-@anchor{Release 2_5_0}
-@section Release 2.5.0
-@itemize
-@item
-    Prevent rare race in the code, where externally modified target may
-    panic the program.
-@end itemize
-
-@anchor{Release 2_4_0}
-@section Release 2.4.0
-@itemize
-@item
-    Continue regression fixing of @command{redo-whichdo}.
-@end itemize
-
-@anchor{Release 2_3_0}
-@section Release 2.3.0
-@itemize
-@item
-    Fix regressions in @command{redo-whichdo} happened after huge refactoring.
-@end itemize
-
-@anchor{Release 2_2_0}
-@section Release 2.2.0
-@itemize
-@item
-    Prefix target's output lines with the name of the target.
-@end itemize
-
-@anchor{Release 2_1_0}
-@section Release 2.1.0
-@itemize
-@item
-    Mistakenly path to @file{.do} file was not absolute and OS can
-    refuse to run it because it is not in @env{$PATH}.
-@end itemize
-
-@anchor{Release 2_0_0}
-@section Release 2.0.0
-@itemize
-@item
-    Huge quantity of performance optimisations.
-
-@item
-    Fixed possible unexpected lock file closing.
-
-@item
-    When resulting target has the same contents, it does not replace
-    already existing one. That was done previously. But now it also
-    copies the file's mode flags to the target (for example making it
-    executable).
-
-@item
-    If @command{redo-*} command runs under control of another
-    (top-level) redo, then it does not parse the flags as options and
-    treat each argument as a target, allowing passing the targets with
-    dashes in the beginning.
-
-@item
-    Prevented possible concurrent stderr writing by multiple running targets.
-
-@item
-    @command{redo-depfix} command now always rewrites dependency files
-    and calculates checksums of the files.
-
-@item
-    Own binary format is used for dependency files (@file{.dep}),
-    instead of recfile (@file{.rec}) one. It is several times smaller
-    and much faster to parse. You must run @command{redo-depfix} to
-    convert all existing @file{.redo/*.rec} files to that binary format.
-
-@item
-    @command{redo-dep2rec} command appeared, that can convert
-    @file{.dep} to recfile on stdout.
-
-@end itemize
-
-@anchor{Release 1_32_0}
-@section Release 1.32.0
-@itemize
-@item
-    Omit printing of the @code{resource deadlock avoided} warning when
-    trying to take the lock.
-@end itemize
-
-@anchor{Release 1_31_0}
-@section Release 1.31.0
-@itemize
-@item
-    Fixed possible race when target can be built more than once.
-@item
-    Print out finished targets much more quickly.
-@end itemize
-
-@anchor{Release 1_30_0}
-@section Release 1.30.0
-@itemize
-@item
-    Fixed wrong OOD-cache value of source file dependency.
-    Targets could be rebuilt without any reason.
-@end itemize
-
-@anchor{Release 1_29_0}
-@section Release 1.29.0
-@itemize
-@item
-    Fix possible error when two always-ed targets are run simultaneously.
-@item
-    Updated dependant libraries.
-@end itemize
-
-@anchor{Release 1_28_0}
-@section Release 1.28.0
-@itemize
-@item
-    Do not remove @file{.lock} files, that leads to possible races
-    between running targets. Although @command{nncp-cleanup lock}
-    can be used to cleanup.
-@item
-    Updated dependant libraries.
-@end itemize
-
-@anchor{Release 1_27_1}
-@section Release 1.27.1
-@itemize
-@item
-    Fixed lack of @file{.redo.}-prefix in temporary file names.
-@end itemize
-
-@anchor{Release 1_27_0}
-@section Release 1.27.0
-@itemize
-@item
-    Improved out-of-date check and @file{.do} files search performance,
-    because of caching their results.
-@end itemize
-
-@anchor{Release 1_26_0}
-@section Release 1.26.0
-@itemize
-@item
-    Debug output contained colour-related attribute even if
-    @env{$NO_COLOR=1} was set.
-@item
-    Updated dependant libraries.
-@end itemize
-
-@anchor{Release 1_25_0}
-@section Release 1.25.0
-@itemize
-@item
-    Target's lock file requires a token from the jobserver now. So
-    amount of simultaneously opened lock files depends on job slots
-    available.
-@end itemize
-
-@anchor{Release 1_24_0}
-@section Release 1.24.0
-@itemize
-@item
-    @command{redo-cleanup tmp} also removes temporarily (@code{$3})
-    created directories.
-@end itemize
-
-@anchor{Release 1_23_0}
-@section Release 1.23.0
-@itemize
-@item
-    @command{redo-ifchange}'s @option{-f} option forces each target
-    rebuilding. Comparing to @command{redo}, it will parallelize the
-    process.
-@item
-    Inode's number is also stored as dependency information, just to
-    prevent possible @code{ctime} collision of two files.
-@item
-    Performance optimization: do not use target's temporary output file
-    at all, if its hash equals to already existing target's one. Just
-    touch existing target file instead.
-@end itemize
-
-@anchor{Release 1_22_0}
-@section Release 1.22.0
-@itemize
-@item
-    @code{flock} locks replaced with POSIX @code{fcntl} ones.
-    They could be more portable.
-@item
-    @command{redo-depfix} command appeared, that traverses through all
-    @file{.redo} directories and their dependency files, checks if
-    corresponding targets has the same content but different
-    @code{ctime}/@code{mtime} values and rewrites dependencies with that
-    updated inode information.
-@item
-    With @env{$REDO_STOP_IF_MODIFIED=1} environment variable redo will
-    stop and fail if it meet externally modified file. By default user
-    is only warned about it, but building continues for convenience.
-@end itemize
-
-@anchor{Release 1_21_0}
-@section Release 1.21.0
-@itemize
-@item
-    @env{$REDO_INODE_NO_TRUST} is replaced with @env{$REDO_INODE_TRUST}
-    environment variable, that takes either @code{none}, or @code{ctime}
-    (the default one), or @code{mtime} (new one). Check documentation's
-    separate page about that option.
-@end itemize
-
-@anchor{Release 1_20_0}
-@section Release 1.20.0
-@itemize
-@item
-    Print warning message if both ifcreate and ifchange records were
-    discovered after the target is done.
-@end itemize
-
-@anchor{Release 1_19_0}
-@section Release 1.19.0
-@itemize
-@item
-    Skip target itself, when searching for corresponding @file{.do}
-    file. For example @file{default.do} must use @file{../default.do}
-    instead of the self.
-@end itemize
-
-@anchor{Release 1_18_0}
-@section Release 1.18.0
-@itemize
-@item
-    Fix regression of known OODs passing since 1.3.0, that leads to
-    rebuilding of already built targets.
-@end itemize
-
-@anchor{Release 1_17_0}
-@section Release 1.17.0
-@itemize
-@item
-    If @command{redo*} process is killed, then it sends @code{SIGTERM}
-    to all his children too, properly terminating the whole job queue.
-@end itemize
-
-@anchor{Release 1_16_0}
-@section Release 1.16.0
-@itemize
-@item
-    Unexistent targets are considered always out-of-date, as it should be.
-@item
-    Do not panic if @env{$REDO_LOGS=1} and we were unable to start the command.
-@end itemize
-
-@anchor{Release 1_15_0}
-@section Release 1.15.0
-@itemize
-@item
-    Explicitly check if @code{$1} target is touched and then fail.
-    Previously we check if @code{$1} was only altered.
-@end itemize
-
-@anchor{Release 1_14_0}
-@section Release 1.14.0
-@itemize
-@item
-    Fixed @command{redo-ifcreate}'s targets proper relative paths to the target.
-@end itemize
-
-@anchor{Release 1_13_0}
-@section Release 1.13.0
-@itemize
-@item
-    Use @file{.log-rec} extension, instead of @file{.log.rec}, that
-    won't collide with already existing @file{.log} and @file{.rec} in
-    @file{.redo} directory.
-@end itemize
-
-@anchor{Release 1_12_0}
-@section Release 1.12.0
-@itemize
-@item
-    Fix possible lack of success finish message printing if any of
-    targets fail.
-@end itemize
-
-@anchor{Release 1_11_0}
-@section Release 1.11.0
-@itemize
-@item
-    Fix nasty bug with incorrect @file{.redo/tgt.rec} files renaming.
-@end itemize
-
-@anchor{Release 1_10_0}
-@section Release 1.10.0
-@itemize
-@item
-    @command{redo-cleanup} now also cleans @file{.redo/tgt.log.rec} files.
-@item
-    Recursive logs do not require @file{.redo/tgt.rec} existence anymore.
-@end itemize
-
-@anchor{Release 1_9_0}
-@section Release 1.9.0
-@itemize
-@item
-    Do not enable command line options not applicable to the command.
-    For example @option{-j} option is only applicable to @command{redo}
-    and @command{redo-ifchange} commands.
-@item
-    @itemize
-    @item @option{-dry-run} option is renamed to @option{-n}
-    @item @option{-logs} option is renamed to @option{-k}
-    @item @option{-silent} option is renamed to @option{-s}
-    @end itemize
-@item
-    When @code{stderr} logs are kept, all environment variables, working
-    directory, command line arguments, start/finish times, duration,
-    participated PIDs, return codes are saved in corresponding
-    @file{.redo/tgt.log.rec} file. Some of them can be viewed with
-    @option{-c} option to @command{redo-log}.
-@item
-    @command{redo-log}'s @option{-r} option allows recursive, indented
-    viewing of the whole redo commands invocations for the given target
-    in serialized way.
-@end itemize
-
-@anchor{Release 1_8_0}
-@section Release 1.8.0
-@itemize
-@item
-    Fixed possibly wrong relative path record of the dependency, when
-    redo commands are run in different directory from the @file{.do}.
-@item
-    Fixed possible failing in @command{redo-sources} if no @file{.dep}
-    is found.
-@end itemize
-
-@anchor{Release 1_7_0}
-@section Release 1.7.0
-@itemize
-@item
-    Optional compatibility (through @env{$REDO_MAKE=@{bmake|gmake@}})
-    with either NetBSD's bmake or GNU Make jobserver protocols, being
-    able to tightly integrate @command{goredo} with the @command{make}.
-@end itemize
-
-@anchor{Release 1_6_0}
-@section Release 1.6.0
-@itemize
-@item
-    @command{redo-affects} command appeared, that shows all targets that
-    will be affected by changing the specified ones.
-@end itemize
-
-@anchor{Release 1_5_0}
-@section Release 1.5.0
-@itemize
-@item
-    @command{redo-ood}, @command{redo-sources} and
-    @command{redo-targets} can optionally take list of targets to apply
-    the command on, to narrow the result.
-@item
-    @command{redo-sources} mistakenly missed @file{.do} files in the output.
-@item
-    @command{redo-sources} now recursively searches for all source
-    files, not the "first" depth level ones.
-@end itemize
-
-@anchor{Release 1_4_1}
-@section Release 1.4.1
-@itemize
-@item
-    Even more simpler statusline cleaning function.
-@end itemize
-
-@anchor{Release 1_4_0}
-@section Release 1.4.0
-@itemize
-@item
-    Fixed proper @option{-xx} and @env{$REDO_TRACE} workability, that
-    previously was not applied to all targets.
-@item
-    Simpler statusline cleaning function, does not leading to whitespace
-    junk after long lines.
-@item
-    Updated dependant libraries.
-@end itemize
-
-@anchor{Release 1_3_0}
-@section Release 1.3.0
-@itemize
-@item
-    Experimental @command{redo-sources}, @command{redo-targets} and
-    @command{redo-ood} commands.
-@item
-    Repetitive OOD determination optimization: pass all already known to
-    be OOD targets to redoing targets.
-@end itemize
-
-@anchor{Release 1_2_0}
-@section Release 1.2.0
-@itemize
-@item
-    Dependency files @file{.dep} extension changed to @file{.rec}, to
-    reflect its recfile format nature and editors file type better
-    determination.
-@item
-    Reduce number of file descriptors kept open (1 instead of 4) while
-    waiting for job slot token.
-@end itemize
-
-@anchor{Release 1_1_0}
-@section Release 1.1.0
-@itemize
-@item
-    @command{redo-cleanup} has @option{-dry-run} option.
-@end itemize
-
-@anchor{Release 1_0_0}
-@section Release 1.0.0
-@itemize
-@item
-    @code{Size} is stored in the state, for faster OOD detection.
-    Previous @command{goredo} state files won't work.
-@item
-    Setting of @env{$REDO_INODE_NO_TRUST} environment variable brings no
-    trust to file inode's information (except for its size), forcing its
-    checksum checking.
-@item
-    @command{redo-whichdo} resembles @code{apenwarr/redo}'s one behaviour more.
-@end itemize
-
-@anchor{Release 0_12_3}
-@section Release 0.12.3
-@itemize
-@item
-    Use an updated @code{lukechampine.com/blake3} with possibly working
-    arm64 macOS fix.
-@end itemize
-
-@anchor{Release 0_12_2}
-@section Release 0.12.2
-@itemize
-@item
-    Try to fix failing @code{lukechampine.com/blake3} on arm64 macOS.
-@item
-    Fixed tests permissions in the tarball.
-@end itemize
-
-@anchor{Release 0_12_1}
-@section Release 0.12.1
-@itemize
-@item
-    Tarball uses @file{vendor} directory without @env{$GOPATH}
-    overriding. @command{goredo} and its dependencies anyway uses Go
-    1.12+ versions, that have @file{vendor}-ing support.
-@end itemize
-
-@anchor{Release 0_12_0}
-@section Release 0.12.0
-@itemize
-@item
-    Do not forget to save even output-less target as a dependency.
-@item
-    @option{-debug} option renamed to shorter @option{-d}.
-@end itemize
-
-@anchor{Release 0_11_0}
-@section Release 0.11.0
-@itemize
-@item
-    Previously @env{$REDO_JOBS} overrided even explicitly specified
-    @option{-j} option. Fix that behaviour -- command line options must
-    precede environment variables.
-@item @url{https://github.com/BLAKE3-team/BLAKE3, BLAKE3} replaces
-    BLAKE2b hashing algorithm for even better performance.
-@end itemize
-
-@anchor{Release 0_10_0}
-@section Release 0.10.0
-@itemize
-@item Initial tarballed release.
-@end itemize
diff --git a/doc/notes.texi b/doc/notes.texi
deleted file mode 100644 (file)
index 951a345..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-@node Notes
-@cindex implementation notes
-@cindex implementation differences
-@unnumbered Implementation notes
-
-Since there are no strict rules about redo behaviour, here are some
-remarks about @command{goredo}'s one:
-
-@itemize
-
-@item @file{all} target is default
-@item @file{stdout} is always captured, but no target is created if it
-    was empty
-@item non-existent targets are considered always out of date
-@item @file{.do}'s @file{$3} is relative path to the file in target directory
-@item @file{.do} search goes up to @file{/} by default, but can be
-    limited with either @env{$REDO_TOP_DIR} environment variable, or by
-    having @file{.redo/top} file in it
-@item target's completion messages are written after they finish
-@item executable @file{.do} is run as is, non-executable is run with
-    @code{/bin/sh -e[x]}
-@item tracing (@option{-x}) can be obviously done only for
-    non-executable @file{.do}
-@item parallizable build is done only during @command{redo-ifchange} for
-    human convenience: you can globally enable @env{$REDO_JOBS}, but
-    still do for example: @code{redo htmls infos index upload}
-
-@end itemize
diff --git a/doc/ood.texi b/doc/ood.texi
deleted file mode 100644 (file)
index 3250f2e..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-@node OOD
-@cindex OOD
-@cindex checksum
-@unnumbered Out-of-date determination
-
-The main task for build system is deciding if the target is out-of-date
-and needs rebuilding. The single most reliable way to do that is to
-compare file's content with previously recorded one. But that is too
-expensive.
-
-So direct content storage/comparison can be replaced with
-collision-resistant hash function of enough length. @command{goredo}
-uses @url{https://github.com/BLAKE3-team/BLAKE3, BLAKE3} with 256-bit
-output for that purpose.
-
-Also it stores file's size and its inode number. Obviously if size
-differs, then file's content too and there is no need to read and hash it.
-
-@vindex REDO_INODE_TRUST
-But still it could be relatively expensive. So there are additional
-possible checks that can skip need of hash checking, based on some trust
-to the underlying filesystem and operating system behaviour, controlled
-by @env{$REDO_INODE_TRUST} environment variable value:
-
-@table @env
-
-@item $REDO_INODE_TRUST=none
-Do not trust filesystem at all, except for file's size knowledge.
-Most reliable mode.
-
-@cindex time
-@item $REDO_INODE_TRUST=ctime
-Trust @code{ctime} value of file's inode. It should change every time
-inode is updated. If nothing is touched and @code{ctime} is the same,
-then assume that file was not modified and we do not try to read its
-content. Unfortunately @code{ctime} also changes if link count is
-updated and ownership, that could give false positive decision and force
-file's rereading.
-
-@item $REDO_INODE_TRUST=mtime
-Trust @code{mtime} value of file's inode. It should change every time
-file's content is updated. But unfortunately there are
-@url{https://apenwarr.ca/log/20181113, many reasons} it won't.
-
-@end table
-
-@cindex mtime
-Pay attention that although @code{mtime} is considered harmful (link
-above), and is hardly acceptable in build system like Make, because it
-compares timestamps of two files, redo is satisfied only with the fact
-of its changing, so badly jumping clocks are not so devastating. Modern
-filesystem and operating systems with micro- and nano-seconds resolution
-timestamps should be pretty good choice for @env{$REDO_INODE_TRUST=mtime}.
-However GNU/Linux with @code{ext4} filesystem can easily have pretty big
-granularity of 10ms.
-
-@command{goredo} uses @env{$REDO_INODE_TRUST=ctime} by default.
-
-If you move your worktree to different place, then all @code{ctime}s
-(probably @code{mtime}s if you are inaccurate) will be also changed. OOD
-check will be much slower after that, because it has to fallback to
-content/hash checking all the time. You can use @command{redo-depfix}
-utility to rebuild dependency files.
diff --git a/doc/rules.texi b/doc/rules.texi
deleted file mode 100644 (file)
index 6244047..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-@node Usage rules
-@cindex usage rules
-@unnumbered Usage rules
-
-@itemize
-
-@item Target is the single file.
-Target's result probably won't create file at all.
-
-@item Build rules for the target @file{target} are placed in
-@file{target.do} file.
-
-@item By default @file{.do} file is run as @code{/bin/sh -e} script.
-If @command{redo} is run with an @option{-x} argument, then
-@code{/bin/sh -ex} is used instead.
-
-@item Executable @file{.do} file is run as is, by direct execution.
-
-@item Targets can be placed in other directories, probably with
-relatives paths.
-
-@item Following @file{.do} files are searched for @file{dir/base.a.b} target:
-
-@example
-dir/base.a.b.do
-dir/default.a.b.do
-dir/default.b.do
-dir/default.do
-default.a.b.do
-default.b.do
-default.do
-@end example
-
-and for @file{../a/b/xtarget.y} target:
-
-@example
-./../a/b/xtarget.y.do
-./../a/b/default.y.do
-./../a/b/default.do
-./../a/default.y.do
-./../a/default.do
-./../default.y.do
-./../default.do
-@end example
-
-@item @file{.do} file search goes up to @file{/} by default, but can be
-    limited with either @env{$REDO_TOP_DIR} environment variable, or by
-    having @file{.redo/top} file in it.
-
-@item @file{.do} runs in the same directory where it is placed.
-
-@item @file{.do} runs with the three arguments:
-    @itemize
-    @item @code{$1} -- name of the target.
-    @item @code{$2} -- base name of the target. Equals to @code{$1} if
-        it is not @file{default.*} file. Otherwise it lacks the extension.
-@example
-a.b.c.do       -> $2=a.b.c
-default.do     -> $2=a.b.c
-default.c.do   -> $2=a.b
-default.b.c.do -> $2=a
-@end example
-    @item @code{$3} -- path to the temporary file, that will be renamed
-        to the target itself. It is relative to the file in the target
-        directory.
-    @end itemize
-
-@item @file{.do}'s @code{stdout} is captured and written to the
-    @code{$3} file. You have to produce either @code{stdout} output, or
-    use @code{$3} directly, but not both.
-
-@item If neither @code{stdout} output nor @code{$3} file were
-    explicitly created, then no output file is created at all.
-    Target does not produce anything, it is "non-existent".
-
-@item @code{stderr} is not captured at all and can be seen by default.
-
-@item Non-existent targets are considered always out-of-date.
-
-@item Dependency information is recorded by @command{redo-ifchange}
-    command invocation. It takes list of dependencies (targets), on
-    whose the currently build target is dependant. Current @file{.do}
-    file is implicitly added as a dependency.
-
-@item If no @command{redo-ifchange}'s dependency target exists, then it
-    is build (according to build rules in corresponding @file{.do}). If
-    dependency has not been changed, then it is not rebuilt.
-
-@item Non-existent files dependencies are created with
-    @command{redo-ifcreate} command. If specified dependency target file
-    appears, then current target will be rebuilt. Intermediate higher
-    priority @file{.do} files dependency is implicitly recorded. For
-    example, if you @file{foo} target currently uses @file{default.do}
-    script, then @file{foo.do} is automatically recorded as a
-    non-existent dependency, forcing @file{foo} to be rebuilt if
-    @file{foo.do} appears.
-
-@end itemize
diff --git a/doc/state.texi b/doc/state.texi
deleted file mode 100644 (file)
index 0a3b3d8..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-@node State
-@cindex storage
-@cindex state
-@unnumbered State
-
-Dependency and build state is kept inside @file{.redo} subdirectory in
-each directory related the build. Each corresponding target has its own,
-recreated with every rebuild, binary @file{.dep} file.
-
-It starts with the header:
-
-@verbatim
-"GOREDO" || 0x01 || BuildUUID
-@end verbatim
-
-@code{0x01} is format's version number. @code{BuildUUID} is 128-bit UUID.
-
-After the header comes concatenation of length-prefixed chunks. Length
-is the length of the whole chunk, including the size of the encoded
-length itself. It is 16-bit big-endian integer. After the length comes
-single byte type of the chunk:
-
-@table @asis
-
-@item ifcreate
-
-@verbatim
-LEN || 0x01 || target
-@end verbatim
-
-@code{target} is UTF-8 encoded target's name.
-
-@item ifchange
-
-@verbatim
-LEN || 0x02 ||
-    size || inodeNum ||
-    ctimeSec || ctimeNsec ||
-    mtimeSec || mtimeNsec ||
-    hash || target
-@end verbatim
-
-@code{target} is UTF-8 encoded target's name.
-@code{hash} is 256-bit BLAKE3 hash.
-All other inode-related fields are 64-bit big-endian integers.
-
-@item always
-
-@verbatim
-LEN || 0x03
-@end verbatim
-
-@item stamp
-
-@verbatim
-LEN || 0x04 || hash
-@end verbatim
-
-@code{hash} is 256-bit BLAKE3 hash.
-
-@item ifchange-nonexistent
-
-@verbatim
-LEN || 0x05 || target
-@end verbatim
-
-@code{target} is UTF-8 encoded target's name.
-
-@end table
-
-That @file{.dep} file can be converted to human-readable
-@url{https://www.gnu.org/software/recutils/, recfile} format.
-For example:
-
-@example
-Build: 80143f04-bfff-4673-950c-081d712f573d
-
-Type: ifcreate
-Target: foo.o.do
-
-Type: ifchange
-Target: default.o.do
-Size: 123
-InodeNum: 2345
-CtimeSec: 1605721341
-CtimeNsec: 253305000
-MtimeSec: 1645606823
-MtimeNsec: 369936700
-Hash: f4929732f96f11e6d4ebe94536b5edef426d00ed0146853e37a87f4295e18eda
-
-Type: always
-
-Type: stamp
-Hash: 5bbdf635932cb16b9127e69b6f3872577efed338f0a4ab6f2c7ca3df6ce50cc9
-@end example
-
-And its schema definition:
-@verbatiminclude ../dep.rec
diff --git a/doc/thanks.texi b/doc/thanks.texi
deleted file mode 100644 (file)
index 859644f..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-@node Thanks
-@cindex thanks
-@unnumbered Thanks
-
-There are people deserving to be thanked for helping this project:
-
-@itemize
-
-@item @url{mailto:hendry@@iki.fi, Kai Hendry} for his bugreports, AUR
-port, and Homebrew formula maintaining.
-
-@item @url{mailto:spacefrogg-git@@meterriblecrew.net, Michael Raitza}
-for his bugreports and various useful suggestions.
-
-@item @url{mailto:mail@@jnboehm.com, Jan Niklas Böhm} for his
-suggestions and bugreports.
-
-@item @url{ew.tmp2016@@nassur.net} for his bugreports and examples.
-
-@end itemize
index a06e16928f37c2f27d8d4ceb80f4434fa8b5e9b2..3be46fa24a8a54ed540ddba4bfff8fbc38fc5d23 100755 (executable)
--- a/makedist
+++ b/makedist
@@ -13,52 +13,13 @@ go generate
 redo-ifchange VERSION
 
 ########################################################################
-cd doc
-cat >download.texi <<EOF
+cat >doc/Download <<EOF
 You can obtain releases source code prepared tarballs on
-@url{http://www.goredo.cypherpunks.su/}.
+=> http://www.goredo.cypherpunks.su/\r
 EOF
-
-mkinfo() {
-    ${MAKEINFO:-makeinfo} --plaintext \
-        --set-customization-variable ASCII_PUNCTUATION=1 \
-        -D "VERSION `cat ../VERSION`" $@
-}
-
-texi=$(mktemp)
-
-cat >$texi <<EOF
-\input texinfo
-@documentencoding UTF-8
-@settitle NEWS
-@node News
-`sed -n '3,$p' <news.texi`
-@bye
-EOF
-mkinfo --output NEWS $texi
-
-cat >$texi <<EOF
-\input texinfo
-@documentencoding UTF-8
-@settitle INSTALL
-@include install.texi
-@bye
-EOF
-mkinfo --output INSTALL $texi
-
-cat >$texi <<EOF
-\input texinfo
-@documentencoding UTF-8
-@settitle THANKS
-`cat thanks.texi`
-@bye
-EOF
-mkinfo --output THANKS $texi
-
-rm $texi
-redo goredo.info
-mv goredo.info INSTALL NEWS THANKS ..
-cd ..
+( cd doc ; ./mk-info )
+mv doc/goredo.info doc/INSTALL doc/NEWS doc/THANKS .
+perl -i -ne 'print unless /^A.*\r$/' INSTALL NEWS
 
 ########################################################################
 
@@ -74,7 +35,7 @@ cd ..
 
 ########################################################################
 
-rm -rf *.texi .redo .git .gitignore doc makedist VERSION.do
+rm -rf .redo .git .gitignore doc makedist VERSION.do
 find . -type d -exec chmod 755 {} +
 find . -type f -exec chmod 644 {} +
 find t/redo-sh.tests -name test -exec chmod +x {} +
@@ -97,12 +58,11 @@ release_date=$(date "+%Y-%m-%d")
 
 release_underscored=`echo $release | tr . _`
 cat <<EOF
-An entry for documentation:
-@item @ref{Release $release_underscored, $release} @tab $release_date @tab $size KiB @tab
-@url{download/$tarball.meta4, meta4}
-@url{download/$tarball, tar}
-@url{download/$tarball.asc, pgp}
-@url{download/$tarball.sig, ssh}
+Release [NEWS]#$release | $release_date | $size KiB
+    => download/$tarball.meta4 meta4
+    => download/$tarball tar
+    => download/$tarball.asc pgp
+    => download/$tarball.sig ssh
 EOF
 
 mv $tmp/$tarball $tmp/"$tarball".asc $tmp/"$tarball".sig $tarball.meta4 $cur/doc/goredo.html/download