# 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
# 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%%\]*}"
_obpd_dep="${_obpd_dep# \[*\]}"
fi
if [ "${_obpd_dep# <*>}" != "${_obpd_dep}" ]; then
_obpd_plats="${_obpd_dep# <}"
_obpd_plats="${_obpd_arches%%>*}"
_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_dep_arch_is_concerned \
"${_obpd_host_arch}" "${_obpd_arches}"; then
_ob_return 0
return ${?}
fi
if [ -n "${_obpd_host_plat}" ] && ! _ob_dep_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_orig_ifs _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
_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}" \
-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
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 ${?}
}
_ob_dep_plat_is_concerned()
{
_ob_local _obdpic_host_plat _obdpic_plats \
_obdpic_plat _obdpic_not_plat _obdpic_seen_plat
_obdpic_host_plat="${1}"
_obdpic_plats="${2}"
_obdpic_seen_plat=1
if [ -z "${_obdpic_plats}" ]; then
_obdpic_seen_plat=0
fi
for _obdpic_plat in ${_obdpic_plats}; do
_obdpic_not_plat="${_obdpic_plat#!}"
if [ "${_obdpic_not_plat}" != "${_obdpic_plat}" ]; then
if ob_match_plat "${_obdpic_host_plat}" "${_obdpic_not_plat}"; then
_obdpic_seen_plat=1
break
else
_obdpic_seen_plat=0
fi
elif ob_match_plat "${_obdpic_host_plat}" "${_obdpic_plat}"; then
_obdpic_seen_plat=0
break
fi
done
_ob_return ${_obdpic_seen_plat}
return ${?}
}