let pkgs = import <nixpkgs> {}; inherit (pkgs.lib) concatMap hasAttr; in rec { no-touch-args = { config = throw "no-touch-args: can't touch config!"; lib = throw "no-touch-args: can't touch lib!"; pkgs = throw "no-touch-args: can't touch pkgs!"; }; # list-imports : path -> [path] # Return a module's transitive list of imports. # XXX duplicates won't get eliminated from the result. list-imports = path: let module = import path no-touch-args; imports = if hasAttr "imports" module then concatMap list-imports module.imports else []; in [path] ++ imports; }