{ 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; 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; maintainerNames = map maintainerToString maintainers; maintainerNamesList = writeText "maintainers" (concatLines maintainerNames); uniqNames = runCommandLocal "uniq-maintainers.txt" {} '' <${maintainerNamesList} sort | uniq -c > $out ''; in uniqNames; adopt = drv: let drvs = buildtimeDerivations drv; drvsNoMain = filter nobodyMaintains drvs; drvNames = map drvToString drvsNoMain; drvNamesList = writeText "no-maintainers" (concatLines drvNames); uniqNames = runCommandLocal "no-maintainers.txt" {} '' <${drvNamesList} sort -u > $out ''; in uniqNames; }; }; }