# opkbuild # lib/package # 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 . [ -n "${_OB_PACKAGE_SM}" ] && return 0 _OB_PACKAGE_SM='true' ob_use metadata _OB_PACKAGE_DIR= _OB_PACKAGE_FORMAT= _OB_BINARY_PACKAGES= _OB_SOURCE_PARAMETERS= _OB_BINARY_PARAMETERS= ob_init_package() { _ob_local _obip_dir _obip_orig_text_domain if [ ${#} -eq 1 ]; then _obip_dir="${1}" else _ob_return 125 return ${?} fi _OB_PACKAGE_DIR="$(cd "${_obip_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 _obip_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 "${_obip_orig_text_domain}" _ob_return 1 return ${?} fi ob_use "package/${_OB_PACKAGE_FORMAT}" _OB_BINARY_PACKAGES= _ob_return 0 return ${?} } ob_parse_package_metadata() { _ob_local _obppm_opt _obppm_cache_file _obppm_pkg _obppm_pkg_clean \ _obppm_param_name _obppm_param_value while getopts 'c:' _obppm_opt; do case "${_obppm_opt}" in c) _obppm_cache_file="${OPTARG}" ;; ?) _ob_return 125 return ${?} ;; esac done shift $(($OPTIND - 1)) if [ ${#} -gt 0 ]; then _ob_return 125 return ${?} fi # Load a previously saved cache file, if any. if [ -n "${_obppm_cache_file}" -a -r "${_obppm_cache_file}" ]; then if [ "${_obppm_cache_file#*/}" != "${_obppm_cache_file}" ]; then . "${_obppm_cache_file}" else . "./${_obppm_cache_file}" fi _ob_return 0 return ${?} fi _ob_package_do 'parse_package_metadata' if [ -n "${_obppm_cache_file}" ]; then >"${_obppm_cache_file}" for _obppm_param_name in ${_OB_SOURCE_PARAMETERS}; do _obppm_param_value="$(ob_get_source_parameter \ "${_obppm_param_name}" | sed "s/'/'\\\\''/g")" printf "%s='%s'\n" \ "_OB_SRCFIELD_${_obppm_param_name}" "${_obppm_param_value}" \ >>"${_obppm_cache_file}" done for _obppm_pkg in $(ob_get_binary_packages); do _obppm_pkg_clean="$(echo "${_obppm_pkg}" | tr 'a-z' 'A-Z' | \ tr -dC 'A-Z0-9')" for _obppm_param_name in ${_OB_BINARY_PARAMETERS}; do _obppm_param_value="$(ob_get_binary_parameter "${_obppm_pkg}" \ "${_obppm_param_name}" | sed "s/'/'\\\\''/g")" printf "%s='%s'\n" \ "_OB_BINFIELD_${_obppm_pkg_clean}_${_obppm_param_name}" \ "${_obppm_param_value}" \ >>"${_obppm_cache_file}" done done fi _ob_return 0 return ${?} } ob_get_binary_packages() { _ob_local _obgbpk_opt _obgbpk_host_arch _obgbpk_pkgs _obgbpk_pkg \ _obgbpk_pkgs_clean _obgbpk_pkg_clean _obgbpk_orig_text_domain while getopts 'a:' _obgbpk_opt; do case "${_obgbpk_opt}" in a) _obgbpk_host_arch="${OPTARG}" ;; ?) _ob_return 125 return ${?} ;; esac done shift $(($OPTIND - 1)) if [ ${#} -gt 0 ]; then _ob_return 125 return ${?} 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' _obgbpk_orig_text_domain="$(ob_get_text_domain)" ob_set_text_domain "${_OB_INTERNAL_TEXT_DOMAIN}" _obgbpk_pkgs_clean=' ' for _obgbpk_pkg in ${_OB_BINARY_PACKAGES}; do # Validate the name. if ! ob_validate_binary_name "${_obgbpk_pkg}"; then ob_warn "$(ob_get_msg 'bad_binary_name')" "${_obgbpk_pkg}" continue fi # Make sure the "clean" name is unique. _obgbpk_pkg_clean=" $(echo "${_obgbpk_pkg}" | tr 'a-z' 'A-Z' | \ tr -dC 'A-Z0-9') " if echo "${_obgbpk_pkgs_clean}" | grep "${_obgbpk_pkg_clean}" \ >/dev/null 2>&1; then ob_warn "$(ob_get_msg 'duplicate_clean_binary_name')" \ "${_obgbpk_pkg_clean}" continue else _obgbpk_pkgs_clean="${_obgbpk_pkgs_clean}${_obgbpk_pkg_clean} " fi _obgbpk_pkgs="${_obgbpk_pkgs} ${_obgbpk_pkg}" done _OB_BINARY_PACKAGES="$(IFS=' ' echo ${_obgbpk_pkgs})" ob_set_text_domain "${_obgbpk_orig_text_domain}" fi _obgbpk_pkgs='' if [ -n "${_obgbpk_host_arch}" ]; then for _obgbpk_pkg in ${_OB_BINARY_PACKAGES}; do if ob_match_arch "${_obgbpk_host_arch}" "$(ob_get_binary_parameter \ "${_obgbpk_pkg}" 'Architecture')"; then _obgbpk_pkgs="${_obgbpk_pkgs} ${_obgbpk_pkg}" fi done else _obgbpk_pkgs="${_OB_BINARY_PACKAGES}" fi IFS=' ' echo ${_obgbpk_pkgs} _ob_return 0 return ${?} } ob_get_source_parameter() { _ob_local _obgsp_name if [ ${#} -eq 1 ]; then _obgsp_name="${1}" else _ob_return 125 return ${?} fi # Convert field name to uppercase and validate. _obgsp_name="$(echo "${_obgsp_name}" | tr 'a-z-' 'A-Z_')" case "${_obgsp_name:- }" in *[!A-Z0-9_]*) _ob_return 125 return ${?} ;; esac eval echo \"\$\{"_OB_SRCFIELD_${_obgsp_name}"\}\" _ob_return 0 return ${?} } ob_get_binary_parameter() { _ob_local _obgbp_package _obgbp_name if [ ${#} -eq 2 ]; then _obgbp_package="${1}" _obgbp_name="${2}" else _ob_return 125 return ${?} fi if ! ob_validate_binary_name "${_obgbp_package}"; then _ob_return 125 return ${?} fi # Convert package name to its uppercase "clean" form. _obgbp_package="$(echo "${_obgbp_package}" | tr 'a-z' 'A-Z' | \ tr -dC 'A-Z0-9')" # Convert field name to uppercase and validate. _obgbp_name="$(echo "${_obgbp_name}" | tr 'a-z-' 'A-Z_')" case "${_obgbp_name:- }" in *[!A-Z0-9_]*) _ob_return 125 return ${?} ;; esac eval echo \"\$\{"_OB_BINFIELD_${_obgbp_package}_${_obgbp_name}"\}\" _ob_return 0 return ${?} } ob_get_doc_package() { _ob_local if [ ${#} -gt 0 ]; then _ob_return 125 return ${?} fi _ob_package_do 'get_doc_package' _ob_return ${?} return ${?} } ob_get_doc_files() { _ob_local if [ ${#} -gt 0 ]; then _ob_return 125 return ${?} fi _ob_package_do 'get_doc_files' _ob_return ${?} return ${?} } ob_summarize_package_arch() { _ob_local if [ ${#} -gt 0 ]; then _ob_return 125 return ${?} fi # XXX: Stub. _ob_return 0 return ${?} } ob_summarize_package_plat() { _ob_local if [ ${#} -gt 0 ]; then _ob_return 125 return ${?} fi # XXX: Stub. _ob_return 0 return ${?} } _ob_package_do() { _ob_local _obpd_func _obpd_func="${1}" shift 1 "_ob_${_obpd_func}_${_OB_PACKAGE_FORMAT}" "${@}" _ob_return ${?} return ${?} } _ob_set_binary_packages() { _ob_local _obsbpk_packages _obsbpk_packages="${1}" _OB_BINARY_PACKAGES="${_obsbpk_packages}" _ob_return 0 return ${?} } _ob_set_source_parameter() { _ob_local _obssp_name _obssp_value _obssp_name="${1}" _obssp_value="${2}" # Convert field name to uppercase and validate. _obssp_name="$(echo "${_obssp_name}" | tr 'a-z-' 'A-Z_')" case "${_obssp_name:- }" in *[!A-Z0-9_]*) _ob_return 125 return ${?} ;; esac _OB_SOURCE_PARAMETERS="${_OB_SOURCE_PARAMETERS} ${_obssp_name}" # Escape the value. _obssp_value="$(echo "${_obssp_value}" | sed "s/'/'\\\\''/g")" eval "_OB_SRCFIELD_${_obssp_name}='${_obssp_value}'" _ob_return 0 return ${?} } _ob_set_binary_parameter() { _ob_local _obsbp_package _obsbp_name _obsbp_value _obsbp_package="${1}" _obsbp_name="${2}" _obsbp_value="${3}" if ! ob_validate_binary_name "${_obsbp_package}"; then _ob_return 125 return ${?} fi # Convert package name to its uppercase "clean" form. _obsbp_package="$(echo "${_obsbp_package}" | tr 'a-z' 'A-Z' | \ tr -dC 'A-Z0-9')" # Convert field name to uppercase and validate. _obsbp_name="$(echo "${_obsbp_name}" | tr 'a-z-' 'A-Z_')" case "${_obsbp_name:- }" in *[!A-Z0-9_]*) _ob_return 125 return ${?} ;; esac if ! echo " ${_OB_BINARY_PARAMETERS} " | grep " ${_obsbp_name} " \ >/dev/null 2>&1; then _OB_BINARY_PARAMETERS="${_OB_BINARY_PARAMETERS} ${_obsbp_name}" fi # Escape the value. _obsbp_value="$(echo "${_obsbp_value}" | sed "s/'/'\\\\''/g")" eval "_OB_BINFIELD_${_obsbp_package}_${_obsbp_name}='${_obsbp_value}'" _ob_return 0 return ${?} }