on iko/ghcjs-patch-master help sign in
Improve collectComponents (#463)

Fixes #457. - Components that don't have a library component will no longer break `collectComponents "library"`. - Avoid having lots of empty attribute sets. - Don't set `recurseForDerivations` excessively.

commit2aa1329381f484bb807c7f5b5b73fc82112f1f73 authorMichael Peyton Jones <michael.peyton-jones@iohk.io> dateFri 28 Feb 2020, 22:22 (7 years ago) parent854485c
1 file changed+12−3
lib/default.nix+12−3
lib/default.nix+12−3
@@ -139,9 +139,18 @@ with haskellLib;
139139 # to: tests.mypackage.unit-tests
140140 #
141141 collectComponents = group: packageSel: haskellPackages:
142− (lib.mapAttrs (_: package: package.components.${group} // { recurseForDerivations = true; })
143− (lib.filterAttrs (name: package: (package.isHaskell or false) && packageSel package) haskellPackages))
144− // { recurseForDerivations = true; };
142+ let packageToComponents = name: package:
143+ # look for the components with this group if there are any
144+ let components = package.components.${group} or {};
145+ # set recurseForDerivations unless it's a derivation itself (e.g. the "library" component) or an empty set
146+ in if lib.isDerivation components || components == {}
147+ then components
148+ else pkgs.recurseIntoAttrs components;
149+ packageFilter = name: package: (package.isHaskell or false) && packageSel package;
150+ filteredPkgs = lib.filterAttrs packageFilter haskellPackages;
151+ # at this point we can filter out packages that don't have any of the given kind of component
152+ packagesByComponent = lib.filterAttrs (_: components: components != {}) (lib.mapAttrs packageToComponents filteredPkgs);
153+ in pkgs.recurseIntoAttrs packagesByComponent;
145154
146155 # Equivalent to collectComponents with (_: true) as selection function.
147156 # Useful for pre-filtered package-set.