diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 00000000..9970dac6 --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,102 @@ +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"}}, +} + +-- A config option to allow r/w access to mods which contain +-- this one. It only avoids a couple warnings, and may not be +-- the behavior we want, so it's disabled by default. +local allow_parents=false + +local lfs = require "lfs" + +-- Seed the queue with the mods/ directory +local queue={ {"mods"} } + +local function check(dir) + -- Get the string of the directory path + local sdir=table.concat(dir, "/") + -- Save the top-level directory name as a + -- fallback in case there's no mod.conf, + -- or no name= directive. + local name=dir[#dir] + + -- Is there a mod.conf? + if lfs.attributes(sdir.."/mod.conf", "mode") == "file" then + local deps={} + for line in io.lines(sdir.."/mod.conf") do + -- Use name= if it's there + name=string.match(line, "name *= *([a-zA-Z0-9_]+)") or name + -- Get the dependency entries (if they're there) + local ents=string.match(line, "depends *=(.*)$") + if ents then + -- Split them in to the comma-separated names + for m in string.gmatch(ents, "([a-zA-Z0-9_]+),?") do + table.insert(deps, m) + end + end + end + + local glb={ name } + if allow_parents then + for _, v in pairs(dir) do + -- Skip ALL-CAPS names since those tend + -- to be collections of mods instead of + -- mods themselves. + if not string.match(v, "^[A-Z]+$") then + table.insert(glb, v) + end + end + end + + -- Tell Luacheck what the directory is allowed to do + files[sdir]={ + globals = glb, + read_globals = deps, + } + elseif lfs.attributes(sdir.."/init.lua", "mode") == "file" then + -- No mod.conf, but there's an init.lua here. + local glb={ name } + if allow_parents then + for _, v in pairs(dir) do + -- Again, skip ALL-CAPS. + if not string.match(v, "^[A-Z]+$") then + table.insert(glb, v) + end + end + end + + files[sdir]={ globals=glb } + end + + -- Queue any child directories + for d in lfs.dir(sdir) do + -- Skip hidden directories and parent/current directories. + if lfs.attributes(sdir.."/"..d, "mode") == "directory" and not string.match(d, "^%.") then + -- Copy dir in to nd (New Dir) + local nd={} + for k, v in pairs(dir) do + nd[k]=v + end + nd[#nd+1]=d + table.insert(queue, nd) + end + end +end + +while #queue > 0 do + -- Pop an entry and process it. + check(table.remove(queue, 1)) +end