Merge pull request #4313 from NixOS/fastReplaceDeps

Exponentially reduce computation time needed for replace-dependency by u...
This commit is contained in:
roconnor 2014-09-28 21:19:55 -04:00
commit 6b2ecc5b39

View File

@ -49,8 +49,13 @@ let
referencesOf = drv: getAttr (discard (toString drv)) references; referencesOf = drv: getAttr (discard (toString drv)) references;
dependsOnOld = drv: elem oldStorepath (referencesOf drv) || dependsOnOldMemo = listToAttrs (map
any dependsOnOld (referencesOf drv); (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: drvName = drv:
discard (substring 33 (stringLength (builtins.baseNameOf drv)) (builtins.baseNameOf drv)); discard (substring 33 (stringLength (builtins.baseNameOf drv)) (builtins.baseNameOf drv));
@ -65,15 +70,12 @@ let
rewrittenDeps = listToAttrs [ {name = discard (toString oldDependency); value = newDependency;} ]; rewrittenDeps = listToAttrs [ {name = discard (toString oldDependency); value = newDependency;} ];
rewrittenDerivations = drv: rewriteMemo = listToAttrs (map
if dependsOnOld drv (drv: { name = discard (toString drv);
then listToAttrs [ { value = rewriteHashes (builtins.storePath drv)
name = discard (toString 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))); in assert (stringLength (drvName (toString oldDependency)) == stringLength (drvName (toString newDependency)));
getAttr (discard (toString drv)) (rewrittenDerivations drv) getAttr (discard (toString drv)) rewriteMemo