# 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 3 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_parse_dep() { _obpd_opt= _obpd_pkg_var= _obpd_archqual_var= _obpd_rel_var= _obpd_ver_var= _obpd_arches_var= _obpd_host_arch= _obpd_dep= _obpd_pkgarchqual= _obpd_relver= _obpd_arches= while getopts 'p:q:r:v:A:a:' _obpd_opt; do case "${_obpd_opt}" in p) _obpd_pkg_var="${OPTARG}" ;; q) _obpd_archqual_var="${OPTARG}" ;; r) _obpd_rel_var="${OPTARG}" ;; v) _obpd_ver_var="${OPTARG}" ;; A) _obpd_arches_var="${OPTARG}" ;; a) _obpd_host_arch="${OPTARG}" ;; ?) #unset return 125 ;; esac done shift $(($OPTIND - 1)) if [ "${#}" -eq 1 ]; then # Separate components with spaces. _obpd_dep="$(echo "${1}" | \ sed 's/\([(\[]\)/ \1/g;s/\([<>=][<>=]*\)/\1 /g')" # Remove leading, trailing, and duplicate spaces. _obpd_dep="$(IFS=' ' echo ${_obpd_dep})" else #unset return 125 fi # [:] [( )] [\[\]] _obpd_pkgarchqual="${_obpd_dep%% *}" _obpd_dep=" ${_obpd_dep#* }" if [ -n "${_obpd_pkg_var}" ]; then eval "${_obpd_pkg_var}=${_obpd_pkgarchqual%:*}" fi if [ -n "${_obpd_archqual_var}" ]; then eval "${_obpd_archqual_var}=${_obpd_pkgarchqual##*:}" fi if [ "${_obpd_dep# (*)}" != "${_obpd_dep}" ]; then _obpd_relver="${_obpd_dep# (}" _obpd_relver="${_obpd_relver%%)*}" _obpd_dep="${_obpd_dep#(*)}" if [ -n "${_obpd_rel_var}" ]; then eval "${_obpd_rel_var}=${_obpd_relver% *}" fi if [ -n "${_obpd_ver_var}" ]; then eval "${_obpd_ver_var}=${_obpd_relver##* }" fi fi if [ "${_obpd_dep# \[*\]}" != "${_obpd_dep}" ]; then _obpd_arches="${_obpd_dep# \[}" _obpd_arches="${_obpd_arches%%\]*}" # TODO: Reduce arch is host arch is given. if [ -n "${_obpd_arches_var}" ]; then eval "${_obpd_arches_var}=${_obpd_arches}" fi fi return 0 } ob_reduce_deps() { _obrd_opt= _obrd_host_arch= _obrd_union=false _obrd_deps= _obrd_orig_ifs= _obrd_dep_and= _obrd_dep_or= while getopts 'a:u' _obrd_opt; do case "${_obrd_opt}" in a) _obrd_host_arch="${OPTARG}" ;; u) _obrd_union=true ;; ?) #unset return 125 ;; esac done shift $(($OPTIND - 1)) if [ "${#}" -eq 1 ]; then _obrd_deps="${1}" else #unset return 125 fi _obrd_orig_ifs="${IFS}" IFS=', ' for _obrd_dep_and in ${_obrd_deps}; do if ! ${_obrd_union}; then IFS='| ' for _obrd_dep_or in ${_obrd_deps}; do : done else : fi done return 0 } _ob_dep_arch_is_concerned() { _obdaic_host_arch="${1}" _obdaic_arches="${2}" _obdaic_arch= _obdaic_not_arch= _obdaic_seen_arch=1 for _obdaic_arch in ${_obdaic_arches}; do _obdaic_not_arch="${_obdaic_arch#!}" if [ "${_obdaic_not_arch}" != "${_obdaic_arch}" ]; then if ob_match_arch "${_obdaic_host_arch}" "${_obdaic_not_arch}"; then _obdaic_seen_arch=1 break else _obdaic_seen_arch=0 fi elif ob_match_arch "${_obdaic_host_arch}" "${_obdaic_arch}"; then _obdaic_seen_arch=0 break fi done unset _obdaic_host_arch _obdaic_arches _obdaic_arch _obdaic_not_arch return ${_obdaic_seen_arch} }