bash: Add tests.withChecks passthru to run tests (#435033)
This commit is contained in:
@@ -6,6 +6,10 @@
|
|||||||
updateAutotoolsGnuConfigScriptsHook,
|
updateAutotoolsGnuConfigScriptsHook,
|
||||||
bison,
|
bison,
|
||||||
util-linux,
|
util-linux,
|
||||||
|
coreutils,
|
||||||
|
libredirect,
|
||||||
|
glibcLocales,
|
||||||
|
gnused,
|
||||||
|
|
||||||
interactive ? true,
|
interactive ? true,
|
||||||
readline,
|
readline,
|
||||||
@@ -29,13 +33,13 @@ lib.warnIf (withDocs != null)
|
|||||||
bash: `.override { withDocs = true; }` is deprecated, the docs are always included.
|
bash: `.override { withDocs = true; }` is deprecated, the docs are always included.
|
||||||
''
|
''
|
||||||
stdenv.mkDerivation
|
stdenv.mkDerivation
|
||||||
rec {
|
(fa: {
|
||||||
pname = "bash${lib.optionalString interactive "-interactive"}";
|
pname = "bash${lib.optionalString interactive "-interactive"}";
|
||||||
version = "5.3${patch_suffix}";
|
version = "5.3${fa.patch_suffix}";
|
||||||
patch_suffix = "p${toString (builtins.length upstreamPatches)}";
|
patch_suffix = "p${toString (builtins.length upstreamPatches)}";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "mirror://gnu/bash/bash-${lib.removeSuffix patch_suffix version}.tar.gz";
|
url = "mirror://gnu/bash/bash-${lib.removeSuffix fa.patch_suffix fa.version}.tar.gz";
|
||||||
hash = "sha256-DVzYaWX4aaJs9k9Lcb57lvkKO6iz104n6OnZ1VUPMbo=";
|
hash = "sha256-DVzYaWX4aaJs9k9Lcb57lvkKO6iz104n6OnZ1VUPMbo=";
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -137,8 +141,7 @@ lib.warnIf (withDocs != null)
|
|||||||
"SHOBJ_LIBS=-lbash"
|
"SHOBJ_LIBS=-lbash"
|
||||||
];
|
];
|
||||||
|
|
||||||
nativeCheckInputs = [ util-linux ];
|
doCheck = false; # Can't be enabled by default due to dependency cycle, use passthru.tests.withChecks instead
|
||||||
doCheck = false; # dependency cycle, needs to be interactive
|
|
||||||
|
|
||||||
postInstall = ''
|
postInstall = ''
|
||||||
ln -s bash "$out/bin/sh"
|
ln -s bash "$out/bin/sh"
|
||||||
@@ -160,6 +163,96 @@ lib.warnIf (withDocs != null)
|
|||||||
passthru = {
|
passthru = {
|
||||||
shellPath = "/bin/bash";
|
shellPath = "/bin/bash";
|
||||||
tests.static = pkgsStatic.bash;
|
tests.static = pkgsStatic.bash;
|
||||||
|
tests.withChecks = fa.finalPackage.overrideAttrs (attrs: {
|
||||||
|
doCheck = true;
|
||||||
|
|
||||||
|
nativeCheckInputs = attrs.nativeCheckInputs or [ ] ++ [
|
||||||
|
util-linux
|
||||||
|
libredirect.hook
|
||||||
|
glibcLocales
|
||||||
|
gnused
|
||||||
|
];
|
||||||
|
|
||||||
|
meta = attrs.meta // {
|
||||||
|
# Ignore Darwin for now, because the tests fail in many more ways than on Linux
|
||||||
|
broken = attrs.meta.broken or false || stdenv.buildPlatform.isDarwin;
|
||||||
|
};
|
||||||
|
|
||||||
|
patches = attrs.patches or [ ] ++ [
|
||||||
|
# See commit comment, also submitted upstream: https://lists.gnu.org/archive/html/bug-bash/2025-10/msg00054.html
|
||||||
|
./fail-tests.patch
|
||||||
|
# See commit comment, also submitted upstream: https://lists.gnu.org/archive/html/bug-bash/2025-10/msg00055.html
|
||||||
|
./failed-tests-output.patch
|
||||||
|
# The run-builtins test _almost_ succeeds, only has a bit of PATH trouble
|
||||||
|
# and some odd terminal column mismatch
|
||||||
|
./fix-builtins-tests.patch
|
||||||
|
# The run-invocation test _almost_ succeeds, only has a bit of PATH trouble
|
||||||
|
./fix-invocation-tests.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
preCheck = attrs.preCheck or "" + ''
|
||||||
|
# Allows looking at actual outputs for failed tests
|
||||||
|
export BASH_TSTOUT_KEEPDIR=$(mktemp -d)
|
||||||
|
export HOME=$(mktemp -d)
|
||||||
|
export NIX_REDIRECTS=${
|
||||||
|
lib.concatMapAttrsStringSep ":" (name: value: "${name}=${value}") {
|
||||||
|
"/bin/echo" = lib.getExe' coreutils "echo";
|
||||||
|
"/bin/cat" = lib.getExe' coreutils "cat";
|
||||||
|
"/bin/rm" = lib.getExe' coreutils "rm";
|
||||||
|
"/usr" = "$(mktemp -d)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
disabled_checks=(
|
||||||
|
# Unsets PATH and breaks, not clear
|
||||||
|
run-execscript
|
||||||
|
|
||||||
|
# Fails on ZFS & needs a ja_JP.SJIS locale, which glibcLocales doesn't have
|
||||||
|
run-intl
|
||||||
|
|
||||||
|
# These error with "echo: write error: Broken pipe"
|
||||||
|
run-histexpand
|
||||||
|
run-lastpipe
|
||||||
|
run-comsub
|
||||||
|
run-comsub2
|
||||||
|
|
||||||
|
# For some reason has an extra 'declare -x version="5.2p37"'
|
||||||
|
run-nameref
|
||||||
|
|
||||||
|
# These print some extra 'trap -- ''' SIGPIPE'
|
||||||
|
run-trap
|
||||||
|
run-varenv
|
||||||
|
|
||||||
|
# These rely on /dev/tty
|
||||||
|
run-read
|
||||||
|
run-test
|
||||||
|
run-vredir
|
||||||
|
|
||||||
|
# Might also be related to not having a tty: "Inappropriate ioctl for device"
|
||||||
|
run-history
|
||||||
|
|
||||||
|
# Can be enabled in 5.4
|
||||||
|
run-printf
|
||||||
|
|
||||||
|
# This is probably fixable without too much trouble, but just not having a hardcoded PATH in type5.sub doesn't cut it
|
||||||
|
# 142,143c142,147
|
||||||
|
# < type5.sub: line 23: mkdir: command not found
|
||||||
|
# < type5.sub: line 24: cd: /build/type-23722: No such file or directory
|
||||||
|
# ---
|
||||||
|
# > cat is /bin/cat
|
||||||
|
# > cat is aliased to `echo cat'
|
||||||
|
# > /bin/cat
|
||||||
|
# > break is a shell builtin
|
||||||
|
# > break is a special shell builtin
|
||||||
|
# > ./e
|
||||||
|
run-type
|
||||||
|
)
|
||||||
|
for check in "''${disabled_checks[@]}"; do
|
||||||
|
# Exit before running the test script
|
||||||
|
sed -i "1iecho 'Skipping test $check' >&2 && exit 0" "tests/$check"
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
@@ -181,7 +274,7 @@ lib.warnIf (withDocs != null)
|
|||||||
platforms = platforms.all;
|
platforms = platforms.all;
|
||||||
# https://github.com/NixOS/nixpkgs/issues/333338
|
# https://github.com/NixOS/nixpkgs/issues/333338
|
||||||
badPlatforms = [ lib.systems.inspect.patterns.isMinGW ];
|
badPlatforms = [ lib.systems.inspect.patterns.isMinGW ];
|
||||||
maintainers = [ ];
|
maintainers = with lib.maintainers; [ infinisil ];
|
||||||
mainProgram = "bash";
|
mainProgram = "bash";
|
||||||
identifiers.cpeParts =
|
identifiers.cpeParts =
|
||||||
let
|
let
|
||||||
@@ -194,4 +287,4 @@ lib.warnIf (withDocs != null)
|
|||||||
update = lib.elemAt versionSplit 2;
|
update = lib.elemAt versionSplit 2;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
})
|
||||||
|
|||||||
58
pkgs/shells/bash/fail-tests.patch
Normal file
58
pkgs/shells/bash/fail-tests.patch
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
From 750cfd9af2174e1fa8164e433be1379e3e367c78 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Silvan Mosberger <silvan.mosberger@moduscreate.com>
|
||||||
|
Date: Tue, 7 Oct 2025 15:01:00 +0200
|
||||||
|
Subject: [PATCH 1/2] Fail run-all on non-zero exit codes and summarise the
|
||||||
|
results
|
||||||
|
|
||||||
|
Previously it was hard to determine whether the tests passed or not.
|
||||||
|
With this change, run-all exiting with 0 means that no tests failed.
|
||||||
|
|
||||||
|
This allows us to set up CI for our bash package in the NixOS distribution:
|
||||||
|
https://github.com/NixOS/nixpkgs/pull/435033
|
||||||
|
|
||||||
|
We hope that it will also be useful for other distributions to make sure
|
||||||
|
their packaging is correct.
|
||||||
|
|
||||||
|
Co-Authored-By: Silvan Mosberger <silvan.mosberger@tweag.io>
|
||||||
|
Co-Authored-By: Aleksander Bantyev <alexander.bantyev@tweag.io>
|
||||||
|
---
|
||||||
|
tests/run-all | 17 ++++++++++++++++-
|
||||||
|
1 file changed, 16 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git tests/run-all tests/run-all
|
||||||
|
index f9dfa604..c8f503a2 100644
|
||||||
|
--- tests/run-all
|
||||||
|
+++ tests/run-all
|
||||||
|
@@ -58,13 +58,28 @@ rm -f ${BASH_TSTOUT}
|
||||||
|
|
||||||
|
echo Any output from any test, unless otherwise noted, indicates a possible anomaly
|
||||||
|
|
||||||
|
+passed=0
|
||||||
|
+total=0
|
||||||
|
for x in run-*
|
||||||
|
do
|
||||||
|
case $x in
|
||||||
|
$0|run-minimal|run-gprof) ;;
|
||||||
|
*.orig|*~) ;;
|
||||||
|
- *) echo $x ; sh $x ; rm -f ${BASH_TSTOUT} ;;
|
||||||
|
+ *)
|
||||||
|
+ echo $x
|
||||||
|
+ total=$(( total + 1 ))
|
||||||
|
+ if sh $x; then
|
||||||
|
+ passed=$(( passed + 1 ))
|
||||||
|
+ else
|
||||||
|
+ echo "$x EXITED NON-ZERO ($?) - possible anomaly unless otherwise noted"
|
||||||
|
+ fi
|
||||||
|
+ rm -f "${BASH_TSTOUT}"
|
||||||
|
+ ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
+echo "$passed/$total tests had exit code zero"
|
||||||
|
+if [ "$passed" -ne "$total" ]; then
|
||||||
|
+ exit 1
|
||||||
|
+fi
|
||||||
|
exit 0
|
||||||
|
--
|
||||||
|
2.49.0
|
||||||
|
|
||||||
40
pkgs/shells/bash/failed-tests-output.patch
Normal file
40
pkgs/shells/bash/failed-tests-output.patch
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
From 30c4d7fb34a09cf0a711c43231bd13fc380844d0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Silvan Mosberger <silvan.mosberger@moduscreate.com>
|
||||||
|
Date: Tue, 7 Oct 2025 15:08:49 +0200
|
||||||
|
Subject: [PATCH 2/2] allow keeping output of potentially failed tests
|
||||||
|
|
||||||
|
Previously if a test produced a diff, the only way to fix it was to
|
||||||
|
inspect the test output.
|
||||||
|
|
||||||
|
We introduce the BASH_TSTOUT_KEEPDIR environment variable which is
|
||||||
|
expected to point to a directory.
|
||||||
|
If set, that directory will be populated with output from all failed
|
||||||
|
tests, with test names as file names.
|
||||||
|
|
||||||
|
This makes debugging or updating the expected test outputs easier.
|
||||||
|
|
||||||
|
Co-Authored-By: Silvan Mosberger <silvan.mosberger@tweag.io>
|
||||||
|
Co-Authored-By: Aleksander Bantyev <alexander.bantyev@tweag.io>
|
||||||
|
---
|
||||||
|
tests/run-all | 5 +++++
|
||||||
|
1 file changed, 5 insertions(+)
|
||||||
|
|
||||||
|
diff --git tests/run-all tests/run-all
|
||||||
|
index c8f503a2..5d769d0f 100644
|
||||||
|
--- tests/run-all
|
||||||
|
+++ tests/run-all
|
||||||
|
@@ -72,6 +72,11 @@ do
|
||||||
|
passed=$(( passed + 1 ))
|
||||||
|
else
|
||||||
|
echo "$x EXITED NON-ZERO ($?) - possible anomaly unless otherwise noted"
|
||||||
|
+ if [ "${BASH_TSTOUT_KEEPDIR+set}" = "set" ]; then
|
||||||
|
+ cp "${BASH_TSTOUT}" "${BASH_TSTOUT_KEEPDIR}/$x"
|
||||||
|
+ else
|
||||||
|
+ echo "Hint: set BASH_TSTOUT_KEEPDIR environment variable to a directory to keep test output there"
|
||||||
|
+ fi
|
||||||
|
fi
|
||||||
|
rm -f "${BASH_TSTOUT}"
|
||||||
|
;;
|
||||||
|
--
|
||||||
|
2.49.0
|
||||||
|
|
||||||
26
pkgs/shells/bash/fix-builtins-tests.patch
Normal file
26
pkgs/shells/bash/fix-builtins-tests.patch
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
diff --git tests/builtins.right tests/builtins.right
|
||||||
|
index d708c18..32b2cfd 100644
|
||||||
|
--- tests/builtins.right
|
||||||
|
+++ tests/builtins.right
|
||||||
|
@@ -362,7 +362,7 @@ A star (*) next to a name means that the command is disabled.
|
||||||
|
complete [-abcdefgjksuv] [-pr] [-DEI]> set [-abefhkmnptuvxBCEHPT] [-o optio>
|
||||||
|
compopt [-o|+o option] [-DEI] [name .> shift [n]
|
||||||
|
continue [n] shopt [-pqsu] [-o] [optname ...]
|
||||||
|
- coproc [NAME] command [redirections] source [-p path] filename [argument>
|
||||||
|
+ coproc [NAME] command [redirections] source [-p path] filename [arguments>
|
||||||
|
declare [-aAfFgiIlnrtux] [name[=value> suspend [-f]
|
||||||
|
dirs [-clpv] [+N] [-N] test [expr]
|
||||||
|
disown [-h] [-ar] [jobspec ... | pid > time [-p] pipeline
|
||||||
|
diff --git tests/source8.sub tests/source8.sub
|
||||||
|
index a6826da..fc4ae8c 100644
|
||||||
|
--- tests/source8.sub
|
||||||
|
+++ tests/source8.sub
|
||||||
|
@@ -15,7 +15,7 @@
|
||||||
|
# test various uses of source -p
|
||||||
|
|
||||||
|
: ${THIS_SH:=./bash}
|
||||||
|
-PATH=/bin:/usr/bin:/sbin:/usr/sbin
|
||||||
|
+PATH="$(dirname "$(type -P mkdir)")"
|
||||||
|
|
||||||
|
: ${TMPDIR:=/var/tmp}
|
||||||
|
export TDIR=${TMPDIR}/cwd-$$
|
||||||
13
pkgs/shells/bash/fix-invocation-tests.patch
Normal file
13
pkgs/shells/bash/fix-invocation-tests.patch
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
diff --git tests/invocation.tests tests/invocation.tests
|
||||||
|
index c629c29..537e470 100644
|
||||||
|
--- tests/invocation.tests
|
||||||
|
+++ tests/invocation.tests
|
||||||
|
@@ -71,7 +71,7 @@ command cd -L $TDIR
|
||||||
|
./x23
|
||||||
|
|
||||||
|
# this should result in a cannot execute binary file error since ls is in $PATH
|
||||||
|
-PATH=/bin:/usr/bin
|
||||||
|
+#PATH=/bin:/usr/bin
|
||||||
|
${THIS_SH} ls |& sed 's|^.*: ||'
|
||||||
|
|
||||||
|
cd $SAVEPWD
|
||||||
Reference in New Issue
Block a user