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'';
|
||
|
}
|