# opkbuild # lib/deps # Functions for parsing dependency field values. # # Copyright (C) 2012 Patrick "P. J." McDermott # # 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 . [ -n "${_OB_DEPS_SM}" ] && return 0 _OB_DEPS_SM='true' ob_use metadata ob_parse_dep() { _ob_local _obpd_opt _obpd_pkg_var _obpd_archqual_var _obpd_rel_var \ _obpd_ver_var _obpd_arches_var _obpd_plats_var \ _obpd_host_arch _obpd_host_plat _obpd_dep \ _obpd_pkgarchqual _obpd_pkg _obpd_archqual \ _obpd_relver _obpd_rel _obpd_ver _obpd_arches _obpd_plats \ _obpd_comp _obpd_comp_var while getopts 'p:q:r:v:A:l:a:P:' _obpd_opt; do case "${_obpd_opt}" in p) _obpd_pkg_var="${OPTARG}" if ! _ob_validate_var_name "${_obpd_pkg_var}"; then _ob_return 125 return ${?} fi ;; q) _obpd_archqual_var="${OPTARG}" if ! _ob_validate_var_name "${_obpd_archqual_var}"; then _ob_return 125 return ${?} fi ;; r) _obpd_rel_var="${OPTARG}" if ! _ob_validate_var_name "${_obpd_rel_var}"; then _ob_return 125 return ${?} fi ;; v) _obpd_ver_var="${OPTARG}" if ! _ob_validate_var_name "${_obpd_ver_var}"; then _ob_return 125 return ${?} fi ;; A) _obpd_arches_var="${OPTARG}" if ! _ob_validate_var_name "${_obpd_arches_var}"; then _ob_return 125 return ${?} fi ;; l) _obpd_plats_var="${OPTARG}" if ! _ob_validate_var_name "${_obpd_plats_var}"; then _ob_return 125 return ${?} fi ;; a) _obpd_host_arch="${OPTARG}" ;; P) _obpd_host_plat="${OPTARG}" ;; ?) _ob_return 125 return ${?} ;; esac done shift $(($OPTIND - 1)) if [ ${#} -eq 1 ]; then _obpd_dep="$(printf '%s\n' "${1}" | sed -n ' H; # Store each input line in the hold space. ${ g; # Restore everything to the pattern space. s/[\t\n]/ /g; # Replace tabs and newlines with spaces. s/ *\([(\[<]\) */ \1/g; # One space before "(", "[", and "<". s/ *\([)\]>]\) */\1 /g; # One space after "(", "[", and "<". s/ *\(<[<=]\) */\1 /g; # One space after "<<" and "<=". s/ *\(>[>=]\) */\1 /g; # One space after ">>" and ">=". s/ *\(=\) */\1 /g; # One space after "=". s/^ *//; # Remove leading spaces. s/ *$//; # Remove trailing spaces. s/ */ /g; # Remove duplicate spaces. p; # Print the pattern space. }; ')" else _ob_return 125 return ${?} fi # pkg[:archqual] [(rel ver)] [\[arches\]] [] _obpd_pkgarchqual="${_obpd_dep%% *}" _obpd_dep=" ${_obpd_dep#* }" _obpd_pkg="${_obpd_pkgarchqual%:*}" if [ "${_obpd_pkg}" != "${_obpd_pkgarchqual}" ]; then _obpd_archqual="${_obpd_pkgarchqual##*:}" fi if [ "${_obpd_dep# (*)}" != "${_obpd_dep}" ]; then _obpd_relver="${_obpd_dep# (}" _obpd_relver="${_obpd_relver%%)*}" _obpd_dep="${_obpd_dep# (*)}" _obpd_rel="${_obpd_relver% *}" _obpd_ver="${_obpd_relver##* }" fi if [ "${_obpd_dep# \[*\]}" != "${_obpd_dep}" ]; then _obpd_arches="${_obpd_dep# \[}" _obpd_arches="${_obpd_arches%%\]*}" _obpd_dep="${_obpd_dep# \[*\]}" fi if [ "${_obpd_dep# <*>}" != "${_obpd_dep}" ]; then _obpd_plats="${_obpd_dep# <}" _obpd_plats="${_obpd_plats%%>*}" _obpd_dep="${_obpd_dep# <*>}" fi # Set the specified variables. for _obpd_comp in pkg archqual rel ver arches plats; do _obpd_comp_var="$(eval echo \"\$\{_obpd_${_obpd_comp}_var\}\")" [ -z "${_obpd_comp_var}" ] && continue eval ${_obpd_comp_var}=\"\$\{_obpd_${_obpd_comp}\}\" done if [ -n "${_obpd_host_arch}" ] && ! ob_arch_is_concerned \ "${_obpd_host_arch}" "${_obpd_arches}"; then _ob_return 0 return ${?} fi if [ -n "${_obpd_host_plat}" ] && ! ob_plat_is_concerned \ "${_obpd_host_plat}" "${_obpd_plats}"; then _ob_return 0 return ${?} fi printf '%s' "${_obpd_pkg}" [ -n "${_obpd_archqual}" ] && printf ':%s' "${_obpd_archqual}" [ -n "${_obpd_ver}" ] && printf ' (%s %s)' "${_obpd_rel}" "${_obpd_ver}" [ -z "${_obpd_host_arch}" -a -n "${_obpd_arches}" ] && \ printf ' [%s]' "${_obpd_arches}" [ -z "${_obpd_host_plat}" -a -n "${_obpd_plats}" ] && \ printf ' [%s]' "${_obpd_plats}" printf '\n' _ob_return 0 return ${?} } ob_reduce_deps() { _ob_local _obrd_opt _obrd_host_arch _obrd_host_plat _obrd_deps \ _obrd_dep_and _obrd_dep_or _obrd_dep_list _obrd_dep_or_list _obrd_dep _obrd_union='false' while getopts 'a:P:u' _obrd_opt; do case "${_obrd_opt}" in a) _obrd_host_arch="${OPTARG}" ;; P) _obrd_host_plat="${OPTARG}" ;; u) _obrd_union='true' ;; ?) _ob_return 125 return ${?} ;; esac done shift $(($OPTIND - 1)) if [ ${#} -eq 1 ]; then _obrd_deps="${1}" else _ob_return 125 return ${?} fi IFS=',' for _obrd_dep_and in ${_obrd_deps}; do unset IFS if ! ${_obrd_union}; then IFS='|' _obrd_dep_or_list= for _obrd_dep_or in ${_obrd_dep_and}; do unset IFS _obrd_dep="$(ob_parse_dep -a "${_obrd_host_arch}" \ -P "${_obrd_host_plat}" "${_obrd_dep_or}")" if [ -n "${_obrd_dep}" ]; then if [ -n "${_obrd_dep_or_list}" ]; then _obrd_dep_or_list="${_obrd_dep_or_list} | " fi _obrd_dep_or_list="${_obrd_dep_or_list}${_obrd_dep}" fi done if [ -n "${_obrd_dep_or_list}" ]; then if [ -n "${_obrd_dep_list}" ]; then _obrd_dep_list="${_obrd_dep_list}, " fi _obrd_dep_list="${_obrd_dep_list}${_obrd_dep_or_list}" fi else _obrd_dep="$(ob_parse_dep -a "${_obrd_host_arch}" \ -P "${_obrd_host_plat}" "${_obrd_dep_and}")" if [ -n "${_obrd_dep}" ]; then if [ -n "${_obrd_dep_list}" ]; then _obrd_dep_list="${_obrd_dep_list}, " fi _obrd_dep_list="${_obrd_dep_list}${_obrd_dep}" fi fi done unset IFS echo "${_obrd_dep_list}" _ob_return 0 return ${?} }