Re: rpmbuild: `! true` does not fail %install, but `false` does, `! true` fails other sections

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wednesday, April 6, 2022 10:13:16 AM CEST Zbigniew Jędrzejewski-Szmek wrote:
> On Wed, Apr 06, 2022 at 02:20:19AM +0200, Miro Hrončok wrote:
> > On 06. 04. 22 1:08, Mamoru TASAKA wrote:
> > > 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
> 
> > > 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 !.
> > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 
> Yeah, it's a fairly terrible gotcha. To add to the excellent explanation
> by Mamoru, when there's a sequence of commands, the return value of the
> last command becomes the return value of the program. Thus bash -c 'set -e; ! true; true'
> returns success, but 'set -e; true; ! true' returns failure.

Just note that the 'set -e' isn't related to the shell exit status in this
case.  It simply returns non-zero exit status because it _normally_
inherits that from the last command.

With the set -e, the surprising (but documented) fact is that
'set -e ; false ; true' fails but 'set -e ; ! true ; true' doesn't (this is
excatly the scriptlet case).

Pavel

> We fought with this in the systemd testsuite [e.g. 1,2]. One neat treat
> is to push the inversion into the command:
>   ! test -e /some/path → test ! -e /some/path
> 
> Another trick is to wrap the whole command in a subshell [3]. Then the return
> value of the (only) command becomes the return value of the subshell:
>   ! false → ( ! false )
> (Only () works. {} doesn't have the same effect.)
> 
> [1] https://github.com/systemd/systemd/commit/ffa328f060
> [2] https://github.com/systemd/systemd/commit/b1e1e5ac25
> [3] https://github.com/systemd/systemd/commit/d6c51c485a
> 
> > I guess I need to verify the packages where we use `! grep ...` etc. in %check:
> > 
> > 
> > $ rg '^!\s+\S' rpm-specs/
> > rpm-specs/python-tomli.spec
> > 81:! grep '^Requires-Dist:'
> > %{buildroot}%{python3_sitelib}/tomli-%{version}.dist-info/METADATA
> > 
> > rpm-specs/symfpu.spec
> > 78:! ./test --allTests
> > 
> > rpm-specs/radamsa.spec
> > 39:! diff -u output1 output2
> > 
> > rpm-specs/python-rpm-macros.spec
> > 133:! grep -E '^#[^%%]*%%[^%%]' %{buildroot}%{rpmmacrodir}/macros.*
> > 
> > rpm-specs/python-pyqtchart.spec
> > 71:! grep %{buildroot} %{buildroot}%{distinfo}/*
> > 
> > rpm-specs/python-bleach.spec
> > 55:! find %{buildroot}%{python3_sitelib}/bleach/ -type d | grep vendor
> > 
> > rpm-specs/ilua.spec
> > 59:! grep Traceback check.log
> > 
> > rpm-specs/hspell.spec
> > 66:! make test | grep FAILED | grep -E -v '1/aspell/[489]'
> > 
> > rpm-specs/gdb.spec
> > 472:! find -name "*.rej" # Should not happen.
> > 762:! grep '_RELOCATABLE.*1' gdb/config.h
> > 
> > rpm-specs/gap-pkg-edim.spec
> > 87:! grep -Fq 'false' log
> > 
> > rpm-specs/csnappy.spec
> > 49:! test -e LICENSE
> > 
> > And https://src.fedoraproject.org/rpms/pyproject-rpm-macros/blob/rawhide/f/tests/python-ldap.spec
> > + other specs there.
> 
> This just shows how hard bash is to use correctly. shellcheck helps a
> lot, but even it doesn't find all the caveats.
> 
> Zbyszek
> _______________________________________________
> 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
> 



_______________________________________________
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




[Index of Archives]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite Forum]     [KDE Users]

  Powered by Linux