#!/bin/bash # Usage : parse_pkgbuilds.sh arch # Example : parse_pkgbuilds.sh i686 /var/abs/core /var/abs/extra exit() { return; } splitpkg_overrides=('depends' 'optdepends' 'provides' 'conflicts') variables=('pkgname' 'pkgbase' 'pkgver' 'pkgrel' 'makedepends' 'arch' ${splitpkg_overrides[@]}) readonly -a variables splitpkg_overrides backup_package_variables() { for var in ${splitpkg_overrides[@]}; do indirect="${var}_backup" eval "${indirect}=(\${$var[@]})" done } restore_package_variables() { for var in ${splitpkg_overrides[@]}; do indirect="${var}_backup" if [ -n "${!indirect}" ]; then eval "${var}=(\${$indirect[@]})" else unset ${var} fi done } print_info() { echo -e "%NAME%\n$pkgname\n" echo -e "%VERSION%\n$pkgver-$pkgrel\n" echo -e "%PATH%\n$dir\n" if [ -n "$pkgbase" ]; then echo -e "%BASE%\n$pkgbase\n" fi if [ -n "$arch" ]; then echo "%ARCH%" for i in ${arch[@]}; do echo $i; done echo "" fi if [ -n "$depends" ]; then echo "%DEPENDS%" for i in ${depends[@]}; do echo $i done echo "" fi if [ -n "$makedepends" ]; then echo "%MAKEDEPENDS%" for i in ${makedepends[@]}; do echo $i done echo "" fi if [ -n "$conflicts" ]; then echo "%CONFLICTS%" for i in ${conflicts[@]}; do echo $i; done echo "" fi if [ -n "$provides" ]; then echo "%PROVIDES%" for i in ${provides[@]}; do echo $i; done echo "" fi } source_pkgbuild() { ret=0 dir=$1 pkgbuild=$dir/PKGBUILD for var in ${variables[@]}; do unset ${var} done source $pkgbuild &>/dev/null || ret=$? # ensure $pkgname and $pkgver variables were found if [ $ret -ne 0 -o -z "$pkgname" -o -z "$pkgver" ]; then echo -e "%INVALID%\n$pkgbuild\n" return 1 fi if [ "${#pkgname[@]}" -gt "1" ]; then pkgbase=${pkgbase:-${pkgname[0]}} for pkg in ${pkgname[@]}; do if [ "$(type -t package_${pkg})" != "function" ]; then echo -e "%INVALID%\n$pkgbuild\n" return 1 else backup_package_variables pkgname=$pkg while IFS= read -r line; do var=${line%%=*} var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters for realvar in ${variables[@]}; do if [ "$var" == "$realvar" ]; then eval $line break fi done done < <(type package_${pkg}) print_info restore_package_variables fi done else echo print_info fi return 0 } find_pkgbuilds() { #Skip over some dirs local d="${1##*/}" if [ "$d" = "CVS" -o "$d" = ".svn" ]; then return fi if [ -f $1/PKGBUILD ]; then source_pkgbuild $1 return fi empty=1 for dir in $1/*; do if [ -d $dir ]; then find_pkgbuilds $dir unset empty fi done if [ -n "$empty" ]; then echo -e "%MISSING%\n$1\n" fi } if [ -z "$1" -o -z "$2" ]; then exit 1 fi CARCH=$1 shift for dir in "$@"; do find_pkgbuilds $dir done exit 0