2020-04-24 23:36:52 +00:00
|
|
|
|
# This expression returns a list of all fetchurl calls used by ‘expr’.
|
|
|
|
|
|
2024-04-21 15:54:59 +00:00
|
|
|
|
{ expr, lib ? import ../../lib }:
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
let
|
2024-04-21 15:54:59 +00:00
|
|
|
|
inherit (lib)
|
|
|
|
|
addErrorContext
|
|
|
|
|
attrNames
|
|
|
|
|
concatLists
|
|
|
|
|
const
|
|
|
|
|
filter
|
|
|
|
|
genericClosure
|
|
|
|
|
isAttrs
|
|
|
|
|
isDerivation
|
|
|
|
|
isList
|
|
|
|
|
mapAttrsToList
|
|
|
|
|
optional
|
|
|
|
|
optionals
|
|
|
|
|
;
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
root = expr;
|
|
|
|
|
|
2023-05-24 13:37:59 +00:00
|
|
|
|
uniqueFiles = map (x: x.file) (genericClosure {
|
|
|
|
|
startSet = map (file: { key = with file; (if type == null then "" else type + "+") + hash; inherit file; }) files;
|
2020-04-24 23:36:52 +00:00
|
|
|
|
operator = const [ ];
|
|
|
|
|
});
|
|
|
|
|
|
2023-05-24 13:37:59 +00:00
|
|
|
|
files = map (drv: { urls = drv.urls or [ drv.url ]; hash = drv.outputHash; isPatch = (drv?postFetch && drv.postFetch != ""); type = drv.outputHashAlgo; name = drv.name; }) fetchurlDependencies;
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
fetchurlDependencies =
|
|
|
|
|
filter
|
|
|
|
|
(drv: drv.outputHash or "" != "" && drv.outputHashMode or "flat" == "flat"
|
2022-11-02 22:02:43 +00:00
|
|
|
|
&& (drv ? url || drv ? urls))
|
2020-04-24 23:36:52 +00:00
|
|
|
|
dependencies;
|
|
|
|
|
|
|
|
|
|
dependencies = map (x: x.value) (genericClosure {
|
|
|
|
|
startSet = map keyDrv (derivationsIn' root);
|
|
|
|
|
operator = { key, value }: map keyDrv (immediateDependenciesOf value);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
derivationsIn' = x:
|
|
|
|
|
if !canEval x then []
|
|
|
|
|
else if isDerivation x then optional (canEval x.drvPath) x
|
|
|
|
|
else if isList x then concatLists (map derivationsIn' x)
|
|
|
|
|
else if isAttrs x then concatLists (mapAttrsToList (n: v: addErrorContext "while finding tarballs in '${n}':" (derivationsIn' v)) x)
|
|
|
|
|
else [ ];
|
|
|
|
|
|
|
|
|
|
keyDrv = drv: if canEval drv.drvPath then { key = drv.drvPath; value = drv; } else { };
|
|
|
|
|
|
|
|
|
|
immediateDependenciesOf = drv:
|
2021-12-06 16:07:01 +00:00
|
|
|
|
concatLists (mapAttrsToList (n: v: derivationsIn v) (removeAttrs drv (["meta" "passthru"] ++ optionals (drv?passthru) (attrNames drv.passthru))));
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
derivationsIn = x:
|
|
|
|
|
if !canEval x then []
|
|
|
|
|
else if isDerivation x then optional (canEval x.drvPath) x
|
|
|
|
|
else if isList x then concatLists (map derivationsIn x)
|
|
|
|
|
else [ ];
|
|
|
|
|
|
|
|
|
|
canEval = val: (builtins.tryEval val).success;
|
|
|
|
|
|
2023-05-24 13:37:59 +00:00
|
|
|
|
in uniqueFiles
|