This guide attempts to outline the style used in the mkinitcpio codebase.
Never use POSIX syntax if Bash offers a construct of its own, even if the
two are effectively identical. This means always using double braces over
the inferior [
and test
.
There are three classifications of variables in mkinitcpio.
All lower case, and scoped within functions. Use freely, as they are well contained. Unless you are introducing a new option, this is what you want to use.
local foo="$1"
These are known to mkinitcpio internally, but are global in scope. They carry
runtime configuration and data collected during the image generation process.
These are always lower case, but carry a leading underscore to denote that
they are global. It is helpful to prefix these variables instead with a f
or
d
if they refer to a file or directory, respectively.
define -i _optcolor=1
_d_hookdir='/etc/foo.d'
_f_config='/etc/foo.conf'
Also global in scope, but exist "outside" of mkinitcpio - either drawn in from the configuration file, or "exported" to the install hooks. These are always all upper case. When introducing new variables, extreme care must be taken to pick names that will not conflict with the environment inherited by mkinitcpio.
Use all lower case with underscores where appropriate, for easy readability. Adhere to POSIX variable naming requirements for the contents of the name, that is: only alphanumerics, underscores, and the identifier must not start with a number.
Overquoting is preferred to underquoting. Prefer single quotes to double quotes if possible. Remember to quote, quote and quote some more.
When quoting variables, use brace expansion if the variable is part of a larger string.
a='/test'
b="/some/path${a}"
c="$b"
Always use "top-right, lower left" for blocks of code and functions.
do_glob() {
local g fn="$1"; shift
for g in "$@"; do
"$fn" "$g"
done
}
mkinitcpio uses bats (Bash Automated Testing System). The tests are found in
the test
directory.
Each newly added function should also have an accompanying test.
All shell scripts must be validated with ShellCheck. Use make shellcheck
and
ensure it successfully passes.
A .editorconfig
file is provided to ensure consistency
(indenting, newlines, trailing whitespace) between text editors.