libmakepkg: extract PKGBUILD linting functions

Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Allan McRae 2015-05-12 23:27:07 +10:00
parent d38c098787
commit c9a7b7e0bf
21 changed files with 874 additions and 333 deletions

View file

@ -42,6 +42,7 @@ libmakepkgdir = $(datarootdir)/makepkg
LIBMAKEPKGDIRS = \ LIBMAKEPKGDIRS = \
lint_package \ lint_package \
lint_pkgbuild \
tidy \ tidy \
util util
@ -55,6 +56,23 @@ LIBMAKEPKG_IN = \
libmakepkg/lint_package.sh \ libmakepkg/lint_package.sh \
libmakepkg/lint_package/build_references.sh \ libmakepkg/lint_package/build_references.sh \
libmakepkg/lint_package/missing_backup.sh \ libmakepkg/lint_package/missing_backup.sh \
libmakepkg/lint_pkgbuild.sh \
libmakepkg/lint_pkgbuild/arch.sh \
libmakepkg/lint_pkgbuild/backup.sh \
libmakepkg/lint_pkgbuild/changelog.sh \
libmakepkg/lint_pkgbuild/epoch.sh \
libmakepkg/lint_pkgbuild/install.sh \
libmakepkg/lint_pkgbuild/optdepends.sh \
libmakepkg/lint_pkgbuild/options.sh \
libmakepkg/lint_pkgbuild/package_function.sh \
libmakepkg/lint_pkgbuild/pkgbase.sh \
libmakepkg/lint_pkgbuild/pkglist.sh \
libmakepkg/lint_pkgbuild/pkgname.sh \
libmakepkg/lint_pkgbuild/pkgrel.sh \
libmakepkg/lint_pkgbuild/pkgver.sh \
libmakepkg/lint_pkgbuild/provides.sh \
libmakepkg/lint_pkgbuild/source.sh \
libmakepkg/lint_pkgbuild/util.sh \
libmakepkg/tidy.sh \ libmakepkg/tidy.sh \
libmakepkg/tidy/docs.sh \ libmakepkg/tidy/docs.sh \
libmakepkg/tidy/emptydirs.sh \ libmakepkg/tidy/emptydirs.sh \

View file

@ -1,6 +1,8 @@
lint_package.sh lint_package.sh
lint_package/build_references.sh lint_package/build_references.sh
lint_package/missing_backup.sh lint_package/missing_backup.sh
lint_pkgbuild.sh
lint_pkgbuild/*.sh
tidy.sh tidy.sh
tidy/docs.sh tidy/docs.sh
tidy/emptydirs.sh tidy/emptydirs.sh

View file

@ -0,0 +1,46 @@
#!/bin/bash
#
# lint_pkgbuild.sh - functions for detecting PKGBUILD errors
#
# Copyright (c) 2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
declare -a lint_pkgbuild_functions
for lib in "$LIBRARY/lint_pkgbuild/"*.sh; do
source "$lib"
done
readonly -a lint_pkgbuild_functions
lint_pkgbuild() {
local ret=0
for func in ${lint_pkgbuild_functions[@]}; do
$func || ret=1
done
return $ret
}

View file

@ -0,0 +1,64 @@
#!/bin/bash
#
# arch.sh - Check the 'arch' array conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_ARCH_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_ARCH_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/pkgbuild.sh"
lint_pkgbuild_functions+=('lint_arch')
lint_arch() {
local a name list
if [[ $arch == 'any' ]]; then
return 0
fi
for a in "${arch[@]}"; do
if [[ $a = *[![:alnum:]_]* ]]; then
error "$(gettext "%s contains invalid characters: '%s'")" \
'arch' "${a//[[:alnum:]_]}"
ret=1
fi
done
if (( ! IGNOREARCH )) && ! in_array "$CARCH" "${arch[@]}"; then
error "$(gettext "%s is not available for the '%s' architecture.")" "$pkgbase" "$CARCH"
plain "$(gettext "Note that many packages may need a line added to their %s")" "$BUILDSCRIPT"
plain "$(gettext "such as %s.")" "arch=('$CARCH')"
return 1
fi
for name in "${pkgname[@]}"; do
get_pkgbuild_attribute "$name" 'arch' 1 list
if [[ $list && $list != 'any' ]] && ! in_array $CARCH "${list[@]}"; then
if (( ! IGNOREARCH )); then
error "$(gettext "%s is not available for the '%s' architecture.")" "$name" "$CARCH"
ret=1
fi
fi
done
}

View file

@ -0,0 +1,51 @@
#!/bin/bash
#
# backup.sh - Check the 'backup' array conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_BACKUP_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_BACKUP_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/pkgbuild.sh"
lint_pkgbuild_functions+=('lint_backup')
lint_backup() {
local list name backup_list ret=0
backup_list=("${backup[@]}")
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" backup 1 list; then
backup_list+=("${list[@]}")
fi
done
for name in "${backup_list[@]}"; do
if [[ ${name:0:1} = "/" ]]; then
error "$(gettext "%s entry should not contain leading slash : %s")" "backup" "$name"
ret=1
fi
done
return $ret
}

View file

@ -0,0 +1,45 @@
#!/bin/bash
#
# changelog.sh - Check the files in the 'changelog' array exist.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_CHANGELOG_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_CHANGELOG_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/pkgbuild.sh"
source "$LIBRARY/lint_pkgbuild/util.sh"
lint_pkgbuild_functions+=('lint_changelog')
lint_changelog() {
local list name file changelog_list ret=0
changelog_list=("${changelog[@]}")
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" changelog 0 file; then
changelog_list+=("$file")
fi
done
check_files_exist 'changelog' "${changelog_list[@]}"
}

View file

@ -0,0 +1,37 @@
#!/bin/bash
#
# epoch.sh - Check the 'epoch' variable conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_EPOCH_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_EPOCH_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
lint_pkgbuild_functions+=('lint_epoch')
lint_epoch() {
if [[ $epoch != *([[:digit:]]) ]]; then
error "$(gettext "%s must be an integer, not %s.")" "epoch" "$epoch"
return 1
fi
}

View file

@ -0,0 +1,44 @@
#!/bin/bash
#
# install.sh - Check the files in the 'install' array exist.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_INSTALL_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_INSTALL_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/pkgbuild.sh"
source "$LIBRARY/lint_pkgbuild/util.sh"
lint_pkgbuild_functions+=('lint_install')
lint_install() {
local list file name install_list ret=0
install_list=("${install[@]}")
for name in "${pkgname[@]}"; do
extract_function_variable "package_$name" install 0 file
install_list+=("$file")
done
check_files_exist 'install' "${install_list[@]}"
}

View file

@ -0,0 +1,64 @@
#!/bin/bash
#
# optdepends.sh - Check the 'optdepends' array conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_OPTDEPENDS_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_OPTDEPENDS_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/pkgbuild.sh"
lint_pkgbuild_functions+=('lint_optdepends')
lint_optdepends() {
local a list name optdepends_list ret=0
optdepends_list=("${optdepends[@]}")
for a in "${arch[@]}"; do
array_build list "optdepends_$a"
optdepends_list+=("${list[@]}")
done
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" optdepends 1 list; then
optdepends_list+=("${list[@]}")
fi
for a in "${arch[@]}"; do
if extract_function_variable "package_$name" "optdepends_$a" 1 list; then
optdepends_list+=("${list[@]}")
fi
done
done
for name in "${optdepends_list[@]}"; do
local pkg=${name%%:[[:space:]]*}
# the '-' character _must_ be first or last in the character range
if [[ $pkg != +([-[:alnum:]><=.+_:]) ]]; then
error "$(gettext "Invalid syntax for %s: '%s'")" "optdepend" "$name"
ret=1
fi
done
return $ret
}

View file

@ -0,0 +1,57 @@
#!/bin/bash
#
# options.sh - Check the 'options' array conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_OPTIONS_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_OPTIONS_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/pkgbuild.sh"
lint_pkgbuild_functions+=('lint_options')
lint_options() {
local ret=0 list name kopt options_list
options_list=("${options[@]}")
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" options 1 list; then
options_list+=("${list[@]}")
fi
done
for i in "${options_list[@]}"; do
# check if option matches a known option or its inverse
for kopt in "${packaging_options[@]}" "${build_options[@]}"; do
if [[ $i = "$kopt" || $i = "!$kopt" ]]; then
# continue to the next $i
continue 2
fi
done
error "$(gettext "%s array contains unknown option '%s'")" "options" "$i"
ret=1
done
return $ret
}

View file

@ -0,0 +1,51 @@
#!/bin/bash
#
# package_function.sh - Check that required package functions exist.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_PACKAGE_FUNCTION_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_PACKAGE_FUNCTION_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/pkgbuild.sh"
lint_pkgbuild_functions+=('lint_package_function')
lint_package_function() {
local i ret=0
if (( ${#pkgname[@]} == 1 )); then
if have_function 'build' && ! { have_function 'package' || have_function "package_$pkgname"; }; then
error "$(gettext "Missing %s function in %s")" "package()" "$BUILDFILE"
ret=1
fi
else
for i in "${pkgname[@]}"; do
if ! have_function "package_$i"; then
error "$(gettext "Missing %s function for split package '%s'")" "package_$i()" "$i"
ret=1
fi
done
fi
return $ret
}

View file

@ -0,0 +1,37 @@
#!/bin/bash
#
# pkgbase.sh - Check the 'pkgbase' variable conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_PKGBASE_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_PKGBASE_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
lint_pkgbuild_functions+=('lint_pkgbase')
lint_pkgbase() {
if [[ ${pkgbase:0:1} = "-" ]]; then
error "$(gettext "%s is not allowed to start with a hyphen.")" "pkgname"
return 1
fi
}

View file

@ -0,0 +1,44 @@
#!/bin/bash
#
# pkglist.sh - Check the packages selected to build exist.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_PKGLIST_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_PKGLIST_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/util.sh"
lint_pkgbuild_functions+=('lint_pkglist')
lint_pkglist() {
local i ret=0
for i in "${PKGLIST[@]}"; do
if ! in_array "$i" "${pkgname[@]}"; then
error "$(gettext "Requested package %s is not provided in %s")" "$i" "$BUILDFILE"
ret=1
fi
done
return $ret
}

View file

@ -0,0 +1,57 @@
#!/bin/bash
#
# pkgname.sh - Check the 'pkgname' variable conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_PKGNAME_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_PKGNAME_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
lint_pkgbuild_functions+=('lint_pkgname')
lint_pkgname() {
local ret=0 i
for i in "${pkgname[@]}"; do
if [[ -z $i ]]; then
error "$(gettext "%s is not allowed to be empty.")" "pkgname"
ret=1
continue
fi
if [[ ${i:0:1} = "-" ]]; then
error "$(gettext "%s is not allowed to start with a hyphen.")" "pkgname"
ret=1
fi
if [[ ${i:0:1} = "." ]]; then
error "$(gettext "%s is not allowed to start with a dot.")" "pkgname"
ret=1
fi
if [[ $i = *[^[:alnum:]+_.@-]* ]]; then
error "$(gettext "%s contains invalid characters: '%s'")" \
'pkgname' "${i//[[:alnum:]+_.@-]}"
ret=1
fi
done
return $ret
}

View file

@ -0,0 +1,42 @@
#!/bin/bash
#
# pkgrel.sh - Check the 'pkgrel' variable conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_PKGREL_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_PKGREL_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
lint_pkgbuild_functions+=('lint_pkgrel')
lint_pkgrel() {
if [[ -z $pkgrel ]]; then
error "$(gettext "%s is not allowed to be empty.")" "pkgrel"
return 1
fi
if [[ $pkgrel != +([0-9])?(.+([0-9])) ]]; then
error "$(gettext "%s must be a decimal, not %s.")" "pkgrel" "$pkgrel"
return 1
fi
}

View file

@ -0,0 +1,55 @@
#!/bin/bash
#
# pkgver.sh - Check the 'pkgver' variable conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_PKGVER_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_PKGVER_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
lint_pkgbuild_functions+=('lint_pkgver')
validate_pkgver() {
if [[ $1 = *[[:space:]:-]* ]]; then
error "$(gettext "%s is not allowed to contain colons, hyphens or whitespace.")" "pkgver"
return 1
fi
}
check_pkgver() {
if [[ -z ${pkgver} ]]; then
error "$(gettext "%s is not allowed to be empty.")" "pkgver"
return 1
fi
validate_pkgver "$pkgver"
}
lint_pkgver() {
if (( PKGVERFUNC )); then
# defer check to after getting version from pkgver function
return 0
fi
check_pkgver
}

View file

@ -0,0 +1,62 @@
#!/bin/bash
#
# provides.sh - Check the 'provides' array conforms to requirements.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_PROVIDES_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_PROVIDES_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/pkgbuild.sh"
lint_pkgbuild_functions+=('lint_provides')
lint_provides() {
local a list name provides_list ret=0
provides_list=("${provides[@]}")
for a in "${arch[@]}"; do
array_build list "provides_$a"
provides_list+=("${list[@]}")
done
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" provides 1 list; then
provides_list+=("${list[@]}")
fi
for a in "${arch[@]}"; do
if extract_function_variable "package_$name" "provides_$a" 1 list; then
provides_list+=("${list[@]}")
fi
done
done
for provide in "${provides_list[@]}"; do
if [[ $provide == *['<>']* ]]; then
error "$(gettext "%s array cannot contain comparison (< or >) operators.")" "provides"
ret=1
fi
done
return $ret
}

View file

@ -0,0 +1,39 @@
#!/bin/bash
#
# source.sh - Check the 'source' array is not sparse.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_SOURCE_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_SOURCE_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
lint_pkgbuild_functions+=('lint_source')
lint_source() {
local idx=("${!source[@]}")
if (( ${#source[*]} > 0 && (idx[-1] + 1) != ${#source[*]} )); then
error "$(gettext "Sparse arrays are not allowed for source")"
return 1
fi
}

View file

@ -0,0 +1,41 @@
#!/bin/bash
#
# util.sh - utility functions for pkgbuild linting.
#
# Copyright (c) 2014-2015 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_UTIL_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_UTIL_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
check_files_exist() {
local kind=$1 files=("${@:2}") file ret
for file in "${files[@]}"; do
if [[ $file && ! -f $file ]]; then
error "$(gettext "%s file (%s) does not exist or is not a regular file.")" \
"$kind" "$file"
ret=1
fi
done
return $ret
}

View file

@ -2135,338 +2135,6 @@ install_package() {
fi fi
} }
lint_pkgbase() {
if [[ ${pkgbase:0:1} = "-" ]]; then
error "$(gettext "%s is not allowed to start with a hyphen.")" "pkgname"
return 1
fi
}
lint_pkgname() {
local ret=0 i
for i in "${pkgname[@]}"; do
if [[ -z $i ]]; then
error "$(gettext "%s is not allowed to be empty.")" "pkgname"
ret=1
continue
fi
if [[ ${i:0:1} = "-" ]]; then
error "$(gettext "%s is not allowed to start with a hyphen.")" "pkgname"
ret=1
fi
if [[ ${i:0:1} = "." ]]; then
error "$(gettext "%s is not allowed to start with a dot.")" "pkgname"
ret=1
fi
if [[ $i = *[^[:alnum:]+_.@-]* ]]; then
error "$(gettext "%s contains invalid characters: '%s'")" \
'pkgname' "${i//[[:alnum:]+_.@-]}"
ret=1
fi
done
return $ret
}
lint_pkgrel() {
if [[ -z $pkgrel ]]; then
error "$(gettext "%s is not allowed to be empty.")" "pkgrel"
return 1
fi
if [[ $pkgrel != +([0-9])?(.+([0-9])) ]]; then
error "$(gettext "%s must be a decimal, not %s.")" "pkgrel" "$pkgrel"
return 1
fi
}
lint_pkgver() {
if (( PKGVERFUNC )); then
# defer check to after getting version from pkgver function
return 0
fi
check_pkgver
}
lint_epoch() {
if [[ $epoch != *([[:digit:]]) ]]; then
error "$(gettext "%s must be an integer, not %s.")" "epoch" "$epoch"
return 1
fi
}
lint_arch() {
local a name list
if [[ $arch == 'any' ]]; then
return 0
fi
for a in "${arch[@]}"; do
if [[ $a = *[![:alnum:]_]* ]]; then
error "$(gettext "%s contains invalid characters: '%s'")" \
'arch' "${a//[[:alnum:]_]}"
ret=1
fi
done
if (( ! IGNOREARCH )) && ! in_array "$CARCH" "${arch[@]}"; then
error "$(gettext "%s is not available for the '%s' architecture.")" "$pkgbase" "$CARCH"
plain "$(gettext "Note that many packages may need a line added to their %s")" "$BUILDSCRIPT"
plain "$(gettext "such as %s.")" "arch=('$CARCH')"
return 1
fi
for name in "${pkgname[@]}"; do
get_pkgbuild_attribute "$name" 'arch' 1 list
if [[ $list && $list != 'any' ]] && ! in_array $CARCH "${list[@]}"; then
if (( ! IGNOREARCH )); then
error "$(gettext "%s is not available for the '%s' architecture.")" "$name" "$CARCH"
ret=1
fi
fi
done
}
lint_provides() {
local a list name provides_list ret=0
provides_list=("${provides[@]}")
for a in "${arch[@]}"; do
array_build list "provides_$a"
provides_list+=("${list[@]}")
done
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" provides 1 list; then
provides_list+=("${list[@]}")
fi
for a in "${arch[@]}"; do
if extract_function_variable "package_$name" "provides_$a" 1 list; then
provides_list+=("${list[@]}")
fi
done
done
for provide in "${provides_list[@]}"; do
if [[ $provide == *['<>']* ]]; then
error "$(gettext "%s array cannot contain comparison (< or >) operators.")" "provides"
ret=1
fi
done
return $ret
}
lint_backup() {
local list name backup_list ret=0
backup_list=("${backup[@]}")
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" backup 1 list; then
backup_list+=("${list[@]}")
fi
done
for name in "${backup_list[@]}"; do
if [[ ${name:0:1} = "/" ]]; then
error "$(gettext "%s entry should not contain leading slash : %s")" "backup" "$name"
ret=1
fi
done
return $ret
}
lint_optdepends() {
local a list name optdepends_list ret=0
optdepends_list=("${optdepends[@]}")
for a in "${arch[@]}"; do
array_build list "optdepends_$a"
optdepends_list+=("${list[@]}")
done
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" optdepends 1 list; then
optdepends_list+=("${list[@]}")
fi
for a in "${arch[@]}"; do
if extract_function_variable "package_$name" "optdepends_$a" 1 list; then
optdepends_list+=("${list[@]}")
fi
done
done
for name in "${optdepends_list[@]}"; do
local pkg=${name%%:[[:space:]]*}
# the '-' character _must_ be first or last in the character range
if [[ $pkg != +([-[:alnum:]><=.+_:]) ]]; then
error "$(gettext "Invalid syntax for %s: '%s'")" "optdepend" "$name"
ret=1
fi
done
return $ret
}
check_files_exist() {
local kind=$1 files=("${@:2}") file ret
for file in "${files[@]}"; do
if [[ $file && ! -f $file ]]; then
error "$(gettext "%s file (%s) does not exist or is not a regular file.")" \
"$kind" "$file"
ret=1
fi
done
return $ret
}
lint_install() {
local list file name install_list ret=0
install_list=("${install[@]}")
for name in "${pkgname[@]}"; do
extract_function_variable "package_$name" install 0 file
install_list+=("$file")
done
check_files_exist 'install' "${install_list[@]}"
}
lint_changelog() {
local list name file changelog_list ret=0
changelog_list=("${changelog[@]}")
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" changelog 0 file; then
changelog_list+=("$file")
fi
done
check_files_exist 'changelog' "${changelog_list[@]}"
}
lint_options() {
local ret=0 list name kopt options_list
options_list=("${options[@]}")
for name in "${pkgname[@]}"; do
if extract_function_variable "package_$name" options 1 list; then
options_list+=("${list[@]}")
fi
done
for i in "${options_list[@]}"; do
# check if option matches a known option or its inverse
for kopt in "${packaging_options[@]}" "${build_options[@]}"; do
if [[ $i = "$kopt" || $i = "!$kopt" ]]; then
# continue to the next $i
continue 2
fi
done
error "$(gettext "%s array contains unknown option '%s'")" "options" "$i"
ret=1
done
return $ret
}
lint_source() {
local idx=("${!source[@]}")
if (( ${#source[*]} > 0 && (idx[-1] + 1) != ${#source[*]} )); then
error "$(gettext "Sparse arrays are not allowed for source")"
return 1
fi
}
lint_pkglist() {
local i ret=0
for i in "${PKGLIST[@]}"; do
if ! in_array "$i" "${pkgname[@]}"; then
error "$(gettext "Requested package %s is not provided in %s")" "$i" "$BUILDFILE"
ret=1
fi
done
return $ret
}
lint_packagefn() {
local i ret=0
if (( ${#pkgname[@]} == 1 )); then
if have_function 'build' && ! { have_function 'package' || have_function "package_$pkgname"; }; then
error "$(gettext "Missing %s function in %s")" "package()" "$BUILDFILE"
ret=1
fi
else
for i in "${pkgname[@]}"; do
if ! have_function "package_$i"; then
error "$(gettext "Missing %s function for split package '%s'")" "package_$i()" "$i"
ret=1
fi
done
fi
return $ret
}
check_sanity() {
# check for no-no's in the build script
local ret=0
local lintfn lint_functions
lint_functions=(
lint_pkgbase
lint_pkgname
lint_pkgver
lint_pkgrel
lint_epoch
lint_arch
lint_provides
lint_backup
lint_optdepends
lint_changelog
lint_install
lint_options
lint_packagefn
lint_pkglist
lint_source
)
for lintfn in "${lint_functions[@]}"; do
"$lintfn" || ret=1
done
return $ret
}
validate_pkgver() {
if [[ $1 = *[[:space:]:-]* ]]; then
error "$(gettext "%s is not allowed to contain colons, hyphens or whitespace.")" "pkgver"
return 1
fi
}
check_pkgver() {
if [[ -z ${pkgver} ]]; then
error "$(gettext "%s is not allowed to be empty.")" "pkgver"
return 1
fi
validate_pkgver "$pkgver"
}
get_vcsclient() { get_vcsclient() {
local proto=${1%%+*} local proto=${1%%+*}
@ -3130,7 +2798,7 @@ if have_function pkgver; then
fi fi
# check the PKGBUILD for some basic requirements # check the PKGBUILD for some basic requirements
check_sanity || exit 1 lint_pkgbuild || exit 1
# check we have the software required to process the PKGBUILD # check we have the software required to process the PKGBUILD
check_software || exit 1 check_software || exit 1

View file

@ -11,6 +11,23 @@ scripts/repo-add.sh.in
scripts/libmakepkg/lint_package.sh.in scripts/libmakepkg/lint_package.sh.in
scripts/libmakepkg/lint_package/build_references.sh.in scripts/libmakepkg/lint_package/build_references.sh.in
scripts/libmakepkg/lint_package/missing_backup.sh.in scripts/libmakepkg/lint_package/missing_backup.sh.in
scripts/libmakepkg/lint_pkgbuild.sh.in
scripts/libmakepkg/lint_pkgbuild/arch.sh.in
scripts/libmakepkg/lint_pkgbuild/backup.sh.in
scripts/libmakepkg/lint_pkgbuild/changelog.sh.in
scripts/libmakepkg/lint_pkgbuild/epoch.sh.in
scripts/libmakepkg/lint_pkgbuild/install.sh.in
scripts/libmakepkg/lint_pkgbuild/optdepends.sh.in
scripts/libmakepkg/lint_pkgbuild/options.sh.in
scripts/libmakepkg/lint_pkgbuild/package_function.sh.in
scripts/libmakepkg/lint_pkgbuild/pkgbase.sh.in
scripts/libmakepkg/lint_pkgbuild/pkglist.sh.in
scripts/libmakepkg/lint_pkgbuild/pkgname.sh.in
scripts/libmakepkg/lint_pkgbuild/pkgrel.sh.in
scripts/libmakepkg/lint_pkgbuild/pkgver.sh.in
scripts/libmakepkg/lint_pkgbuild/provides.sh.in
scripts/libmakepkg/lint_pkgbuild/source.sh.in
scripts/libmakepkg/lint_pkgbuild/util.sh.in
scripts/libmakepkg/tidy.sh.in scripts/libmakepkg/tidy.sh.in
scripts/libmakepkg/tidy/docs.sh.in scripts/libmakepkg/tidy/docs.sh.in
scripts/libmakepkg/tidy/emptydirs.sh.in scripts/libmakepkg/tidy/emptydirs.sh.in