1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#!/usr/bin/env lua5.1
local json = require "json"
local sha1 = require "sha1"
local lfs = require "lfs"
local inspect = require "inspect"
--local argparse = require "argparse"
--local parser = argparse()
--local args = parser:parse()
local args = {macro_dir = "/home/g/subs/automation-scripts/macros", config = "conf.lua", output = "DependencyControl.json"}
local conf = loadfile(args.config)()
local function valid_namespace(name)
--[[ #### Rules for a valid namespace: ####
1. contains _at least_ one dot
2. must **not** start or end with a dot
3. must **not** contain series of two or more dots
4. the character set is restricted to: `A-Z`, `a-z`, `0-9`, `.`, `_`, `-`
__Examples__:
* l0.ASSFoundation
* l0.ASSFoundation.Common (for a separately version-controlled 'submodule')
* l0.ASSWipe
* a-mo.LineCollection
]]
return name:match("^[^.][%a%d._-]*%.[%a%d._-]*[^.]$") ~= nil
-- not 100% sure this works. it matches the examples, but idk if it matches invalid ones as well
end
local function clean_path(path, file)
-- don't want to be pedantic about paths, but still don't want paths with // in them
if path:sub(-1, -1) == "/" then path = path:sub(1, -2) end
return path .. "/" .. file
end
local function join_tables(dst, src)
for i, v in ipairs(src) do
table.insert(dst, v)
end
return dst
end
local function get_files(path)
local files = {}
for file in lfs.dir(path) do
local name, extension = file:match("^(.*)%.(.*)$") -- anything.anything
local absolute = clean_path(path, file)
if file == "." or file == ".." then -- silently skip dir and 1-level-up dir
elseif pcall(lfs.dir, absolute) then file = join_tables(files, get_files(absolute)) -- search recursively
elseif extension ~= "lua" then print(absolute .. ": not a lua file, skipping")
elseif not valid_namespace(name) then print(absolute .. ": invalid namespace, skipping")
else table.insert(files, absolute) end
end
return files
end
local function main()
local files = get_files(args.macro_dir)
print(inspect(files))
end
main()
|