diff options
| author | John MacFarlane <[email protected]> | 2022-10-04 10:15:26 -0700 |
|---|---|---|
| committer | John MacFarlane <[email protected]> | 2022-10-04 10:17:33 -0700 |
| commit | 11ec70cfeb3c6ce34fe6f7daf6dca4d75426764f (patch) | |
| tree | ab5d485b7ec5493cb76ce4b0126b4dcc4b370940 /tools | |
| parent | e33d61dff99e500cb63b2a1ed63cc0041ce37a21 (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')
| -rw-r--r-- | tools/depthfirst.gvpr | 18 | ||||
| -rw-r--r-- | tools/moduledeps.lua | 73 |
2 files changed, 73 insertions, 18 deletions
diff --git a/tools/depthfirst.gvpr b/tools/depthfirst.gvpr deleted file mode 100644 index 5539be22e..000000000 --- a/tools/depthfirst.gvpr +++ /dev/null @@ -1,18 +0,0 @@ -BEGIN { - int i, indent; - int seen[string]; - void prInd (int cnt) { - for (i = 0; i < cnt; i++) printf (" "); } -} -BEG_G { - $tvtype = TV_prepostfwd; $tvroot = node($,ARGV[0]); -} N{ - if (seen[$.name]) { - indent--; - if (indent == 0) exit(0); - } else { - prInd(indent); print ($.name); - seen[$.name] = 1; - indent++; - } -} 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 |
