{ outputs = { self, nixpkgs, ... }: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; inherit (builtins) genericClosure hasAttr length map; inherit (pkgs) runCommandLocal writeText; inherit (pkgs.lib) concatLines concatLists concatMap filter isDerivation isList mapAttrsToList; in { lib = rec { drvOutputs = drv: if hasAttr "outputs" drv then map (output: drv.${output}) drv.outputs else [ drv ]; drvDeps = attrs: mapAttrsToList (k: v: if isDerivation v then (drvOutputs v) else if isList v then concatMap drvOutputs (filter isDerivation v) else [] ) attrs; wrap = drv: { key = drv.outPath; inherit drv; }; buildtimeDerivations = drv0: map (obj: obj.drv) (genericClosure { startSet = map wrap (drvOutputs drv0); operator = obj: map wrap (concatLists (drvDeps obj.drv.drvAttrs)); }); drvMaintainers = drv: if ! hasAttr "meta" drv then [] else if ! hasAttr "maintainers" drv.meta then [] else drv.meta.maintainers; nobodyMaintains = drv: hasAttr "meta" drv && hasAttr "maintainers" drv.meta && (length drv.meta.maintainers) == 0; stringJoin = objToString: objs: writeText "txt" (concatLines (map objToString objs)); maintainerToString = m: "${m.name} (${m.email})"; drvToString = drv: "${drv.name}"; }; bundlers."x86_64-linux" = with self.lib; rec { default = adopt; maintainers = drv: let drvs = buildtimeDerivations drv; maintainers = concatMap drvMaintainers drvs; maintainerNamesList = stringJoin (m: "${m.name} (${m.email})") maintainers; uniqNames = runCommandLocal "uniq-maintainers.txt" {} '' <${maintainerNamesList} sort | uniq -c > $out ''; in uniqNames; adopt = drv: let drvs = buildtimeDerivations drv; drvsNoMain = filter nobodyMaintains drvs; drvNamesList = stringJoin (drv: "${drv.name} ${drv.meta.position}") drvsNoMain; uniqNames = runCommandLocal "no-maintainers.txt" {} '' <${drvNamesList} sort -u \ | sed 's/\/nix\/store\/[^/]*/https:\/\/github.com\/NixOS\/nixpkgs\/blob\/master/' \ | sed 's/.nix:\(.*\)$/#L\1/' \ | ${pkgs.unixtools.column}/bin/column -t \ > $out ''; in uniqNames; }; }; }