# 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 ${?}
}