2015-12-16 13:59:02 +01:00
|
|
|
|
# This expression returns a list of all fetchurl calls used by ‘expr’.
|
2014-02-19 13:01:33 +01:00
|
|
|
|
|
2024-03-06 12:10:09 -08:00
|
|
|
|
{
|
|
|
|
|
expr,
|
|
|
|
|
lib ? import ../../lib,
|
|
|
|
|
}:
|
2015-12-10 15:53:48 +01:00
|
|
|
|
|
2014-02-19 13:01:33 +01:00
|
|
|
|
let
|
2024-03-06 12:10:09 -08:00
|
|
|
|
inherit (lib)
|
|
|
|
|
addErrorContext
|
|
|
|
|
attrNames
|
|
|
|
|
concatLists
|
|
|
|
|
const
|
|
|
|
|
filter
|
|
|
|
|
genericClosure
|
|
|
|
|
isAttrs
|
|
|
|
|
isDerivation
|
|
|
|
|
isList
|
|
|
|
|
mapAttrsToList
|
|
|
|
|
optional
|
|
|
|
|
optionals
|
|
|
|
|
;
|
2014-02-19 13:01:33 +01:00
|
|
|
|
|
2015-12-10 15:53:48 +01:00
|
|
|
|
root = expr;
|
2014-02-19 13:01:33 +01:00
|
|
|
|
|
2023-03-26 15:49:49 +01:00
|
|
|
|
uniqueFiles = map (x: x.file) (genericClosure {
|
|
|
|
|
startSet = map (file: {
|
|
|
|
|
key = with file; (if type == null then "" else type + "+") + hash;
|
|
|
|
|
inherit file;
|
|
|
|
|
}) files;
|
2014-02-19 13:01:33 +01:00
|
|
|
|
operator = const [ ];
|
|
|
|
|
});
|
|
|
|
|
|
2023-03-26 15:49:49 +01: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;
|
2014-02-19 13:01:33 +01:00
|
|
|
|
|
2015-12-10 15:53:48 +01:00
|
|
|
|
fetchurlDependencies = filter (
|
2016-02-25 08:29:57 +01:00
|
|
|
|
drv:
|
|
|
|
|
drv.outputHash or "" != "" && drv.outputHashMode or "flat" == "flat" && (drv ? url || drv ? urls)
|
2015-12-10 15:53:48 +01:00
|
|
|
|
) dependencies;
|
2014-02-19 13:01:33 +01:00
|
|
|
|
|
|
|
|
|
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)
|
2019-01-24 16:01:49 +01:00
|
|
|
|
else if isAttrs x then
|
|
|
|
|
concatLists (
|
|
|
|
|
mapAttrsToList (n: v: addErrorContext "while finding tarballs in '${n}':" (derivationsIn' v)) x
|
|
|
|
|
)
|
2014-02-19 13:01:33 +01:00
|
|
|
|
else
|
|
|
|
|
[ ];
|
|
|
|
|
|
|
|
|
|
keyDrv =
|
|
|
|
|
drv:
|
|
|
|
|
if canEval drv.drvPath then
|
|
|
|
|
{
|
|
|
|
|
key = drv.drvPath;
|
|
|
|
|
value = drv;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{ };
|
|
|
|
|
|
|
|
|
|
immediateDependenciesOf =
|
|
|
|
|
drv:
|
2021-11-04 13:23:30 +01:00
|
|
|
|
concatLists (
|
|
|
|
|
mapAttrsToList (n: v: derivationsIn v) (
|
|
|
|
|
removeAttrs drv (
|
2024-12-10 20:26:33 +01:00
|
|
|
|
[
|
2021-11-04 13:23:30 +01:00
|
|
|
|
"meta"
|
|
|
|
|
"passthru"
|
|
|
|
|
]
|
|
|
|
|
++ optionals (drv ? passthru) (attrNames drv.passthru)
|
2024-12-10 20:26:33 +01:00
|
|
|
|
)
|
|
|
|
|
)
|
2021-11-04 13:23:30 +01:00
|
|
|
|
);
|
2014-02-19 13:01:33 +01: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-03-26 15:49:49 +01:00
|
|
|
|
in
|
|
|
|
|
uniqueFiles
|