aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/maintainers/scripts/find-tarballs.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/maintainers/scripts/find-tarballs.nix')
-rw-r--r--nixpkgs/maintainers/scripts/find-tarballs.nix50
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