aboutsummaryrefslogtreecommitdiff
path: root/tools/moduledeps.lua
diff options
context:
space:
mode:
authorJohn MacFarlane <[email protected]>2022-10-04 10:15:26 -0700
committerJohn MacFarlane <[email protected]>2022-10-04 10:17:33 -0700
commit11ec70cfeb3c6ce34fe6f7daf6dca4d75426764f (patch)
treeab5d485b7ec5493cb76ce4b0126b4dcc4b370940 /tools/moduledeps.lua
parente33d61dff99e500cb63b2a1ed63cc0041ce37a21 (diff)
Better 'make moduledeps' target.
ROOT can now be multiple modules, and the complete transitive dependencies of all of them will be printed. make moduledeps ROOT="Text.Pandoc.Class Text.Pandoc.Parsing"
Diffstat (limited to 'tools/moduledeps.lua')
-rw-r--r--tools/moduledeps.lua73
1 files changed, 73 insertions, 0 deletions
diff --git a/tools/moduledeps.lua b/tools/moduledeps.lua
new file mode 100644
index 000000000..f54d00857
--- /dev/null
+++ b/tools/moduledeps.lua
@@ -0,0 +1,73 @@
+-- Construct module dependency tree from modules.csv
+
+local dependencies = {}
+
+local csv = io.open("modules.csv")
+local lines = csv:lines()
+local mode = arg[1]
+local roots = {}
+local i = 2
+while i <= #arg do
+ roots[i - 1] = arg[i]
+ i = i + 1
+end
+
+if not (mode == "tree" or mode == "transitive") then
+ io.write("Usage: lua moduledeps (tree|transitive) modulename\n")
+ io.exit(1)
+end
+
+if #roots == 0 then
+ io.write("Usage: lua moduledeps modulename+\n")
+ io.exit(1)
+end
+
+for line in lines do
+ local _,_,mod,dep = string.find(line, "([^,]+),([^,]+)")
+ if not dependencies[mod] then
+ dependencies[mod] = {}
+ end
+ if not dependencies[dep] then
+ dependencies[dep] = {}
+ end
+ dependencies[mod][dep] = true
+end
+
+local transitive = {}
+
+function prind(ind, s)
+ io.write(string.rep(" ",ind) .. s .. "\n")
+end
+
+function add_transitive_deps(mod)
+ if transitive[mod] then
+ return
+ end
+ transitive[mod] = {}
+ for dep,_ in pairs(dependencies[mod]) do
+ transitive[mod][dep] = true
+ add_transitive_deps(dep)
+ for indirectdep,_ in pairs(transitive[dep]) do
+ transitive[mod][indirectdep] = true
+ end
+ end
+end
+
+function print_direct_deps(mod, ind)
+ ind = ind or 0
+ prind(ind, mod)
+ for dep,_ in pairs(dependencies[mod]) do
+ print_direct_deps(dep, ind + 2)
+ end
+end
+
+for _,root in ipairs(roots) do
+ if mode == "transitive" then
+ add_transitive_deps(root)
+ for dep,_ in pairs(transitive[root]) do
+ prind(2,dep)
+ end
+ elseif mode == "tree" then
+ print_direct_deps(root, 0)
+ end
+end