Miro Hrončok wrote on 2022/04/06 4:21:
Hello folks, I've realized that if the %install section contains a command that reverses the exit code from success to failure via !, the build does not fail, but it proceeds. In other sections, the build fails. E.g. this: %install ! true Does not fail the build. But this does: %install false As well as this: %build ! true Any idea why this is happening? Is it a bug, or a feature? This happens on Fedora 35 locally as well as Rawhide in Koji/mock. All of the following (applied separately) fail the RPM build: %prep false Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.A1K5K0 + umask 022 + cd /home/churchyard/rpmbuild/BUILD + false error: Bad exit status from /var/tmp/rpm-tmp.A1K5K0 (%prep) %build false Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.YR6FiX + umask 022 + cd /home/churchyard/rpmbuild/BUILD + false error: Bad exit status from /var/tmp/rpm-tmp.YR6FiX (%build) %install false Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.OapPfB + umask 022 + cd /home/churchyard/rpmbuild/BUILD + '[' /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 '!=' / ']' + rm -rf /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 ++ dirname /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 + mkdir -p /home/churchyard/rpmbuild/BUILDROOT + mkdir /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 + false error: Bad exit status from /var/tmp/rpm-tmp.OapPfB (%install) %check false Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.CnEWIO + umask 022 + cd /home/churchyard/rpmbuild/BUILD + false error: Bad exit status from /var/tmp/rpm-tmp.CnEWIO (%check) But when replaced with `! true`, %install (and %install only) succeeds: %prep ! true Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.ojDvj8 + umask 022 + cd /home/churchyard/rpmbuild/BUILD + true + RPM_EC=1 ++ jobs -p + exit 1 error: Bad exit status from /var/tmp/rpm-tmp.ojDvj8 (%prep) %build ! true Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.RTiQQH + umask 022 + cd /home/churchyard/rpmbuild/BUILD + true + RPM_EC=1 ++ jobs -p + exit 1 error: Bad exit status from /var/tmp/rpm-tmp.RTiQQH (%build) %install ! true Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.RczM4N + umask 022 + cd /home/churchyard/rpmbuild/BUILD + '[' /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 '!=' / ']' + rm -rf /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 ++ dirname /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 + mkdir -p /home/churchyard/rpmbuild/BUILDROOT + mkdir /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 + true + /usr/lib/rpm/check-buildroot + ... + /usr/lib/rpm/redhat/brp-python-hardlink Executing(%check): ... Or even: %install ! true echo UNREACHABLE Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.nzrs6N + umask 022 + cd /home/churchyard/rpmbuild/BUILD + '[' /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 '!=' / ']' + rm -rf /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 ++ dirname /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 + mkdir -p /home/churchyard/rpmbuild/BUILDROOT + mkdir /home/churchyard/rpmbuild/BUILDROOT/reproducer-0-0.x86_64 + true + echo UNREACHABLE UNREACHABLE + /usr/lib/rpm/check-buildroot + ... + /usr/lib/rpm/redhat/brp-python-hardlink Executing(%check): ... %check ! true Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.4E9WU3 + umask 022 + cd /home/churchyard/rpmbuild/BUILD + true + RPM_EC=1 ++ jobs -p + exit 1 error: Bad exit status from /var/tmp/rpm-tmp.4E9WU3 (%check) What sorcery is this?
I think because on %install section, your line "! false" is followed by "echo UNREACHABLE" sentense and later by brp- scripts, and bash "set -e" explanation says: Exit immediately if a pipeline (which may consist of a single simple command), a list, or a compound command (see SHELL GRAMMAR above), exits with a non-zero status. The shell does not exit if the command that fails is ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ part of the command list immediately following a while ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the ^^^^^^^^^ command's return value is being inverted with !. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ So as far as I read the above explanation, this is expected bash behavior. Regards, Mamoru _______________________________________________ packaging mailing list -- packaging@xxxxxxxxxxxxxxxxxxxxxxx To unsubscribe send an email to packaging-leave@xxxxxxxxxxxxxxxxxxxxxxx Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedoraproject.org/archives/list/packaging@xxxxxxxxxxxxxxxxxxxxxxx Do not reply to spam on the list, report it: https://pagure.io/fedora-infrastructure