# opkbuild # lib/package.sh # Interface for retrieving source and binary package metadata. # # 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 . [ x"${_OB_PACKAGE_SM+set}" = x'set' ] && return 0 _OB_PACKAGE_SM=1 ob_use metadata _OB_PACKAGE_DIR= _OB_PACKAGE_FORMAT= _OB_BINARY_PACKAGES= _OB_SOURCE_PARAMETERS= _OB_BINARY_PARAMETERS= ob_init_package() { local dir= local orig_text_domain= if [ ${#} -eq 1 ]; then dir="${1}" else return 125 fi _OB_PACKAGE_DIR="$(cd "${dir}" && pwd)" if [ -r "${_OB_PACKAGE_DIR}/format" ]; then case "$(cat "${_OB_PACKAGE_DIR}/format")" in 2.0) _OB_PACKAGE_FORMAT='2' ;; esac fi if [ -z "${_OB_PACKAGE_FORMAT}" ]; then orig_text_domain="$(ob_get_text_domain)" ob_set_text_domain "${_OB_INTERNAL_TEXT_DOMAIN}" ob_warn "$(ob_get_msg 'unable_to_detect_package_format')" ob_set_text_domain "${orig_text_domain}" return 1 fi ob_use "package/${_OB_PACKAGE_FORMAT}" _OB_BINARY_PACKAGES= return 0 } ob_parse_package_metadata() { local opt= local cache_file= local pkg= local pkg_clean= local param_name= local param_value= while getopts 'c:' opt; do case "${opt}" in c) cache_file="${OPTARG}" ;; ?) return 125 ;; esac done shift $(($OPTIND - 1)) if [ ${#} -gt 0 ]; then return 125 fi # Load a previously saved cache file, if any. if [ -n "${cache_file}" -a -r "${cache_file}" ]; then if [ "${cache_file#*/}" != "${cache_file}" ]; then . "${cache_file}" else . "./${cache_file}" fi return 0 fi _ob_package_do 'parse_package_metadata' if [ -n "${cache_file}" ]; then >"${cache_file}" for param_name in ${_OB_SOURCE_PARAMETERS}; do param_value="$(ob_get_source_parameter \ "${param_name}" | sed "s/'/'\\\\''/g")" printf "%s='%s'\n" \ "_OB_SRCFIELD_${param_name}" "${param_value}" \ >>"${cache_file}" done for pkg in $(ob_get_binary_packages); do pkg_clean="$(echo "${pkg}" | tr 'a-z' 'A-Z' | \ tr -dC 'A-Z0-9')" for param_name in ${_OB_BINARY_PARAMETERS}; do param_value="$(ob_get_binary_parameter "${pkg}" \ "${param_name}" | sed "s/'/'\\\\''/g")" printf "%s='%s'\n" \ "_OB_BINFIELD_${pkg_clean}_${param_name}" \ "${param_value}" \ >>"${cache_file}" done done fi return 0 } ob_get_binary_packages() { local opt= local host_arch= local host_plat= local pkgs= local pkg= local pkgs_clean= local pkg_clean= local orig_text_domain= while getopts 'a:P:' opt; do case "${opt}" in a) host_arch="${OPTARG}" ;; P) host_plat="${OPTARG}" ;; ?) return 125 ;; esac done shift $(($OPTIND - 1)) if [ ${#} -gt 0 ]; then return 125 fi # NB: If a source package lists no binary packages, this will be true each # call. if [ -z "${_OB_BINARY_PACKAGES}" ]; then _ob_package_do 'get_binary_packages' orig_text_domain="$(ob_get_text_domain)" ob_set_text_domain "${_OB_INTERNAL_TEXT_DOMAIN}" pkgs_clean=' ' for pkg in ${_OB_BINARY_PACKAGES}; do # Validate the name. if ! ob_validate_binary_name "${pkg}"; then ob_warn "$(ob_get_msg 'bad_binary_name')" "${pkg}" continue fi # Make sure the "clean" name is unique. pkg_clean=" $(echo "${pkg}" | tr 'a-z' 'A-Z' | \ tr -dC 'A-Z0-9') " if echo "${pkgs_clean}" | grep "${pkg_clean}" \ >/dev/null 2>&1; then ob_warn "$(ob_get_msg 'duplicate_clean_binary_name')" \ "${pkg_clean}" continue else pkgs_clean="${pkgs_clean}${pkg_clean} " fi pkgs="${pkgs} ${pkg}" done _OB_BINARY_PACKAGES="$(IFS=' ' echo ${pkgs})" ob_set_text_domain "${orig_text_domain}" fi pkgs='' for pkg in ${_OB_BINARY_PACKAGES}; do if [ -n "${host_arch}" ] && ! ob_arch_is_concerned \ "${host_arch}" "$(ob_get_binary_parameter \ "${pkg}" 'Architecture')"; then continue fi if [ -n "${host_plat}" ] && ! ob_plat_is_concerned \ "${host_plat}" "$(ob_get_binary_parameter \ "${pkg}" 'Platform')"; then continue fi pkgs="${pkgs} ${pkg}" done printf '%s ' ${pkgs} return 0 } ob_get_source_parameter() { local name= if [ ${#} -eq 1 ]; then name="${1}" else return 125 fi # Convert field name to uppercase and validate. name="$(echo "${name}" | tr 'a-z-' 'A-Z_')" case "${name:- }" in *[!A-Z0-9_]*) return 125 ;; esac eval echo \"\$\{"_OB_SRCFIELD_${name}"\}\" return 0 } ob_get_binary_parameter() { local package= local name= if [ ${#} -eq 2 ]; then package="${1}" name="${2}" else return 125 fi if ! ob_validate_binary_name "${package}"; then return 125 fi # Convert package name to its uppercase "clean" form. package="$(echo "${package}" | tr 'a-z' 'A-Z' | \ tr -dC 'A-Z0-9')" # Convert field name to uppercase and validate. name="$(echo "${name}" | tr 'a-z-' 'A-Z_')" case "${name:- }" in *[!A-Z0-9_]*) return 125 ;; esac eval echo \"\$\{"_OB_BINFIELD_${package}_${name}"\}\" return 0 } ob_get_doc_package() { if [ ${#} -gt 0 ]; then return 125 fi _ob_package_do 'get_doc_package' return ${?} } ob_get_doc_files() { local arch= local plat= if [ ${#} -eq 2 ]; then arch="${1}" plat="${2}" else return 125 fi _ob_package_do 'get_doc_files' "${arch}" "${plat}" return ${?} } ob_summarize_package_arch() { if [ ${#} -gt 0 ]; then return 125 fi # XXX: Stub. return 0 } ob_summarize_package_plat() { if [ ${#} -gt 0 ]; then return 125 fi # XXX: Stub. return 0 } ob_set_package_substvars() { local pkg= if [ ${#} -eq 1 ]; then pkg="${1}" else return 125 fi _ob_package_do 'set_package_substvars' "${pkg}" return ${?} } _ob_package_do() { local func= func="${1}" shift 1 "_ob_${func}_${_OB_PACKAGE_FORMAT}" "${@}" return ${?} } _ob_set_binary_packages() { local packages= packages="${1}" _OB_BINARY_PACKAGES="${packages}" return 0 } _ob_set_source_parameter() { local name= local value= name="${1}" value="${2}" # Convert field name to uppercase and validate. name="$(echo "${name}" | tr 'a-z-' 'A-Z_')" case "${name:- }" in *[!A-Z0-9_]*) return 125 ;; esac _OB_SOURCE_PARAMETERS="${_OB_SOURCE_PARAMETERS} ${name}" # Escape the value. value="$(echo "${value}" | sed "s/'/'\\\\''/g")" eval "_OB_SRCFIELD_${name}='${value}'" return 0 } _ob_set_binary_parameter() { local package= local name= local value= package="${1}" name="${2}" value="${3}" if ! ob_validate_binary_name "${package}"; then return 125 fi # Convert package name to its uppercase "clean" form. package="$(echo "${package}" | tr 'a-z' 'A-Z' | \ tr -dC 'A-Z0-9')" # Convert field name to uppercase and validate. name="$(echo "${name}" | tr 'a-z-' 'A-Z_')" case "${name:- }" in *[!A-Z0-9_]*) return 125 ;; esac if ! echo " ${_OB_BINARY_PARAMETERS} " | grep " ${name} " \ >/dev/null 2>&1; then _OB_BINARY_PARAMETERS="${_OB_BINARY_PARAMETERS} ${name}" fi # Escape the value. value="$(echo "${value}" | sed "s/'/'\\\\''/g")" eval "_OB_BINFIELD_${package}_${name}='${value}'" return 0 }