@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/*.rec are filled up
+$ 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
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
- check if they have non-altered ctime values and update them in place.
+ 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
Skein/BLAKE[23] algorithms demonstrate us.
@command{goredo} includes @command{redo-stamp}, that really records the
-stamp in the @file{.rec} file, but it does not play any role later. It
+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?
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 just remove @file{foo/.redo/bar.rec}.
+then remove @file{foo/.redo/bar.dep}.
@section Does redo-always always rebuilds target?
@cindex news
@unnumbered News
+@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
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, @file{.rec} file. It is
-@url{https://www.gnu.org/software/recutils/, recfile}, that could have
-various dependency information. For example:
+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
Hash: 5bbdf635932cb16b9127e69b6f3872577efed338f0a4ab6f2c7ca3df6ce50cc9
@end example
-And the schema definition:
+And its schema definition:
@verbatiminclude ../dep.rec
d = `Usage: redo-affects target [...]
List all targets that will be affected by changing the specified ones.`
+ case CmdNameRedoDep2Rec:
+ d = `Usage: redo-dep2rec .../.redo/file.dep
+
+Convert binary .dep file to recfile and write it to stdout.`
case CmdNameRedoDepFix:
d = `Usage: redo-depfix