replaceDirectDependencies: split off from replaceDependencies
This allows both swapping out and reusing the rewrite machinery.
This commit is contained in:
parent
fee5c7e1c2
commit
59ca239d1a
@ -74,7 +74,9 @@ let
|
|||||||
baseSystemAssertWarn
|
baseSystemAssertWarn
|
||||||
else
|
else
|
||||||
(pkgs.replaceDependencies.override {
|
(pkgs.replaceDependencies.override {
|
||||||
nix = config.nix.package;
|
replaceDirectDependencies = pkgs.replaceDirectDependencies.override {
|
||||||
|
nix = config.nix.package;
|
||||||
|
};
|
||||||
}) {
|
}) {
|
||||||
drv = baseSystemAssertWarn;
|
drv = baseSystemAssertWarn;
|
||||||
inherit replacements cutoffPackages;
|
inherit replacements cutoffPackages;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
runCommandLocal,
|
|
||||||
nix,
|
|
||||||
lib,
|
lib,
|
||||||
|
runCommandLocal,
|
||||||
|
replaceDirectDependencies,
|
||||||
}:
|
}:
|
||||||
|
|
||||||
# Replace some dependencies in the requisites tree of drv, propagating the change all the way up the tree, even within other replacements, without a full rebuild.
|
# Replace some dependencies in the requisites tree of drv, propagating the change all the way up the tree, even within other replacements, without a full rebuild.
|
||||||
@ -43,15 +43,13 @@ let
|
|||||||
inherit (builtins) unsafeDiscardStringContext appendContext;
|
inherit (builtins) unsafeDiscardStringContext appendContext;
|
||||||
inherit (lib)
|
inherit (lib)
|
||||||
trace
|
trace
|
||||||
substring
|
|
||||||
stringLength
|
stringLength
|
||||||
concatStringsSep
|
|
||||||
mapAttrsToList
|
|
||||||
listToAttrs
|
listToAttrs
|
||||||
attrValues
|
attrValues
|
||||||
mapAttrs
|
mapAttrs
|
||||||
filter
|
filter
|
||||||
hasAttr
|
hasAttr
|
||||||
|
mapAttrsToList
|
||||||
all
|
all
|
||||||
;
|
;
|
||||||
inherit (lib.attrsets) mergeAttrsList;
|
inherit (lib.attrsets) mergeAttrsList;
|
||||||
@ -90,21 +88,6 @@ let
|
|||||||
echo }) > $out
|
echo }) > $out
|
||||||
''
|
''
|
||||||
).outPath;
|
).outPath;
|
||||||
rewriteHashes =
|
|
||||||
drv: rewrites:
|
|
||||||
if rewrites == { } then
|
|
||||||
drv
|
|
||||||
else
|
|
||||||
let
|
|
||||||
drvName = substring 33 (stringLength (baseNameOf drv)) (baseNameOf drv);
|
|
||||||
in
|
|
||||||
runCommandLocal drvName { nixStore = "${nix}/bin/nix-store"; } ''
|
|
||||||
$nixStore --dump ${drv} | sed 's|${baseNameOf drv}|'$(basename $out)'|g' | sed -e ${
|
|
||||||
concatStringsSep " -e " (
|
|
||||||
mapAttrsToList (name: value: "'s|${baseNameOf name}|${baseNameOf value}|g'") rewrites
|
|
||||||
)
|
|
||||||
} | $nixStore --restore $out
|
|
||||||
'';
|
|
||||||
|
|
||||||
knownDerivations = [ drv ] ++ map ({ newDependency, ... }: newDependency) replacements;
|
knownDerivations = [ drv ] ++ map ({ newDependency, ... }: newDependency) replacements;
|
||||||
referencesMemo = listToAttrs (
|
referencesMemo = listToAttrs (
|
||||||
@ -162,7 +145,13 @@ let
|
|||||||
}) rewrittenReferences
|
}) rewrittenReferences
|
||||||
);
|
);
|
||||||
in
|
in
|
||||||
rewriteHashes storePathOrKnownDerivationMemo.${drv} rewrites
|
replaceDirectDependencies {
|
||||||
|
drv = storePathOrKnownDerivationMemo.${drv};
|
||||||
|
replacements = mapAttrsToList (name: value: {
|
||||||
|
oldDependency = name;
|
||||||
|
newDependency = value;
|
||||||
|
}) rewrites;
|
||||||
|
}
|
||||||
) relevantReferences
|
) relevantReferences
|
||||||
// listToAttrs (
|
// listToAttrs (
|
||||||
map (drv: {
|
map (drv: {
|
||||||
|
25
pkgs/build-support/replace-direct-dependencies.nix
Normal file
25
pkgs/build-support/replace-direct-dependencies.nix
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
runCommandLocal,
|
||||||
|
nix,
|
||||||
|
}:
|
||||||
|
|
||||||
|
# Replace some direct dependencies of drv, not recursing into the dependency tree.
|
||||||
|
# You likely want to use replaceDependencies instead, unless you plan to implement your own recursion mechanism.
|
||||||
|
{ drv, replacements ? [ ] }:
|
||||||
|
let inherit (lib) all stringLength substring concatStringsSep;
|
||||||
|
in assert all ({ oldDependency, newDependency }:
|
||||||
|
stringLength oldDependency == stringLength newDependency) replacements;
|
||||||
|
if replacements == [ ] then
|
||||||
|
drv
|
||||||
|
else
|
||||||
|
let drvName = substring 33 (stringLength (baseNameOf drv)) (baseNameOf drv);
|
||||||
|
in runCommandLocal drvName { nixStore = "${nix}/bin/nix-store"; } ''
|
||||||
|
$nixStore --dump ${drv} | sed 's|${
|
||||||
|
baseNameOf drv
|
||||||
|
}|'$(basename $out)'|g' | sed -e ${
|
||||||
|
concatStringsSep " -e " (map ({ oldDependency, newDependency }:
|
||||||
|
"'s|${baseNameOf oldDependency}|${baseNameOf newDependency}|g'")
|
||||||
|
replacements)
|
||||||
|
} | $nixStore --restore $out
|
||||||
|
''
|
@ -1319,6 +1319,8 @@ with pkgs;
|
|||||||
|
|
||||||
replaceVars = callPackage ../build-support/replace-vars { };
|
replaceVars = callPackage ../build-support/replace-vars { };
|
||||||
|
|
||||||
|
replaceDirectDependencies = callPackage ../build-support/replace-direct-dependencies.nix { };
|
||||||
|
|
||||||
nukeReferences = callPackage ../build-support/nuke-references {
|
nukeReferences = callPackage ../build-support/nuke-references {
|
||||||
inherit (darwin) signingUtils;
|
inherit (darwin) signingUtils;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user