summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorP. J. McDermott <pjm@nac.net>2012-09-07 09:33:31 (EDT)
committer P. J. McDermott <pjm@nac.net>2012-09-07 09:33:31 (EDT)
commit273cc06b73b8157d749adc23af3a3697cfdcfddb (patch)
tree0b5bbdf3224f31cf3695d094c90bb9f9e9bc03e3 /lib
parent8afd699da61bf46fc74d3a8c63345526fc02dec8 (diff)
Implement ob_parse_dep, _ob_dep_arch_is_concerned.
Also, begin ob_reduce_deps.
Diffstat (limited to 'lib')
-rw-r--r--lib/deps.sh185
1 files changed, 185 insertions, 0 deletions
diff --git a/lib/deps.sh b/lib/deps.sh
new file mode 100644
index 0000000..49d3cb2
--- /dev/null
+++ b/lib/deps.sh
@@ -0,0 +1,185 @@
+# 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 <http://www.gnu.org/licenses/>.
+
+[ -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
+
+ # <pkg>[:<archqual>] [(<rel> <ver>)] [\[<arches>\]]
+
+ _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}
+}