[pacman-dev] [PATCH] makepkg: allow the use of only a package() function
For some packages, generally the 'any' arch ones, a build step is not
required and therefore can be skipped. In these cases, a package()
function without a build() one is sufficient.
As a side effect, this commit makes meta packages without any function
at all in the PKGBUILD possible.
Fixes FS#15147.
Signed-off-by: Cedric Staniewski
Cedric Staniewski wrote:
For some packages, generally the 'any' arch ones, a build step is not required and therefore can be skipped. In these cases, a package() function without a build() one is sufficient.
As a side effect, this commit makes meta packages without any function at all in the PKGBUILD possible.
Fixes FS#15147.
Signed-off-by: Cedric Staniewski
--- <snip> +# test for available PKGBUILD functions +# The exclamation mark is required here to avoid triggering the ERR trap when +# a tested function does not exist. +if [[ $(! type -t build) = "function" ]]; then + BUILDFUNC=1 +fi
This certainly appears to work, but can you explain how? Here is my understanding. The "!" means that when build() is not present, the function will still return 0 (not triggering the err trap) and the comparison then fails. When build() function is present, the type -t... outputs "function" but returns 1. How is the err trap not set of then? Is it because there is a value output? Anyway, this is certainly a good catch for when applying the [[ & (( patch. The rest of the patch looks good to me. Allan
Allan McRae wrote:
Cedric Staniewski wrote:
For some packages, generally the 'any' arch ones, a build step is not required and therefore can be skipped. In these cases, a package() function without a build() one is sufficient.
As a side effect, this commit makes meta packages without any function at all in the PKGBUILD possible.
Fixes FS#15147.
Signed-off-by: Cedric Staniewski
--- <snip> +# test for available PKGBUILD functions +# The exclamation mark is required here to avoid triggering the ERR trap when +# a tested function does not exist. +if [[ $(! type -t build) = "function" ]]; then + BUILDFUNC=1 +fi
This certainly appears to work, but can you explain how? Here is my understanding. The "!" means that when build() is not present, the function will still return 0 (not triggering the err trap) and the comparison then fails. When build() function is present, the type -t... outputs "function" but returns 1. How is the err trap not set of then? Is it because there is a value output?
There is no real explanation, only "that's how it works in bash". ;)
From bash's manpage:
trap [-lp] [[arg] sigspec ...] [...] The ERR trap is not executed if the failed command is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a command executed in a && or || list, or if the command's return value is being inverted via !.
Note that apparently only the test/[ builtin is meant here. Your explanation is correct for return codes, but it is not applicable here, because the ERR signal is not the same as a return code greater than zero. Given this script: ----------------- #!/bin/bash set -E trap 'echo >&2 "error"' ERR echo test1 type -t package echo ret: $? echo echo test2 ! type -t package echo ret: $? echo echo test3 type -t package || echo 1 echo ret: $? echo echo test4 type -t package && echo 1 echo ret: $? echo ----------------- It will generate the following output.
$ ./test.sh test1 error ret: 1
test2 ret: 0
test3 1 ret: 0
test4 ret: 1
The interesting case is the last one. "type -t package" returns the return code 1 and an ERR signal, but the ERR trap is not triggered, even though "echo 1" is actually never executed. So, there are several possibilities to catch the ERR signal and I only went for the exclamation mark, because it is the shortest one :). It would also be possible to use "|| echo" if you think it is easier to understand, however, it implies a wrong assumption (return code > 0 = ERR) in my opinion and the "echo" is not needed here.
Anyway, this is certainly a good catch for when applying the [[ & (( patch. The rest of the patch looks good to me.
I thought I already comment about this in the thread. Anyway, you are aware of it now.
Allan
On Sun, Nov 01, 2009 at 05:45:27PM +0000, Cedric Staniewski wrote:
Allan McRae wrote:
From bash's manpage:
trap [-lp] [[arg] sigspec ...] [...] The ERR trap is not executed if the failed command is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a command executed in a && or || list, or if the command's return value is being inverted via !.
Note that apparently only the test/[ builtin is meant here.
I get the same results with both test/[ as with [[ Reusing your code,
set -E trap 'echo >&2 "error"' ERR
false [ false ] [[ false ]] (( 0 )) ! true
Only the 'false' by itself triggers the trap. [ and [[ and treated the same.
Isaac Good wrote:
On Sun, Nov 01, 2009 at 05:45:27PM +0000, Cedric Staniewski wrote:
Allan McRae wrote:
From bash's manpage:
trap [-lp] [[arg] sigspec ...] [...] The ERR trap is not executed if the failed command is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a command executed in a && or || list, or if the command's return value is being inverted via !. Note that apparently only the test/[ builtin is meant here.
I get the same results with both test/[ as with [[
Reusing your code,
set -E trap 'echo >&2 "error"' ERR
false [ false ] [[ false ]] (( 0 )) ! true
Only the 'false' by itself triggers the trap. [ and [[ and treated the same.
You missed a small, but important part of the sentence:
part of the test *in an if statement*
Consequently, this script -------------------- #!/bin/bash set -E trap 'echo >&2 "error"' ERR echo test1 if test $(type -t package); then echo 1 fi echo test2 if [ $(type -t package) ]; then echo 1 fi echo test3 if [[ $(type -t package) ]]; then echo 1 fi echo test4 if (( $(type -t package) )); then echo 1 fi -------------------- results in $ ./test.sh test1 test2 test3 error test4 error
Cedric Staniewski wrote:
Isaac Good wrote:
On Sun, Nov 01, 2009 at 05:45:27PM +0000, Cedric Staniewski wrote:
Allan McRae wrote:
From bash's manpage:
trap [-lp] [[arg] sigspec ...] [...] The ERR trap is not executed if the failed command is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a command executed in a && or || list, or if the command's return value is being inverted via !.
Note that apparently only the test/[ builtin is meant here.
I get the same results with both test/[ as with [[
Reusing your code,
set -E trap 'echo >&2 "error"' ERR
false [ false ] [[ false ]] (( 0 )) ! true
Only the 'false' by itself triggers the trap. [ and [[ and treated the same.
You missed a small, but important part of the sentence:
part of the test *in an if statement*
Consequently, this script -------------------- #!/bin/bash set -E trap 'echo >&2 "error"' ERR
echo test1 if test $(type -t package); then echo 1 fi
echo test2 if [ $(type -t package) ]; then echo 1 fi
echo test3 if [[ $(type -t package) ]]; then echo 1 fi
echo test4 if (( $(type -t package) )); then echo 1 fi --------------------
results in
$ ./test.sh test1 test2 test3 error test4 error
Thanks for the explanation. This all makes perfect sense to me now. Patch is push to my working branch. Allan
On Sun, Nov 01, 2009 at 07:29:20PM +0000, Cedric Staniewski wrote:
Isaac Good wrote:
On Sun, Nov 01, 2009 at 05:45:27PM +0000, Cedric Staniewski wrote:
Allan McRae wrote:
From bash's manpage:
trap [-lp] [[arg] sigspec ...] [...] The ERR trap is not executed if the failed command is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a command executed in a && or || list, or if the command's return value is being inverted via !. Note that apparently only the test/[ builtin is meant here.
I get the same results with both test/[ as with [[
Reusing your code,
set -E trap 'echo >&2 "error"' ERR
false [ false ] [[ false ]] (( 0 )) ! true
Only the 'false' by itself triggers the trap. [ and [[ and treated the same.
You missed a small, but important part of the sentence:
part of the test *in an if statement*
Consequently, this script -------------------- #!/bin/bash set -E trap 'echo >&2 "error"' ERR
echo test1 if test $(type -t package); then echo 1 fi
echo test2 if [ $(type -t package) ]; then echo 1 fi
echo test3 if [[ $(type -t package) ]]; then echo 1 fi
echo test4 if (( $(type -t package) )); then echo 1 fi --------------------
results in
$ ./test.sh test1 test2 test3 error test4 error
I brought this up in FreeNode/#bash and at the very least there is an error in the man pages. More likely a bug in [[. This should be reported upstream to Chet (bash). - Isaac
participants (3)
-
Allan McRae
-
Cedric Staniewski
-
Isaac Good