[pacman-dev] [PATCH 2/2] lint_pkgbuild: increase robustness

David Grayson davidegrayson at gmail.com
Sun Nov 22 21:03:01 UTC 2015


It looks like this hasn't been committed yet.  Would it help if my
made a version of the patch with the improvements I mentioned?

--David

On Thu, Nov 12, 2015 at 9:33 PM, David Grayson <davidegrayson at gmail.com> wrote:
> Allan: Thank you for your work on this issue.  I tried these two patches and now pacman doesn't seem to suffer from the "--with-arch=${_arch}" false positive that originally made me look into this.   This is definitely an improvement.
>
> It looks like you are both checking the variable's current status (like my patch does) and you are also using grep to check variables defined inside the package functions.
>
> Your code for checking whether a variable is defined as an array seems pretty complicated and I'm not sure why it was written that way.  The following line at the top of a PKGBUILD will trigger a false positive because of the way grep is used:
>
>   pkgdesc="declare -a"
>
> The solution I used in my patch was to require that "declare -a" appears the beginning of the output from declare.  You could do that with grep, but bash has a built-in feature for that too:
>
>>  if [[ "$(declare -p $i)" == "declare -a "* ]]; then
>
> Also, just a minor comment: the variables "a", "v", and "pkg" should probably local.
>
> --David
>
>
> On 11/12/2015 7:57 PM, Allan McRae wrote:
>> Approach the detection of variables of the wrong type using an approach
>> similar to that used for construction of .SRCINFO files. While doing silly
>> things in bash could still result in false negatives, this approach should
>> be very robust to generatinf false positives results.
>>
>> Signed-off-by: Allan McRae <allan at archlinux.org>
>> ---
>>  scripts/libmakepkg/lint_pkgbuild/variable.sh.in | 67 ++++++++++++++++++++-----
>>  1 file changed, 55 insertions(+), 12 deletions(-)
>>
>> diff --git a/scripts/libmakepkg/lint_pkgbuild/variable.sh.in b/scripts/libmakepkg/lint_pkgbuild/variable.sh.in
>> index 1daac26..80ef895 100644
>> --- a/scripts/libmakepkg/lint_pkgbuild/variable.sh.in
>> +++ b/scripts/libmakepkg/lint_pkgbuild/variable.sh.in
>> @@ -24,7 +24,7 @@ LIBMAKEPKG_LINT_PKGBUILD_VARIABLE_SH=1
>>  LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
>>
>>  source "$LIBRARY/util/message.sh"
>> -
>> +source "$LIBRARY/util/pkgbuild.sh"
>>
>>  lint_pkgbuild_functions+=('lint_variable')
>>
>> @@ -37,11 +37,16 @@ lint_variable() {
>>                         replaces sha1sums sha256sums sha384sums sha512sums source)
>>       local string=(changelog epoch install pkgdesc pkgrel pkgver url)
>>
>> -     local i
>> -     for i in ${array[@]}; do
>> -             if grep -w -q -e "$i=[^(]" -e "$i+=[^(]" "$BUILDSCRIPT"; then
>> -                     error "$(gettext "%s should be an array")" "$i"
>> -                     ret=1
>> +     local i keys out bad
>> +
>> +     # global variables
>> +     for i in ${array[@]} ${arch_array[@]}; do
>> +             eval "keys=(\"\${!$i[@]}\")"
>> +             if (( ${#keys[*]} > 0 )); then
>> +                             if ! declare -p $i | grep -q "declare -a"; then
>> +                             error "$(gettext "%s should be an array")" "$i"
>> +                             ret=1
>> +                     fi
>>               fi
>>       done
>>
>> @@ -49,17 +54,55 @@ lint_variable() {
>>               [[ $a == "any" ]] && continue
>>
>>               for i in ${arch_array[@]}; do
>> -                     if grep -w -q -e "$i_$a=[^(]" -e "$i_$a+=[^(]" "$BUILDSCRIPT"; then
>> -                             error "$(gettext "%s_%s should be an array")" "$i" "$a"
>> -                             ret=1
>> +                     v="${i}_${a}"
>> +                     eval "keys=(\"\${!${v}[@]}\")"
>> +                     if (( ${#keys[*]} > 0 )); then
>> +                             if ! declare -p ${v} | grep -q "declare -a"; then
>> +                                     error "$(gettext "%s_%s should be an array")" "$i" "$a"
>> +                                     ret=1
>> +                             fi
>>                       fi
>>               done
>>       done
>>
>>       for i in ${string[@]}; do
>> -             if grep -w -q -e "$i=(" -e "$i+=(" "$BUILDSCRIPT"; then
>> -                     error "$(gettext "%s should not be an array")" "$i"
>> -                     ret=1
>> +             eval "keys=(\"\${!$i[@]}\")"
>> +             if (( ${#keys[*]} > 0 )); then
>> +                     if declare -p $i | grep -q "declare -a"; then
>> +                             error "$(gettext "%s should not be an array")" "$i"
>> +                             ret=1
>> +                     fi
>>               fi
>>       done
>> +
>> +     # package function variables
>> +     for pkg in ${pkgname[@]}; do
>> +             for i in ${array[@]} ${arch_array[@]}; do
>> +                     if extract_function_variable "package_$pkg" $i 0 out; then
>> +                             error "$(gettext "%s should be an array")" "$i"
>> +                             ret=1
>> +                     fi
>> +             done
>> +
>> +             for a in ${arch[@]}; do
>> +                     [[ $a == "any" ]] && continue
>> +
>> +                     for i in ${arch_array[@]}; do
>> +                             if extract_function_variable "package_$pkg" "${i}_${a}" 0 out; then
>> +                                     error "$(gettext "%s_%s should be an array")" "$i" "$a"
>> +                                     ret=1
>> +                             fi
>> +                     done
>> +             done
>> +
>> +             for i in ${string[@]}; do
>> +                     if extract_function_variable "package_$pkg" $i 1 out; then
>> +                             error "$(gettext "%s should not be an array")" "$i"
>> +                             ret=1
>> +                     fi
>> +             done
>> +     done
>> +
>> +
>> +
>>  }
>>
>


More information about the pacman-dev mailing list