Merge pull request #329823 from ExpidusOS/fix/pkgsllvm/elfutils
[NixPkgs.git] / maintainers / scripts / find-tarballs.nix
blobcae4bec201ce083657636344445679e25f07b2a4
1 # This expression returns a list of all fetchurl calls used by ‘expr’.
3 { expr, lib ? import ../../lib }:
5 let
6   inherit (lib)
7     addErrorContext
8     attrNames
9     concatLists
10     const
11     filter
12     genericClosure
13     isAttrs
14     isDerivation
15     isList
16     mapAttrsToList
17     optional
18     optionals
19     ;
21   root = expr;
23   uniqueFiles = map (x: x.file) (genericClosure {
24     startSet = map (file: { key = with file; (if type == null then "" else type + "+") + hash; inherit file; }) files;
25     operator = const [ ];
26   });
28   files = map (drv: { urls = drv.urls or [ drv.url ]; hash = drv.outputHash; isPatch = (drv?postFetch && drv.postFetch != ""); type = drv.outputHashAlgo; name = drv.name; }) fetchurlDependencies;
30   fetchurlDependencies =
31     filter
32       (drv: drv.outputHash or "" != "" && drv.outputHashMode or "flat" == "flat"
33           && (drv ? url || drv ? urls))
34       dependencies;
36   dependencies = map (x: x.value) (genericClosure {
37     startSet = map keyDrv (derivationsIn' root);
38     operator = { key, value }: map keyDrv (immediateDependenciesOf value);
39   });
41   derivationsIn' = x:
42     if !canEval x then []
43     else if isDerivation x then optional (canEval x.drvPath) x
44     else if isList x then concatLists (map derivationsIn' x)
45     else if isAttrs x then concatLists (mapAttrsToList (n: v: addErrorContext "while finding tarballs in '${n}':" (derivationsIn' v)) x)
46     else [ ];
48   keyDrv = drv: if canEval drv.drvPath then { key = drv.drvPath; value = drv; } else { };
50   immediateDependenciesOf = drv:
51     concatLists (mapAttrsToList (n: v: derivationsIn v) (removeAttrs drv (["meta" "passthru"] ++ optionals (drv?passthru) (attrNames drv.passthru))));
53   derivationsIn = x:
54     if !canEval x then []
55     else if isDerivation x then optional (canEval x.drvPath) x
56     else if isList x then concatLists (map derivationsIn x)
57     else [ ];
59   canEval = val: (builtins.tryEval val).success;
61 in uniqueFiles