# [`dotd`][]
Generate a file from fragment files in a directory.
`dotd` is intended to be used to (re-)generate e.g. a configuration file
`config` from files in a corresponding directory `config.d` where separate
people or programs can place configuration fragment files without treading on
each other's toes, when the native configuration language does not support
functionality equivalent to `include config.d/*`. In essence, it is a glorified
`cat config.d/* > config`.
The generated file is compared against any pre-existing file, if they differ a
warning is printed and the pre-existing file is moved to a backup file whose
name includes a time stamp.
[`dotd`]: https://git.rcrnstn.net/rcrnstn/dotd
## Usage
`dotd --help`:
```
dotd 1.0
Generate a file from fragment files in a directory.
usage:
dotd [options] [--] <file> [<dir>]
dotd -h|--help
dotd --version
arguments:
<file>
File to generate. Specify - to print to stdout instead.
<dir>
Directory containing fragment files. <file>.d is used if not
specified.
options:
-a, --action <action>
Action to perform on each fragment file. E.g.
printf "#include \"%s\"\n"
[default: cat]
-c, --comment <comment>
If non-empty, adds comments starting with <comment> that the file is
auto-generated and which fragment corresponds to which file. E.g.
//
[default: ]
-g, --glob <glob>
Shell glob used to find fragment files, relative to <dir>. E.g
*.h
[default: *]
-v, --validate <validate>
Command to run on the (temporary) generated file. Only if the command
returns success is the file moved to its final destination. E.g.
/usr/sbin/sshd -t -f
[default: ]
```
## Dependencies
All dependencies are [POSIX][] (except `mktemp`, but most Unix-like systems
have some version), and are highly likely to be installed by default (e.g. they
all have the [Debian priority][] `required`).
- `sh` (e.g. from [`bash`][] or [`dash`][])
- `rm`, `mv`, `tail`, `date`, `mktemp` (e.g. from [`coreutils`][])
- `cmp` (e.g. from [`diffutils`][])
- `sed` (e.g. from [`sed`][])
- `awk` (e.g. from [`mawk`][])
[POSIX]: https://en.wikipedia.org/wiki/POSIX
[Debian priority]: https://www.debian.org/doc/debian-policy/ch-archive.html#s-priorities
[`bash`]: https://packages.debian.org/bash
[`dash`]: https://packages.debian.org/dash
[`coreutils`]: https://packages.debian.org/coreutils
[`diffutils`]: https://packages.debian.org/diffutils
[`sed`]: https://packages.debian.org/sed
[`mawk`]: https://packages.debian.org/mawk
## Related projects
- [Ansible][]'s [`assemble` module][].
- [Puppet][]'s [`concat` module][].
[Ansible]: https://en.wikipedia.org/wiki/Ansible_(software)
[`assemble` module]: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/assemble_module.html
[Puppet]: https://en.wikipedia.org/wiki/Puppet_(software)
[`concat` module]: https://forge.puppet.com/modules/puppetlabs/concat
## License
Licensed under the [ISC License][] unless otherwise noted, see the
[`LICENSE`][] file.
[ISC License]: https://choosealicense.com/licenses/isc/
[`LICENSE`]: LICENSE