From b20f14cd6529f33bb310f780c402984d705e192b Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 14 Jan 2026 18:21:13 +0300 Subject: [PATCH] Move to SWG documentation format --- doc/.swgignore | 4 + doc/Download | 323 +++++++++++++++++++++ doc/Env | 2 + doc/FAQ/OODsUnchangedOutput | 16 ++ doc/FAQ/PermanentErrors | 8 + doc/FAQ/Stamping | 35 +++ doc/FAQ/redo-always | 13 + doc/Features | 33 +++ doc/INSTALL | 44 +++ doc/Integrity | 25 ++ doc/Jobserver | 26 ++ doc/NEWS | 328 ++++++++++++++++++++++ doc/Notes | 15 + doc/OOD | 54 ++++ doc/Rules | 78 ++++++ doc/State | 64 +++++ doc/THANKS | 13 + doc/cmd/Debug | 5 + doc/cmd/Fsync | 4 + doc/cmd/Parallel | 4 + doc/cmd/Progress | 6 + doc/cmd/Tracing | 3 + doc/cmd/redo | 3 + doc/cmd/redo-affects | 3 + doc/cmd/redo-always | 3 + doc/cmd/redo-cleanup | 2 + doc/cmd/redo-dep2rec | 2 + doc/cmd/redo-depfix | 10 + doc/cmd/redo-dot | 7 + doc/cmd/redo-ifchange | 15 + doc/cmd/redo-ifcreate | 3 + doc/cmd/redo-log | 61 ++++ doc/cmd/redo-ood | 1 + doc/cmd/redo-sources | 1 + doc/cmd/redo-stamp | 4 + doc/cmd/redo-targets | 1 + doc/cmd/redo-whichdo | 16 ++ doc/cmds.texi | 165 ----------- doc/download.texi | 328 ---------------------- doc/faq.texi | 87 ------ doc/features.texi | 50 ---- doc/goredo.info.do | 7 - doc/index | 43 +++ doc/index.texi | 82 ------ doc/install.texi | 76 ----- doc/integrity.texi | 34 --- doc/jobserver.texi | 34 --- doc/logs.texi | 73 ----- doc/{www.do => mk-html} | 16 +- doc/mk-info | 4 + doc/news.texi | 546 ------------------------------------ doc/notes.texi | 28 -- doc/ood.texi | 63 ----- doc/rules.texi | 98 ------- doc/state.texi | 98 ------- doc/thanks.texi | 20 -- makedist | 62 +--- 57 files changed, 1298 insertions(+), 1851 deletions(-) create mode 100644 doc/.swgignore create mode 100644 doc/Download create mode 100644 doc/Env create mode 100644 doc/FAQ/OODsUnchangedOutput create mode 100644 doc/FAQ/PermanentErrors create mode 100644 doc/FAQ/Stamping create mode 100644 doc/FAQ/redo-always create mode 100644 doc/Features create mode 100644 doc/INSTALL create mode 100644 doc/Integrity create mode 100644 doc/Jobserver create mode 100644 doc/NEWS create mode 100644 doc/Notes create mode 100644 doc/OOD create mode 100644 doc/Rules create mode 100644 doc/State create mode 100644 doc/THANKS create mode 100644 doc/cmd/Debug create mode 100644 doc/cmd/Fsync create mode 100644 doc/cmd/Parallel create mode 100644 doc/cmd/Progress create mode 100644 doc/cmd/Tracing create mode 100644 doc/cmd/redo create mode 100644 doc/cmd/redo-affects create mode 100644 doc/cmd/redo-always create mode 100644 doc/cmd/redo-cleanup create mode 100644 doc/cmd/redo-dep2rec create mode 100644 doc/cmd/redo-depfix create mode 100644 doc/cmd/redo-dot create mode 100644 doc/cmd/redo-ifchange create mode 100644 doc/cmd/redo-ifcreate create mode 100644 doc/cmd/redo-log create mode 100644 doc/cmd/redo-ood create mode 100644 doc/cmd/redo-sources create mode 100644 doc/cmd/redo-stamp create mode 100644 doc/cmd/redo-targets create mode 100644 doc/cmd/redo-whichdo delete mode 100644 doc/cmds.texi delete mode 100644 doc/download.texi delete mode 100644 doc/faq.texi delete mode 100644 doc/features.texi delete mode 100644 doc/goredo.info.do create mode 100644 doc/index delete mode 100644 doc/index.texi delete mode 100644 doc/install.texi delete mode 100644 doc/integrity.texi delete mode 100644 doc/jobserver.texi delete mode 100644 doc/logs.texi rename doc/{www.do => mk-html} (50%) mode change 100644 => 100755 create mode 100755 doc/mk-info delete mode 100644 doc/news.texi delete mode 100644 doc/notes.texi delete mode 100644 doc/ood.texi delete mode 100644 doc/rules.texi delete mode 100644 doc/state.texi delete mode 100644 doc/thanks.texi diff --git a/doc/.swgignore b/doc/.swgignore new file mode 100644 index 0000000..a638e44 --- /dev/null +++ b/doc/.swgignore @@ -0,0 +1,4 @@ +^mk-info$ +^mk-html$ +^goredo.html/ +^goredo.info$ diff --git a/doc/Download b/doc/Download new file mode 100644 index 0000000..608ce9d --- /dev/null +++ b/doc/Download @@ -0,0 +1,323 @@ +Release [NEWS]#2.8.0 | 2025-12-16 | 479 KiB + => download/goredo-2.8.0.tar.zst.meta4 meta4 + => download/goredo-2.8.0.tar.zst tar + => download/goredo-2.8.0.tar.zst.asc pgp + => download/goredo-2.8.0.tar.zst.sig ssh + +Release [NEWS]#2.6.5 | 2025-10-26 | 478 KiB + => download/goredo-2.6.5.tar.zst.meta4 meta4 + => download/goredo-2.6.5.tar.zst tar + => download/goredo-2.6.5.tar.zst.asc pgp + => download/goredo-2.6.5.tar.zst.sig ssh + +Release [NEWS]#2.6.4 | 2025-01-04 | 471 KiB + => download/goredo-2.6.4.tar.zst.meta4 meta4 + => download/goredo-2.6.4.tar.zst tar + => download/goredo-2.6.4.tar.zst.asc pgp + => download/goredo-2.6.4.tar.zst.sig ssh + +Release [NEWS]#2.6.3 | 2024-11-24 | 471 KiB + => download/goredo-2.6.3.tar.zst.meta4 meta4 + => download/goredo-2.6.3.tar.zst tar + => download/goredo-2.6.3.tar.zst.asc pgp + => download/goredo-2.6.3.tar.zst.sig ssh + +Release [NEWS]#2.6.2 | 2024-02-29 | 455 KiB + => download/goredo-2.6.2.tar.zst.meta4 meta4 + => download/goredo-2.6.2.tar.zst tar + => download/goredo-2.6.2.tar.zst.asc pgp + => download/goredo-2.6.2.tar.zst.sig ssh + +Release [NEWS]#2.6.1 | 2024-02-19 | 455 KiB + => download/goredo-2.6.1.tar.zst.meta4 meta4 + => download/goredo-2.6.1.tar.zst tar + => download/goredo-2.6.1.tar.zst.asc pgp + => download/goredo-2.6.1.tar.zst.sig ssh + +Release [NEWS]#2.6.0 | 2023-12-19 | 455 KiB + => download/goredo-2.6.0.tar.zst.meta4 meta4 + => download/goredo-2.6.0.tar.zst tar + => download/goredo-2.6.0.tar.zst.asc pgp + => download/goredo-2.6.0.tar.zst.sig ssh + +Release [NEWS]#2.5.0 | 2023-11-26 | 455 KiB + => download/goredo-2.5.0.tar.zst.meta4 meta4 + => download/goredo-2.5.0.tar.zst tar + => download/goredo-2.5.0.tar.zst.asc pgp + => download/goredo-2.5.0.tar.zst.sig ssh + +Release [NEWS]#2.4.0 | 2023-11-17 | 455 KiB + => download/goredo-2.4.0.tar.zst.meta4 meta4 + => download/goredo-2.4.0.tar.zst tar + => download/goredo-2.4.0.tar.zst.asc pgp + => download/goredo-2.4.0.tar.zst.sig ssh + +Release [NEWS]#2.3.0 | 2023-11-11 | 455 KiB + => download/goredo-2.3.0.tar.zst.meta4 meta4 + => download/goredo-2.3.0.tar.zst tar + => download/goredo-2.3.0.tar.zst.asc pgp + => download/goredo-2.3.0.tar.zst.sig ssh + +Release [NEWS]#2.2.0 | 2023-10-16 | 455 KiB + => download/goredo-2.2.0.tar.zst.meta4 meta4 + => download/goredo-2.2.0.tar.zst tar + => download/goredo-2.2.0.tar.zst.asc pgp + => download/goredo-2.2.0.tar.zst.sig ssh + +Release [NEWS]#2.1.0 | 2023-10-09 | 455 KiB + => download/goredo-2.1.0.tar.zst.meta4 meta4 + => download/goredo-2.1.0.tar.zst tar + => download/goredo-2.1.0.tar.zst.asc pgp + => download/goredo-2.1.0.tar.zst.sig ssh + +Release [NEWS]#2.0.0 | 2023-10-08 | 455 KiB + => download/goredo-2.0.0.tar.zst.meta4 meta4 + => download/goredo-2.0.0.tar.zst tar + => download/goredo-2.0.0.tar.zst.asc pgp + => download/goredo-2.0.0.tar.zst.sig ssh + +Release [NEWS]#1.32.0 | 2023-09-25 | 439 KiB + => download/goredo-1.32.0.tar.zst.meta4 meta4 + => download/goredo-1.32.0.tar.zst tar + => download/goredo-1.32.0.tar.zst.asc pgp + => download/goredo-1.32.0.tar.zst.sig ssh + +Release [NEWS]#1.31.0 | 2023-09-23 | 439 KiB + => download/goredo-1.31.0.tar.zst.meta4 meta4 + => download/goredo-1.31.0.tar.zst tar + => download/goredo-1.31.0.tar.zst.asc pgp + => download/goredo-1.31.0.tar.zst.sig ssh + +Release [NEWS]#1.30.0 | 2023-01-18 | 431 KiB + => download/goredo-1.30.0.tar.zst.meta4 meta4 + => download/goredo-1.30.0.tar.zst tar + => download/goredo-1.30.0.tar.zst.asc pgp + => download/goredo-1.30.0.tar.zst.sig ssh + +Release [NEWS]#1.29.0 | 2023-01-17 | 431 KiB + => download/goredo-1.29.0.tar.zst.meta4 meta4 + => download/goredo-1.29.0.tar.zst tar + => download/goredo-1.29.0.tar.zst.asc pgp + => download/goredo-1.29.0.tar.zst.sig ssh + +Release [NEWS]#1.28.0 | 2022-11-14 | 429 KiB + => download/goredo-1.28.0.tar.zst.meta4 meta4 + => download/goredo-1.28.0.tar.zst tar + => download/goredo-1.28.0.tar.zst.asc pgp + => download/goredo-1.28.0.tar.zst.sig ssh + +Release [NEWS]#1.27.1 | 2022-09-09 | 424 KiB + => download/goredo-1.27.1.tar.zst.meta4 meta4 + => download/goredo-1.27.1.tar.zst tar + => download/goredo-1.27.1.tar.zst.asc pgp + => download/goredo-1.27.1.tar.zst.sig ssh + +Release [NEWS]#1.27.0 | 2022-08-28 | 424 KiB + => download/goredo-1.27.0.tar.zst.meta4 meta4 + => download/goredo-1.27.0.tar.zst tar + => download/goredo-1.27.0.tar.zst.asc pgp + => download/goredo-1.27.0.tar.zst.sig ssh + +Release [NEWS]#1.26.0 | 2022-08-26 | 424 KiB + => download/goredo-1.26.0.tar.zst.meta4 meta4 + => download/goredo-1.26.0.tar.zst tar + => download/goredo-1.26.0.tar.zst.asc pgp + => download/goredo-1.26.0.tar.zst.sig ssh + +Release [NEWS]#1.25.0 | 2022-05-08 | 402 KiB + => download/goredo-1.25.0.tar.zst.meta4 meta4 + => download/goredo-1.25.0.tar.zst tar + => download/goredo-1.25.0.tar.zst.asc pgp + => download/goredo-1.25.0.tar.zst.sig ssh + +Release [NEWS]#1.24.0 | 2022-03-01 | 401 KiB + => download/goredo-1.24.0.tar.zst.meta4 meta4 + => download/goredo-1.24.0.tar.zst tar + => download/goredo-1.24.0.tar.zst.asc pgp + => download/goredo-1.24.0.tar.zst.sig ssh + +Release [NEWS]#1.23.0 | 2022-02-23 | 401 KiB + => download/goredo-1.23.0.tar.zst.meta4 meta4 + => download/goredo-1.23.0.tar.zst tar + => download/goredo-1.23.0.tar.zst.asc pgp + => download/goredo-1.23.0.tar.zst.sig ssh + +Release [NEWS]#1.22.0 | 2022-01-26 | 388 KiB + => download/goredo-1.22.0.tar.zst.meta4 meta4 + => download/goredo-1.22.0.tar.zst tar + => download/goredo-1.22.0.tar.zst.asc pgp + => download/goredo-1.22.0.tar.zst.sig ssh + +Release [NEWS]#1.21.0 | 2021-11-20 | 387 KiB + => download/goredo-1.21.0.tar.zst.meta4 meta4 + => download/goredo-1.21.0.tar.zst tar + => download/goredo-1.21.0.tar.zst.asc pgp + => download/goredo-1.21.0.tar.zst.sig ssh + +Release [NEWS]#1.20.0 | 2021-11-19 | 385 KiB + => download/goredo-1.20.0.tar.zst.meta4 meta4 + => download/goredo-1.20.0.tar.zst tar + => download/goredo-1.20.0.tar.zst.asc pgp + => download/goredo-1.20.0.tar.zst.sig ssh + +Release [NEWS]#1.19.0 | 2021-11-09 | 385 KiB + => download/goredo-1.19.0.tar.zst.meta4 meta4 + => download/goredo-1.19.0.tar.zst tar + => download/goredo-1.19.0.tar.zst.asc pgp + => download/goredo-1.19.0.tar.zst.sig ssh + +Release [NEWS]#1.18.0 | 2021-10-27 | 388 KiB + => download/goredo-1.18.0.tar.zst.meta4 meta4 + => download/goredo-1.18.0.tar.zst tar + => download/goredo-1.18.0.tar.zst.asc pgp + => download/goredo-1.18.0.tar.zst.sig ssh + +Release [NEWS]#1.17.0 | 2021-10-19 | 387 KiB + => download/goredo-1.17.0.tar.zst.meta4 meta4 + => download/goredo-1.17.0.tar.zst tar + => download/goredo-1.17.0.tar.zst.asc pgp + => download/goredo-1.17.0.tar.zst.sig ssh + +Release [NEWS]#1.16.0 | 2021-10-14 | 387 KiB + => download/goredo-1.16.0.tar.zst.meta4 meta4 + => download/goredo-1.16.0.tar.zst tar + => download/goredo-1.16.0.tar.zst.asc pgp + => download/goredo-1.16.0.tar.zst.sig ssh + +Release [NEWS]#1.15.0 | 2021-09-30 | 392 KiB + => download/goredo-1.15.0.tar.zst.meta4 meta4 + => download/goredo-1.15.0.tar.zst tar + => download/goredo-1.15.0.tar.zst.asc pgp + => download/goredo-1.15.0.tar.zst.sig ssh + +Release [NEWS]#1.14.0 | 2021-09-15 | 392 KiB + => download/goredo-1.14.0.tar.zst.meta4 meta4 + => download/goredo-1.14.0.tar.zst tar + => download/goredo-1.14.0.tar.zst.asc pgp + => download/goredo-1.14.0.tar.zst.sig ssh + +Release [NEWS]#1.13.0 | 2021-08-06 | 392 KiB + => download/goredo-1.13.0.tar.zst.meta4 meta4 + => download/goredo-1.13.0.tar.zst tar + => download/goredo-1.13.0.tar.zst.asc pgp + => download/goredo-1.13.0.tar.zst.sig ssh + +Release [NEWS]#1.12.0 | 2021-08-01 | 392 KiB + => download/goredo-1.12.0.tar.zst.meta4 meta4 + => download/goredo-1.12.0.tar.zst tar + => download/goredo-1.12.0.tar.zst.asc pgp + => download/goredo-1.12.0.tar.zst.sig ssh + +Release [NEWS]#1.11.0 | 2021-08-01 | 392 KiB + => download/goredo-1.11.0.tar.zst.meta4 meta4 + => download/goredo-1.11.0.tar.zst tar + => download/goredo-1.11.0.tar.zst.asc pgp + => download/goredo-1.11.0.tar.zst.sig ssh + +Release [NEWS]#1.10.0 | 2021-08-01 | 392 KiB + => download/goredo-1.10.0.tar.zst.meta4 meta4 + => download/goredo-1.10.0.tar.zst tar + => download/goredo-1.10.0.tar.zst.asc pgp + => download/goredo-1.10.0.tar.zst.sig ssh + +Release [NEWS]#1.9.0 | 2021-07-31 | 392 KiB + => download/goredo-1.9.0.tar.zst.meta4 meta4 + => download/goredo-1.9.0.tar.zst tar + => download/goredo-1.9.0.tar.zst.asc pgp + => download/goredo-1.9.0.tar.zst.sig ssh + +Release [NEWS]#1.8.0 | 2021-07-02 | 389 KiB + => download/goredo-1.8.0.tar.zst.meta4 meta4 + => download/goredo-1.8.0.tar.zst tar + => download/goredo-1.8.0.tar.zst.asc pgp + => download/goredo-1.8.0.tar.zst.sig ssh + +Release [NEWS]#1.7.0 | 2021-06-23 | 389 KiB + => download/goredo-1.7.0.tar.zst.meta4 meta4 + => download/goredo-1.7.0.tar.zst tar + => download/goredo-1.7.0.tar.zst.asc pgp + => download/goredo-1.7.0.tar.zst.sig ssh + +Release [NEWS]#1.6.0 | 2021-06-22 | 387 KiB + => download/goredo-1.6.0.tar.zst.meta4 meta4 + => download/goredo-1.6.0.tar.zst tar + => download/goredo-1.6.0.tar.zst.asc pgp + => download/goredo-1.6.0.tar.zst.sig ssh + +Release [NEWS]#1.5.0 | 2021-06-21 | 387 KiB + => download/goredo-1.5.0.tar.zst.meta4 meta4 + => download/goredo-1.5.0.tar.zst tar + => download/goredo-1.5.0.tar.zst.asc pgp + => download/goredo-1.5.0.tar.zst.sig ssh + +Release [NEWS]#1.4.1 | 2021-04-29 | 383 KiB + => download/goredo-1.4.1.tar.zst.meta4 meta4 + => download/goredo-1.4.1.tar.zst tar + => download/goredo-1.4.1.tar.zst.asc pgp + => download/goredo-1.4.1.tar.zst.sig ssh + +Release [NEWS]#1.4.0 | 2021-04-29 | 383 KiB + => download/goredo-1.4.0.tar.zst.meta4 meta4 + => download/goredo-1.4.0.tar.zst tar + => download/goredo-1.4.0.tar.zst.asc pgp + => download/goredo-1.4.0.tar.zst.sig ssh + +Release [NEWS]#1.3.0 | 2021-02-15 | 339 KiB + => download/goredo-1.3.0.tar.zst.meta4 meta4 + => download/goredo-1.3.0.tar.zst tar + => download/goredo-1.3.0.tar.zst.asc pgp + => download/goredo-1.3.0.tar.zst.sig ssh + +Release [NEWS]#1.2.0 | 2021-01-29 | 338 KiB + => download/goredo-1.2.0.tar.zst.meta4 meta4 + => download/goredo-1.2.0.tar.zst tar + => download/goredo-1.2.0.tar.zst.asc pgp + => download/goredo-1.2.0.tar.zst.sig ssh + +Release [NEWS]#1.1.0 | 2021-01-24 | 338 KiB + => download/goredo-1.1.0.tar.zst.meta4 meta4 + => download/goredo-1.1.0.tar.zst tar + => download/goredo-1.1.0.tar.zst.asc pgp + => download/goredo-1.1.0.tar.zst.sig ssh + +Release [NEWS]#1.0.0 | 2021-01-16 | 338 KiB + => download/goredo-1.0.0.tar.zst.meta4 meta4 + => download/goredo-1.0.0.tar.zst tar + => download/goredo-1.0.0.tar.zst.asc pgp + => download/goredo-1.0.0.tar.zst.sig ssh + +Release [NEWS]#0.12.3 | 2021-01-13 | 336 KiB + => download/goredo-0.12.3.tar.zst.meta4 meta4 + => download/goredo-0.12.3.tar.zst tar + => download/goredo-0.12.3.tar.zst.asc pgp + => download/goredo-0.12.3.tar.zst.sig ssh + +Release [NEWS]#0.12.2 | 2021-01-13 | 336 KiB + => download/goredo-0.12.2.tar.zst.meta4 meta4 + => download/goredo-0.12.2.tar.zst tar + => download/goredo-0.12.2.tar.zst.asc pgp + => download/goredo-0.12.2.tar.zst.sig ssh + +Release [NEWS]#0.12.1 | 2021-01-13 | 336 KiB + => download/goredo-0.12.1.tar.zst.meta4 meta4 + => download/goredo-0.12.1.tar.zst tar + => download/goredo-0.12.1.tar.zst.asc pgp + => download/goredo-0.12.1.tar.zst.sig ssh + +Release [NEWS]#0.12.0 | 2021-01-12 | 379 KiB + => download/goredo-0.12.0.tar.zst.meta4 meta4 + => download/goredo-0.12.0.tar.zst tar + => download/goredo-0.12.0.tar.zst.asc pgp + => download/goredo-0.12.0.tar.zst.sig ssh + +Release [NEWS]#0.11.0 | 2021-01-10 | 379 KiB + => download/goredo-0.11.0.tar.zst.meta4 meta4 + => download/goredo-0.11.0.tar.zst tar + => download/goredo-0.11.0.tar.zst.asc pgp + => download/goredo-0.11.0.tar.zst.sig ssh + +Release [NEWS]#0.10.0 | 2021-01-09 | 436 KiB + => download/goredo-0.10.0.tar.zst.meta4 meta4 + => download/goredo-0.10.0.tar.zst tar + => download/goredo-0.10.0.tar.zst.asc pgp + => download/goredo-0.10.0.tar.zst.sig ssh diff --git a/doc/Env b/doc/Env new file mode 100644 index 0000000..7d099fe --- /dev/null +++ b/doc/Env @@ -0,0 +1,2 @@ +Environment variables: +do-backs diff --git a/doc/FAQ/OODsUnchangedOutput b/doc/FAQ/OODsUnchangedOutput new file mode 100644 index 0000000..4ffe3a0 --- /dev/null +++ b/doc/FAQ/OODsUnchangedOutput @@ -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 index 0000000..b6837e8 --- /dev/null +++ b/doc/FAQ/PermanentErrors @@ -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 index 0000000..e46afcc --- /dev/null +++ b/doc/FAQ/Stamping @@ -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 +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 index 0000000..d56ad83 --- /dev/null +++ b/doc/FAQ/redo-always @@ -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 +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 index 0000000..a3d589a --- /dev/null +++ b/doc/Features @@ -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 +* 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. + 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 index 0000000..8f781a9 --- /dev/null +++ b/doc/INSTALL @@ -0,0 +1,44 @@ +Possibly goredo package already exists for your distribution: + +=> https://packages.altlinux.org/en/sisyphus/srpms/goredo/ ALT Linux Sisyphus +=> https://aur.archlinux.org/packages/goredo Arch Linux AUR +=> https://github.com/rdavid/goredoer Container image +=> https://github.com/rpmsphere/source/tree/master/g Fedora RPM Sphere +=> https://www.freshports.org/devel/goredo/ FreeBSD ports +=> https://formulae.brew.sh/formula/goredo macOS Homebrew +=> https://pkgsrc.se/devel/goredo NetBSD package +=> https://github.com/NixOS/nixpkgs/tree/master/pkgs/by-name/go/goredo NixOS packages + +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 http://y.www.goredo.cypherpunks.su/ Yggdrasil-available endpoint +=> https://yggdrasil-network.github.io/ Yggdrasil diff --git a/doc/Integrity b/doc/Integrity new file mode 100644 index 0000000..04b041c --- /dev/null +++ b/doc/Integrity @@ -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 + 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 + => PUBKEY-PGP.asc + + pub ed25519/0x3A528DDE952C7E93 2021-01-09 + 7531BB84FAF0BF35960C63B93A528DDE952C7E93 + uid goredo releases + + $ 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 + => PUBKEY-SSH.pub Public key + => PUBKEY-SSH.pub.asc, its LibrePGP signature + Its fingerprint: SHA256:ddOaswnUBtNbuoEBYQtfcF59sR3Bvzo9pIfSlw9sKx8. + + $ ssh-keygen -Y verify -f PUBKEY-SSH.pub -I goredo@cypherpunks.su -n file \ + -s goredo-$v.tar.zst.sig http://netbsd.org/ NetBSD's +=> http://www.crufty.net/help/sjg/bmake.htm (bmake) +=> https://www.gnu.org/software/make/ GNU Make (gmake) +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 +$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 index 0000000..9044072 --- /dev/null +++ b/doc/NEWS @@ -0,0 +1,328 @@ +A 2.8.0 +2.8.0 + * Fix always-OOD .do-targets with nearby default.do. + +A 2.7.0 +2.7.0 + * Proper .do file searching during source file determination. + +A 2.6.5 +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 +2.6.4 + * Fix possible NFS locking issue. + * Updated dependant libraries. + +A 2.6.3 +2.6.3 + * Updated dependant libraries. Should fix workability on modern OpenBSD. + +A 2.6.2 +2.6.2 + * Integration tests do not depend on non-portable "stat" command. + +A 2.6.1 +2.6.1 + * Integration tests do not depend on Python or Git. + +A 2.6.0 +2.6.0 + * Omit possible obtrusive error of non-existent .dep file opening of + the failed target. + +A 2.5.0 +2.5.0 + * Prevent rare race in the code, where externally modified target + may panic the program. + +A 2.4.0 +2.4.0 + * Continue regression fixing of redo-whichdo. + +A 2.3.0 +2.3.0 + * Fix regressions in redo-whichdo happened after huge refactoring. + +A 2.2.0 +2.2.0 + * Prefix target's output lines with the name of the target. + +A 2.1.0 +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 +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 +1.32.0 + * Omit printing of the "resource deadlock avoided" warning when + trying to take the lock. + +A 1.31.0 +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 +1.30.0 + * Fixed wrong OOD-cache value of source file dependency. + * Targets could be rebuilt without any reason. + +A 1.29.0 +1.29.0 + * Fix possible error when two always-ed targets are run simultaneously. + * Updated dependant libraries. + +A 1.28.0 +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 +1.27.1 + * Fixed lack of .redo.-prefix in temporary file names. + +A 1.27.0 +1.27.0 + * Improved out-of-date check and .do files search performance, + because of caching their results. + +A 1.26.0 +1.26.0 + * Debug output contained colour-related attribute even if + $NO_COLOR=1 was set. + * Updated dependant libraries. + +A 1.25.0 +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 +1.24.0 + * "redo-cleanup tmp" also removes temporary ($3) created + directories. + +A 1.23.0 +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 +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 +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 +1.20.0 + Print warning message if both ifcreate and ifchange records were + discovered after the target is done. + +A 1.19.0 +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 +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 +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 +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 +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 +1.14.0 + * Fixed redo-ifcreate's targets proper relative paths to the target. + +A 1.13.0 +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 +1.12.0 + * Fix possible lack of success finish message printing if any of + targets fail. + +A 1.11.0 +1.11.0 + * Fix nasty bug with incorrect .redo/tgt.rec files renaming. + +A 1.10.0 +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 +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 +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 +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 +1.6.0 + * redo-affects command appeared, that shows all targets that will be + affected by changing the specified ones. + +A 1.5.0 +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 +1.4.1 + * Even more simpler statusline cleaning function. + +A 1.4.0 +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 +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 +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 +1.1.0 + * redo-cleanup gained -dry-run option. + +A 1.0.0 +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 +0.12.3 + * Use an updated lukechampine.com/blake3 with possibly working + arm64 macOS fix. + +A 0.12.2 +0.12.2 + * Try to fix failing lukechampine.com/blake3 on arm64 macOS. + * Fixed tests permissions in the tarball. + +A 0.12.1 +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 +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 +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 +0.10.0 + * Initial tarballed release. diff --git a/doc/Notes b/doc/Notes new file mode 100644 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 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 + +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 +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 + +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 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 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 + +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] diff --git a/doc/THANKS b/doc/THANKS new file mode 100644 index 0000000..ea59d8b --- /dev/null +++ b/doc/THANKS @@ -0,0 +1,13 @@ +There are people deserving to be thanked for helping this project: + +=> mailto:hendry@iki.fi Kai Hendry +for his bugreports, AUR port, and Homebrew formula maintaining. + +=> mailto:spacefrogg-git@meterriblecrew.net Michael Raitz +for his bugreports and various useful suggestions. + +=> mailto:mail@jnboehm.com Jan Niklas Böh +for his suggestions and bugreports. + +=> mailto:ew.tmp2016@nassur.net +for his bugreports and examples. diff --git a/doc/cmd/Debug b/doc/cmd/Debug new file mode 100644 index 0000000..183237a --- /dev/null +++ b/doc/cmd/Debug @@ -0,0 +1,5 @@ +A [Env] REDO_LOG_PID +A [Env] REDO_DEBUG +-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 index 0000000..09b12f8 --- /dev/null +++ b/doc/cmd/Fsync @@ -0,0 +1,4 @@ +A [Env] REDO_NO_SYNC +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 index 0000000..ba2321e --- /dev/null +++ b/doc/cmd/Parallel @@ -0,0 +1,4 @@ +A [Env] REDO_JOBS +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 index 0000000..6c39df7 --- /dev/null +++ b/doc/cmd/Progress @@ -0,0 +1,6 @@ +A [Env] REDO_NO_PROGRESS +A [Env] REDO_NO_STATUS +A [Env] NO_COLOR +-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 index 0000000..2a750f1 --- /dev/null +++ b/doc/cmd/Tracing @@ -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 index 0000000..9171cbb --- /dev/null +++ b/doc/cmd/redo @@ -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 index 0000000..9486533 --- /dev/null +++ b/doc/cmd/redo-affects @@ -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 index 0000000..e597fba --- /dev/null +++ b/doc/cmd/redo-always @@ -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 index 0000000..da9151c --- /dev/null +++ b/doc/cmd/redo-cleanup @@ -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 index 0000000..054eb8f --- /dev/null +++ b/doc/cmd/redo-dep2rec @@ -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 index 0000000..a2f9cb1 --- /dev/null +++ b/doc/cmd/redo-depfix @@ -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 index 0000000..828dc05 --- /dev/null +++ b/doc/cmd/redo-dot @@ -0,0 +1,7 @@ +Dependency graph generator. +=> https://en.wikipedia.org/wiki/DOT_(graph_description_language) DOT +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 index 0000000..4d22c23 --- /dev/null +++ b/doc/cmd/redo-ifchange @@ -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 +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 index 0000000..71513c7 --- /dev/null +++ b/doc/cmd/redo-ifcreate @@ -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 index 0000000..01a75a5 --- /dev/null +++ b/doc/cmd/redo-log @@ -0,0 +1,61 @@ +A [Env] REDO_LOGS +A [Env] REDO_SILENT +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 +that you can decode with tai64nlocal utility from + => http://cr.yp.to/daemontools.html daemontools +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 +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 index 0000000..03a48ae --- /dev/null +++ b/doc/cmd/redo-ood @@ -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 index 0000000..a8aad69 --- /dev/null +++ b/doc/cmd/redo-sources @@ -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 index 0000000..0dbee5c --- /dev/null +++ b/doc/cmd/redo-stamp @@ -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 index 0000000..10ad2dc --- /dev/null +++ b/doc/cmd/redo-targets @@ -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 index 0000000..82f0891 --- /dev/null +++ b/doc/cmd/redo-whichdo @@ -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 index 6507eca..0000000 --- a/doc/cmds.texi +++ /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 index c9c643b..0000000 --- a/doc/download.texi +++ /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 index 5f15fd2..0000000 --- a/doc/faq.texi +++ /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 index 4d4c9a3..0000000 --- a/doc/features.texi +++ /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 index ceb2617..0000000 --- a/doc/goredo.info.do +++ /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 index 0000000..c859bf0 --- /dev/null +++ b/doc/index @@ -0,0 +1,43 @@ +Go implementation of +=> http://cr.yp.to/redo.html djb's redo +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 + +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 +=> https://redo.readthedocs.io/en/latest/ apenwarr/redo + +It passes tests from redo-sh and apenwarr/redo's implementation-neutral ones. +=> http://news.dieweltistgarnichtso.net/bin/redo-sh.html redo-sh + +If you are not familiar with the redo, here are advisable links to read: + +=> https://redo.readthedocs.io/en/latest/ apenwarr/redo documentation +=> http://jdebp.uk/FGA/introduction-to-redo.html Introduction to redo +=> https://apenwarr.ca/log/20101214 The only build system that might someday replace make... is djb redo +=> https://habr.com/ru/articles/517490/ Make на мыло, redo сила (in russian) +=> gemini://ew.srht.site/en/2022/20221218-redo-0.gmi ~ew's descriptive intro with many examples + +goredo is +=> https://www.gnu.org/licenses/gpl-3.0.html GNU GPLv3 +=> https://www.gnu.org/philosophy/pragmatic.html copylefted +=> https://www.gnu.org/philosophy/free-sw.html free software +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 +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 index 4dc523b..0000000 --- a/doc/index.texi +++ /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 index f1222cd..0000000 --- a/doc/install.texi +++ /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 -@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 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}. diff --git a/doc/www.do b/doc/mk-html old mode 100644 new mode 100755 similarity index 50% rename from doc/www.do rename to doc/mk-html index add049d..64514ed --- a/doc/www.do +++ b/doc/mk-html @@ -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>goredo#' $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 "\n" if /^<\/head>/' $html/Install.html +perl -i -npe 'print "\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 index 0000000..587b65f --- /dev/null +++ b/doc/mk-info @@ -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 index 49cc825..0000000 --- a/doc/news.texi +++ /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 index 951a345..0000000 --- a/doc/notes.texi +++ /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 index 3250f2e..0000000 --- a/doc/ood.texi +++ /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 index 6244047..0000000 --- a/doc/rules.texi +++ /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 index 0a3b3d8..0000000 --- a/doc/state.texi +++ /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 index 859644f..0000000 --- a/doc/thanks.texi +++ /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 diff --git a/makedist b/makedist index a06e169..3be46fa 100755 --- a/makedist +++ b/makedist @@ -13,52 +13,13 @@ go generate redo-ifchange VERSION ######################################################################## -cd doc -cat >download.texi <doc/Download < http://www.goredo.cypherpunks.su/ EOF - -mkinfo() { - ${MAKEINFO:-makeinfo} --plaintext \ - --set-customization-variable ASCII_PUNCTUATION=1 \ - -D "VERSION `cat ../VERSION`" $@ -} - -texi=$(mktemp) - -cat >$texi <$texi <$texi < 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 -- 2.52.0