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