diff options
author | Alyssa Ross <hi@alyssa.is> | 2021-07-09 12:30:28 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2021-07-23 09:11:31 +0000 |
commit | 55cc63c079f49e81d695a25bc2f5b3902f2bd290 (patch) | |
tree | e705335d97f50b927c76ccb4a3fbde9fab8372b9 /nixpkgs/pkgs/build-support | |
parent | c26eb6f74d9393127a21eee7a9620a920769f613 (diff) | |
parent | 87807e64a5ef5206b745a40af118c7be8db73681 (diff) | |
download | nixlib-55cc63c079f49e81d695a25bc2f5b3902f2bd290.tar nixlib-55cc63c079f49e81d695a25bc2f5b3902f2bd290.tar.gz nixlib-55cc63c079f49e81d695a25bc2f5b3902f2bd290.tar.bz2 nixlib-55cc63c079f49e81d695a25bc2f5b3902f2bd290.tar.lz nixlib-55cc63c079f49e81d695a25bc2f5b3902f2bd290.tar.xz nixlib-55cc63c079f49e81d695a25bc2f5b3902f2bd290.tar.zst nixlib-55cc63c079f49e81d695a25bc2f5b3902f2bd290.zip |
Merge commit '87807e64a5ef5206b745a40af118c7be8db73681'
Diffstat (limited to 'nixpkgs/pkgs/build-support')
-rw-r--r-- | nixpkgs/pkgs/build-support/docker/default.nix | 3 | ||||
-rw-r--r-- | nixpkgs/pkgs/build-support/trivial-builders.nix | 4 | ||||
-rw-r--r-- | nixpkgs/pkgs/build-support/trivial-builders/test-overriding.nix | 119 |
3 files changed, 123 insertions, 3 deletions
diff --git a/nixpkgs/pkgs/build-support/docker/default.nix b/nixpkgs/pkgs/build-support/docker/default.nix index 9369e7d3158f..ffe5d69ec90d 100644 --- a/nixpkgs/pkgs/build-support/docker/default.nix +++ b/nixpkgs/pkgs/build-support/docker/default.nix @@ -117,7 +117,8 @@ rec { --tmpdir=$TMPDIR \ --override-os ${os} \ --override-arch ${arch} \ - copy "$sourceURL" "docker-archive://$out:$destNameTag" + copy "$sourceURL" "docker-archive://$out:$destNameTag" \ + | cat # pipe through cat to force-disable progress bar ''; # We need to sum layer.tar, not a directory, hence tarsum instead of nix-hash. diff --git a/nixpkgs/pkgs/build-support/trivial-builders.nix b/nixpkgs/pkgs/build-support/trivial-builders.nix index 219f808403cc..6f51ba512c12 100644 --- a/nixpkgs/pkgs/build-support/trivial-builders.nix +++ b/nixpkgs/pkgs/build-support/trivial-builders.nix @@ -116,7 +116,7 @@ rec { , checkPhase ? "" # syntax checks, e.g. for scripts }: runCommand name - { inherit text executable; + { inherit text executable checkPhase; passAsFile = [ "text" ]; # Pointless to do this on a remote machine. preferLocalBuild = true; @@ -132,7 +132,7 @@ rec { echo -n "$text" > "$n" fi - ${checkPhase} + eval "$checkPhase" (test -n "$executable" && chmod +x "$n") || true ''; diff --git a/nixpkgs/pkgs/build-support/trivial-builders/test-overriding.nix b/nixpkgs/pkgs/build-support/trivial-builders/test-overriding.nix new file mode 100644 index 000000000000..ddd5dc050752 --- /dev/null +++ b/nixpkgs/pkgs/build-support/trivial-builders/test-overriding.nix @@ -0,0 +1,119 @@ +# Check that overriding works for trivial-builders like +# `writeShellScript` via `overrideAttrs`. This is useful +# to override the `checkPhase`, e. g. when you want +# to enable extglob in `writeShellScript`. +# +# Run using `nix-build -A tests.trivial-overriding`. +{ lib +, runtimeShell +, runCommand +, callPackage +, writeShellScript +, writeTextFile +, writeShellScriptBin +}: + +let + extglobScript = '' + shopt -s extglob + touch success + echo @(success|failure) + rm success + ''; + + # Reuse the old `checkPhase` of `writeShellScript`, but enable extglob. + allowExtglob = old: { + checkPhase = '' + # make sure we don't change the settings for + # the rest of the derivation's build + ( + export BASHOPTS + shopt -s extglob + ${old.checkPhase} + ) + ''; + }; + + # Run old checkPhase, but only succeed if it fails. + # This HACK is required because we can't introspect build failures + # in nix: With `assertFail` we want to make sure that the default + # `checkPhase` would fail if extglob was used in the script. + assertFail = old: { + # write old checkPhase into a shell script, so we can check for + # the phase to fail even though we have `set -e`. + checkPhase = '' + if source ${writeShellScript "old-check-phase" old.checkPhase} 2>/dev/null; then + exit 1 + fi + ''; + }; + + simpleCase = case: + writeShellScript "test-trivial-overriding-${case}" extglobScript; + + callPackageCase = case: callPackage ( + { writeShellScript }: + writeShellScript "test-trivial-callpackage-overriding-${case}" extglobScript + ) { }; + + binCase = case: + writeShellScriptBin "test-trivial-overriding-bin-${case}" extglobScript; + + # building this derivation would fail without overriding + textFileCase = writeTextFile { + name = "test-trivial-overriding-text-file"; + checkPhase = "false"; + text = '' + #!${runtimeShell} + echo success + ''; + executable = true; + }; + + mkCase = f: type: isBin: + let + drv = (f type).overrideAttrs + (if type == "succ" then allowExtglob else assertFail); + in if isBin then "${drv}/bin/${drv.name}" else drv; + + writeTextOverrides = { + # Enabling globbing in checkPhase + simpleSucc = mkCase simpleCase "succ" false; + # Ensure it's possible to fail; in this case globbing is not enabled. + simpleFail = mkCase simpleCase "fail" false; + # Do the same checks after wrapping with callPackage + # to make sure callPackage doesn't mess with the override + callpSucc = mkCase callPackageCase "succ" false; + callpFail = mkCase callPackageCase "fail" false; + # Do the same check using `writeShellScriptBin` + binSucc = mkCase binCase "succ" true; + binFail = mkCase binCase "fail" true; + # Check that we can also override plain writeTextFile + textFileSuccess = textFileCase.overrideAttrs (_: { + checkPhase = "true"; + }); + }; + + # `runTest` forces nix to build the script of our test case and + # run its `checkPhase` which is our main interest. Additionally + # it executes the script and thus makes sure that extglob also + # works at run time. + runTest = script: + let + name = script.name or (builtins.baseNameOf script); + in writeShellScript "run-${name}" '' + if [ "$(${script})" != "success" ]; then + echo "Failed in ${script}" + exit 1 + fi + ''; +in + +runCommand "test-writeShellScript-overriding" { + passthru = { inherit writeTextOverrides; }; +} '' + ${lib.concatMapStrings (test: '' + ${runTest test} + '') (lib.attrValues writeTextOverrides)} + touch "$out" +'' |