# 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()
{
_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}"
;;
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}"
;;
?)
_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="$(IFS=' ' echo ${_obpd_dep})"
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}"; 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
if ! ${_obrd_union}; then
IFS='| '
_obrd_dep_or_list=
for _obrd_dep_or in ${_obrd_dep_and}; do
_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
:
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
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 ${?}
}