# 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_host_arch _obpd_dep \ _obpd_pkgarchqual _obpd_pkg _obpd_archqual \ _obpd_relver _obpd_rel _obpd_ver _obpd_arches \ _obpd_comp _obpd_comp_var while getopts 'p:q:r:v:A:a:' _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 ;; a) _obpd_host_arch="${OPTARG}" ;; ?) _ob_return 125 return ${?} ;; 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="$(echo "${_obpd_dep}" | \ sed 's/\t/ /g;s/^ *//;s/ *$//;s/ */ /g') " else _ob_return 125 return ${?} fi # [:] [( )] [\[\]] _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%%\]*}" fi # Set the specified variables. for _obpd_comp in pkg archqual rel ver arches; do _obpd_comp_var="$(eval echo \"\$\{_obpd_${_obpd_comp}_var\}\")" [ -z "${_obpd_comp_var}" ] && continue eval ${_obpd_comp_var}=\"\$\{_obpd_${_obpd_comp}\}\" done if [ -z "${_obpd_host_arch}" ]; then printf '%s' "${_obpd_pkg}" [ -n "${_obpd_archqual}" ] && printf ':%s' "${_obpd_archqual}" [ -n "${_obpd_ver}" ] && printf ' (%s %s)' "${_obpd_rel}" "${_obpd_ver}" [ -n "${_obpd_arches}" ] && printf ' [%s]' "${_obpd_arches}" printf '\n' elif _ob_dep_arch_is_concerned "${_obpd_host_arch}" "${_obpd_arches}"; then printf '%s' "${_obpd_pkg}" [ -n "${_obpd_archqual}" ] && printf ':%s' "${_obpd_archqual}" [ -n "${_obpd_ver}" ] && printf ' (%s %s)' "${_obpd_rel}" "${_obpd_ver}" printf '\n' fi _ob_return 0 return ${?} } ob_reduce_deps() { _ob_local _obrd_opt _obrd_host_arch _obrd_deps \ _obrd_orig_ifs _obrd_dep_and _obrd_dep_or \ _obrd_dep_list _obrd_dep_or_list _obrd_dep _obrd_union='false' while getopts 'a:u' _obrd_opt; do case "${_obrd_opt}" in a) _obrd_host_arch="${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 _obrd_orig_ifs="${IFS}" IFS=',' for _obrd_dep_and in ${_obrd_deps}; do IFS="${_obrd_orig_ifs}" if ! ${_obrd_union}; then IFS='|' _obrd_dep_or_list= for _obrd_dep_or in ${_obrd_dep_and}; do IFS="${_obrd_orig_ifs}" _obrd_dep="$(ob_parse_dep -a "${_obrd_host_arch}" \ "${_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}" \ "${_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 echo "${_obrd_dep_list}" _ob_return 0 return ${?} } _ob_dep_arch_is_concerned() { _ob_local _obdaic_host_arch _obdaic_arches \ _obdaic_arch _obdaic_not_arch _obdaic_seen_arch _obdaic_host_arch="${1}" _obdaic_arches="${2}" _obdaic_seen_arch=1 if [ -z "${_obdaic_arches}" ]; then _obdaic_seen_arch=0 fi 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 _ob_return ${_obdaic_seen_arch} return ${?} }