diff options
Diffstat (limited to 'nixpkgs/maintainers/scripts/find-tarballs.nix')
-rw-r--r-- | nixpkgs/maintainers/scripts/find-tarballs.nix | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/nixpkgs/maintainers/scripts/find-tarballs.nix b/nixpkgs/maintainers/scripts/find-tarballs.nix new file mode 100644 index 00000000000..52cce909918 --- /dev/null +++ b/nixpkgs/maintainers/scripts/find-tarballs.nix @@ -0,0 +1,50 @@ +# This expression returns a list of all fetchurl calls used by ‘expr’. + +with import ../.. { }; +with lib; + +{ expr }: + +let + + root = expr; + + uniqueUrls = map (x: x.file) (genericClosure { + startSet = map (file: { key = file.url; inherit file; }) urls; + operator = const [ ]; + }); + + urls = map (drv: { url = head (drv.urls or [ drv.url ]); hash = drv.outputHash; type = drv.outputHashAlgo; name = drv.name; }) fetchurlDependencies; + + fetchurlDependencies = + filter + (drv: drv.outputHash or "" != "" && drv.outputHashMode or "flat" == "flat" + && drv.postFetch or "" == "" && (drv ? url || drv ? urls)) + 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: + concatLists (mapAttrsToList (n: v: derivationsIn v) (removeAttrs drv ["meta" "passthru"])); + + 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; + +in uniqueUrls |