forked from Mineclonia/Mineclonia
tools: add a luacheckrc generator
tools/make-luacheck-files.sh will generate a .luacheckrc with the following rules: - any rules set in the project header (.luacheck.head) - each mod is allowed to use a single global sharing its mod name - mod dependency information is parsed, and those mods' globals are permitted for read access
This commit is contained in:
parent
3ee2ef0618
commit
0c13293f43
|
@ -0,0 +1,17 @@
|
|||
std = "min"
|
||||
|
||||
read_globals = {
|
||||
"ItemStack",
|
||||
"dump", "dump2",
|
||||
"vector",
|
||||
"VoxelArea",
|
||||
"minetest",
|
||||
"PseudoRandom",
|
||||
"PerlinNoise",
|
||||
"PcgRandom",
|
||||
|
||||
string = {fields = {"split", "trim"}},
|
||||
table = {fields = {"copy", "getn", "indexof", "insert_all"}},
|
||||
math = {fields = {"hypot", "round"}},
|
||||
}
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# make-luacheck-files.sh
|
||||
# v1 - E - Initial version
|
||||
|
||||
set -ue
|
||||
|
||||
if [ ! -d "mods" ] || [ ! -r ".luacheck.head" ]; then
|
||||
printf "error: this script needs to be run from the mineclonia project root\n" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# We need these to be explicitly NOT expanded.
|
||||
# shellcheck disable=2016
|
||||
{
|
||||
# This creates a luacheckrc-compatible line from a mod (supplied on
|
||||
# the command line with -v MOD="mod_name"), a directory (-v DIR="..."),
|
||||
# and a list of dependencies (via STDIN). The `read_globals` section is
|
||||
# skipped if there are no dependencies (-v EMPTY=1).
|
||||
AWK_DEPS2LCHECK='
|
||||
BEGIN {
|
||||
printf("files[\"" DIR "\"] = { globals = { \"" MOD "\" }");
|
||||
if (!EMPTY) {
|
||||
printf(", read_globals = { ");
|
||||
}
|
||||
};
|
||||
|
||||
# Without a pattern, this will match on empty lines
|
||||
# and mess up the entry. We clean up the extra commas
|
||||
# later in the script.
|
||||
/.+/{
|
||||
sub("?$", "");
|
||||
sub("\xd", "");
|
||||
printf("\"" $1 "\", ");
|
||||
};
|
||||
|
||||
END {
|
||||
if (!EMPTY) {
|
||||
printf("}");
|
||||
}
|
||||
printf(" }\n");
|
||||
};'
|
||||
|
||||
# This takes any line that contains 'depends' and an equal sign
|
||||
# and spits out each (comma-separated) entry on its own line.
|
||||
SED_MODCONF2DEPS='
|
||||
/depends *=/{
|
||||
s/.*depends *=//;
|
||||
s/, ?/\n/g;
|
||||
p;
|
||||
}'
|
||||
|
||||
HEADER='
|
||||
-------------------------------------------------------------------
|
||||
-- THIS FILE WAS AUTOGENERATED BY tools/make-luacheck-files.sh ! --
|
||||
-- DO NOT EDIT BY HAND. YOUR CHANGES WILL BE LOST NEXT RUN! --
|
||||
-------------------------------------------------------------------
|
||||
|
||||
'
|
||||
}
|
||||
|
||||
find mods -type d -print | while read -r DIR; do
|
||||
if [ -r "$DIR/depends.txt" ]; then
|
||||
printf "found: %s (%s)\n" "$DIR" "depends.txt" 1>&2
|
||||
# depends.txt is a simple newline-delimited file,
|
||||
# so we can just read it in.
|
||||
DEPS="$(cat "$DIR/depends.txt")"
|
||||
elif [ -r "$DIR/mod.conf" ]; then
|
||||
printf "found: %s (%s)\n" "$DIR" "mod.conf" 1>&2
|
||||
# mod.conf needs some more help to get usable
|
||||
# data out of it.
|
||||
DEPS="$(sed -n -r -e "$SED_MODCONF2DEPS" "$DIR/mod.conf")"
|
||||
else
|
||||
# Empty dir, or not a mod dir.
|
||||
continue
|
||||
fi
|
||||
|
||||
EMPTY=0
|
||||
if [ -z "$DEPS" ]; then
|
||||
EMPTY=1
|
||||
fi
|
||||
|
||||
# Get only the last chunk of the directory
|
||||
# for the mod name.
|
||||
MOD="${DIR##*/}"
|
||||
|
||||
# Now we run through it through the formatter,
|
||||
# and remove any rogue trailing commas.
|
||||
{ awk -v DIR="$DIR" -v EMPTY="$EMPTY" -v MOD="$MOD" -- "$AWK_DEPS2LCHECK" | sed -e "s/, }/ }/"; } <<-EOF
|
||||
$DEPS
|
||||
EOF
|
||||
done > .luacheck.files
|
||||
|
||||
# Put the final thing together with the warning header
|
||||
{ printf "%s" "$HEADER"; cat .luacheck.head .luacheck.files; } > .luacheckrc
|
Loading…
Reference in New Issue