3616cfb8d9
Unlike regular input-addressed or fixed-output derivations, floating and deferred derivations do not have their store path available at evaluation time, so their outPath is a placeholder. The following changes are needed for replaceDependencies to continue working: * Detect the placeholder and retrieve the store path using another IFD hack when collecting the rewrite plan. * Try to obtain the derivation name needed for replaceDirectDependencies from the derivation arguments if a placeholder is detected. * Move the length mismatch detection to build time, since the placeholder has a fixed length which is unrelated to the store path.
150 lines
4.3 KiB
Nix
150 lines
4.3 KiB
Nix
# This needs to be run in a NixOS test, because Hydra cannot do IFD.
|
|
let
|
|
pkgs = import ../../.. { };
|
|
inherit (pkgs)
|
|
runCommand
|
|
writeShellScriptBin
|
|
replaceDependency
|
|
replaceDependencies
|
|
;
|
|
inherit (pkgs.lib) escapeShellArg;
|
|
mkCheckOutput =
|
|
name: test: output:
|
|
runCommand name { } ''
|
|
actualOutput="$(${escapeShellArg "${test}/bin/test"})"
|
|
if [ "$(${escapeShellArg "${test}/bin/test"})" != ${escapeShellArg output} ]; then
|
|
echo >&2 "mismatched output: expected \""${escapeShellArg output}"\", got \"$actualOutput\""
|
|
exit 1
|
|
fi
|
|
touch "$out"
|
|
'';
|
|
oldDependency = writeShellScriptBin "dependency" ''
|
|
echo "got old dependency"
|
|
'';
|
|
oldDependency-ca = oldDependency.overrideAttrs { __contentAddressed = true; };
|
|
newDependency = writeShellScriptBin "dependency" ''
|
|
echo "got new dependency"
|
|
'';
|
|
newDependency-ca = newDependency.overrideAttrs { __contentAddressed = true; };
|
|
basic = writeShellScriptBin "test" ''
|
|
${oldDependency}/bin/dependency
|
|
'';
|
|
basic-ca = writeShellScriptBin "test" ''
|
|
${oldDependency-ca}/bin/dependency
|
|
'';
|
|
transitive = writeShellScriptBin "test" ''
|
|
${basic}/bin/test
|
|
'';
|
|
weirdDependency = writeShellScriptBin "dependency" ''
|
|
echo "got weird dependency"
|
|
${basic}/bin/test
|
|
'';
|
|
oldDependency1 = writeShellScriptBin "dependency1" ''
|
|
echo "got old dependency 1"
|
|
'';
|
|
newDependency1 = writeShellScriptBin "dependency1" ''
|
|
echo "got new dependency 1"
|
|
'';
|
|
oldDependency2 = writeShellScriptBin "dependency2" ''
|
|
${oldDependency1}/bin/dependency1
|
|
echo "got old dependency 2"
|
|
'';
|
|
newDependency2 = writeShellScriptBin "dependency2" ''
|
|
${oldDependency1}/bin/dependency1
|
|
echo "got new dependency 2"
|
|
'';
|
|
deep = writeShellScriptBin "test" ''
|
|
${oldDependency2}/bin/dependency2
|
|
'';
|
|
in
|
|
{
|
|
replacedependency-basic = mkCheckOutput "replacedependency-basic" (replaceDependency {
|
|
drv = basic;
|
|
inherit oldDependency newDependency;
|
|
}) "got new dependency";
|
|
|
|
replacedependency-basic-old-ca = mkCheckOutput "replacedependency-basic" (replaceDependency {
|
|
drv = basic-ca;
|
|
oldDependency = oldDependency-ca;
|
|
inherit newDependency;
|
|
}) "got new dependency";
|
|
|
|
replacedependency-basic-new-ca = mkCheckOutput "replacedependency-basic" (replaceDependency {
|
|
drv = basic;
|
|
inherit oldDependency;
|
|
newDependency = newDependency-ca;
|
|
}) "got new dependency";
|
|
|
|
replacedependency-transitive = mkCheckOutput "replacedependency-transitive" (replaceDependency {
|
|
drv = transitive;
|
|
inherit oldDependency newDependency;
|
|
}) "got new dependency";
|
|
|
|
replacedependency-weird =
|
|
mkCheckOutput "replacedependency-weird"
|
|
(replaceDependency {
|
|
drv = basic;
|
|
inherit oldDependency;
|
|
newDependency = weirdDependency;
|
|
})
|
|
''
|
|
got weird dependency
|
|
got old dependency'';
|
|
|
|
replacedependencies-precedence = mkCheckOutput "replacedependencies-precedence" (replaceDependencies
|
|
{
|
|
drv = basic;
|
|
replacements = [ { inherit oldDependency newDependency; } ];
|
|
cutoffPackages = [ oldDependency ];
|
|
}
|
|
) "got new dependency";
|
|
|
|
replacedependencies-self = mkCheckOutput "replacedependencies-self" (replaceDependencies {
|
|
drv = basic;
|
|
replacements = [
|
|
{
|
|
inherit oldDependency;
|
|
newDependency = oldDependency;
|
|
}
|
|
];
|
|
}) "got old dependency";
|
|
|
|
replacedependencies-deep-order1 =
|
|
mkCheckOutput "replacedependencies-deep-order1"
|
|
(replaceDependencies {
|
|
drv = deep;
|
|
replacements = [
|
|
{
|
|
oldDependency = oldDependency1;
|
|
newDependency = newDependency1;
|
|
}
|
|
{
|
|
oldDependency = oldDependency2;
|
|
newDependency = newDependency2;
|
|
}
|
|
];
|
|
})
|
|
''
|
|
got new dependency 1
|
|
got new dependency 2'';
|
|
|
|
replacedependencies-deep-order2 =
|
|
mkCheckOutput "replacedependencies-deep-order2"
|
|
(replaceDependencies {
|
|
drv = deep;
|
|
replacements = [
|
|
{
|
|
oldDependency = oldDependency2;
|
|
newDependency = newDependency2;
|
|
}
|
|
{
|
|
oldDependency = oldDependency1;
|
|
newDependency = newDependency1;
|
|
}
|
|
];
|
|
})
|
|
''
|
|
got new dependency 1
|
|
got new dependency 2'';
|
|
}
|