summary refs log tree commit diff
path: root/pkgs
diff options
context:
space:
mode:
authorroconnor <roconnor@theorem.ca>2014-09-28 21:19:55 -0400
committerroconnor <roconnor@theorem.ca>2014-09-28 21:19:55 -0400
commit6b2ecc5b39dbb0cb1f047418e706ccdad08ae49b (patch)
treeabd0fb3c8301c04a5ef212445e9b5b127ce39c37 /pkgs
parentee58e828556752d2bf4628ee9b47936d530d1d2a (diff)
parent94c6af494a8c7d7a8a6f516312e4f848c1a62ed4 (diff)
downloadnixlib-6b2ecc5b39dbb0cb1f047418e706ccdad08ae49b.tar
nixlib-6b2ecc5b39dbb0cb1f047418e706ccdad08ae49b.tar.gz
nixlib-6b2ecc5b39dbb0cb1f047418e706ccdad08ae49b.tar.bz2
nixlib-6b2ecc5b39dbb0cb1f047418e706ccdad08ae49b.tar.lz
nixlib-6b2ecc5b39dbb0cb1f047418e706ccdad08ae49b.tar.xz
nixlib-6b2ecc5b39dbb0cb1f047418e706ccdad08ae49b.tar.zst
nixlib-6b2ecc5b39dbb0cb1f047418e706ccdad08ae49b.zip
Merge pull request #4313 from NixOS/fastReplaceDeps
Exponentially reduce computation time needed for replace-dependency by u...
Diffstat (limited to 'pkgs')
-rw-r--r--pkgs/build-support/replace-dependency.nix26
1 files changed, 14 insertions, 12 deletions
diff --git a/pkgs/build-support/replace-dependency.nix b/pkgs/build-support/replace-dependency.nix
index 098637b4f9b9..ed65b9dad1db 100644
--- a/pkgs/build-support/replace-dependency.nix
+++ b/pkgs/build-support/replace-dependency.nix
@@ -49,8 +49,13 @@ let
 
   referencesOf = drv: getAttr (discard (toString drv)) references;
 
-  dependsOnOld = drv: elem oldStorepath (referencesOf drv) ||
-    any dependsOnOld (referencesOf drv);
+  dependsOnOldMemo = listToAttrs (map
+    (drv: { name = discard (toString drv);
+            value = elem oldStorepath (referencesOf drv) ||
+                    any dependsOnOld (referencesOf drv);
+          }) (builtins.attrNames references));
+
+  dependsOnOld = drv: getAttr (discard (toString drv)) dependsOnOldMemo;
 
   drvName = drv:
     discard (substring 33 (stringLength (builtins.baseNameOf drv)) (builtins.baseNameOf drv));
@@ -65,15 +70,12 @@ let
 
   rewrittenDeps = listToAttrs [ {name = discard (toString oldDependency); value = newDependency;} ];
 
-  rewrittenDerivations = drv:
-    if dependsOnOld drv
-      then listToAttrs [ {
-        name = discard (toString drv);
+  rewriteMemo = listToAttrs (map
+    (drv: { name = discard (toString drv);
+            value = rewriteHashes (builtins.storePath drv)
+              (filterAttrs (n: v: builtins.elem (builtins.storePath (discard (toString n))) (referencesOf drv)) rewriteMemo);
+          })
+    (filter dependsOnOld (builtins.attrNames references))) // rewrittenDeps;
 
-        value = rewriteHashes drv (rewrittenDeps // (fold (drv: acc:
-          (rewrittenDerivations drv) // acc
-        ) {} (referencesOf drv)));
-      } ]
-      else {};
 in assert (stringLength (drvName (toString oldDependency)) == stringLength (drvName (toString newDependency)));
-getAttr (discard (toString drv)) (rewrittenDerivations drv)
+getAttr (discard (toString drv)) rewriteMemo