{ 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: 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: if ! hasAttr "meta" drv then true else if ! hasAttr "maintainers" drv.meta then true else (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 deps = buildtimeDerivations drv; drvs = map (dep: dep.drv) deps; 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 deps = buildtimeDerivations drv; drvs = map (dep: dep.drv) deps; drvsNoMain = filter nobodyMaintains drvs; drvNames = map drvToString drvsNoMain; drvNamesList = writeText "no-maintainers" (concatLines drvNames); uniqNames = runCommandLocal "no-maintainers.txt" {} '' <${drvNamesList} sort | uniq -c > $out ''; in uniqNames; }; }; }