diff options
Diffstat (limited to 'src/include.sh')
-rw-r--r-- | src/include.sh | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/include.sh b/src/include.sh new file mode 100644 index 0000000..42ccf24 --- /dev/null +++ b/src/include.sh @@ -0,0 +1,181 @@ +# pro-archman +# lib/include.sh +# Functions for including changes +# +# Copyright (C) 2013, 2014 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/>. + +[ "x${_INCLUDE_SM+set}" = 'xset' ] && return 0 +_INCLUDE_SM=1 + +use control +use db +use locale +use output + +_INCLUDE_CHANGES_FIELDS='Format Source Binary Version Architecture Platform +Distribution Maintainer Changed-By Date Description Changes Files' + +_include_format= +_include_source= +_include_version= +_include_distribution= +_include_files= + +include_changes() +{ + local changes="${1}" + local chan= + local dist= + local source= + local srcver= + local script= + local bvaps= + local binver= + local arch= + local plat= + local old_ver= + local files= + local size= + local sect= + local file= + local pkg= + local pool_file= + + parse_control "${changes}" _include_changes_field \ + "${_INCLUDE_CHANGES_FIELDS}" '' + if [ "x${_include_format}" != 'x1.0' ]; then + error 2 "$(get_msg 'include_unknown_changes_format')" \ + "${changes}" "${_include_format}" + fi + chan="${conf_incoming_channel}" + dist="${_include_distribution}" + source="${_include_source}" + srcver="${_include_version}" + + info "$(get_msg 'include_including')" "${source}" "${srcver}" \ + "${chan}" "${dist}" + + if [ "x${_include_files}" = 'x' ]; then + warn "$(get_msg 'include_no_files')" + return 0 + fi + + # List of (binver, arch, plat) tuples to be checked later. + script='s/[0-9][0-9]* [^ ][^ ]* [^_]*_\([^_]*\)' + script="${script}"'_\([^_]*\)_\([^_]*\)\.opk/\1 \2 \3/p' + bvaps="$(printf '%s\n' "${_include_files}" | \ + sed -n "${script}" | LC_COLLATE='C' sort | uniq)" + + # Pre-inclusion database sanity checks and updates: check for an + # existing version of the package in the suite. + old_ver="$(db_get_srcver "${chan}" "${dist}" "${source}")" + if [ "x${old_ver}" = 'x' ]; then + # New package. + db_set_srcver "${chan}" "${dist}" "${source}" "${srcver}" + elif [ "x${old_ver}" != "x${_include_version}" ]; then + # New source version. Remove the old source package from the + # suite. + remove_source_from_suite "${chan}" "${dist}" "${source}" + db_set_srcver "${chan}" "${dist}" "${source}" "${srcver}" + else + # Same source version. Hopefully different binary version, + # architecture, and/or platform. Make sure such "bvap" tuples + # are new. + while read -r binver arch plat; do + old_ver="$(db_get_binver "${chan}" "${dist}" \ + "${arch}" "${plat}" "${source}")" + if [ "x${old_ver}" = "x${binver}" ]; then + error 2 "$(get_msg 'include_bvap_exists')" \ + "${binver}" "${arch}" "${plat}" + fi + done <<-EOF + ${bvaps} + EOF + fi + + # For each (binver, arch, plat) tuple in the package changes: + # * Remove old binary packages of the same arch and plat from the + # suite. + # * Set the new binary version of packages of the arch and plat in the + # suite. + # * Set the reference count for the tuple to 1. + # This is done separately from the next loop because it must be done + # exactly once for each bvap tuple. The next loop can hit any given + # bvap tuple multiple times. + while read -r binver arch plat; do + old_ver="$(db_get_binver "${chan}" "${dist}" \ + "${arch}" "${plat}" "${source}")" + if [ "x${old_ver}" != 'x' ]; then + remove_packages_from_suite_archplat "${chan}" \ + "${dist}" "${arch}" "${plat}" "${source}" + fi + db_set_binver "${chan}" "${dist}" "${arch}" "${plat}" \ + "${source}" "${binver}" + db_inc_references "${arch}" "${plat}" "${source}" "${binver}" \ + >/dev/null + done <<-EOF + ${bvaps} + EOF + + # Include each binary package. + files='' + while read -r size sect file; do + if [ "x${file##[ ]}" = 'x' ]; then + continue + fi + IFS='_' read -r pkg binver arch plat <<-EOF + ${file%.opk} + EOF + db_add_package "${arch}" "${plat}" "${source}" "${binver}" \ + "${size}" "${sect}" "${pkg}" + pool_file="pool/$(hash_name "${source}")/${source}" + pool_file="${pool_file}/${pkg}_${binver}_${arch}_${plat}.opk" + file="$(dirname "${changes}")/${file}" + files="${files} ${file}" + cp -p "${file}" "${base_dir}/${pool_file}" + feed_add_package "${chan}" "${dist}" "${arch}" "${plat}" \ + "${sect}" "${pkg}" "${size}" "${pool_file}" + done <<-EOF + ${_include_files} + EOF + + printf '%s\n' ${files} + return 0 +} + +_include_changes_field() +{ + local name="${1}" + local value="${2}" + + case "${name}" in + 'Format') + _include_format="${value}" + ;; + 'Source') + _include_source="${value}" + ;; + 'Version') + _include_version="${value}" + ;; + 'Distribution') + _include_distribution="${value}" + ;; + 'Files') + _include_files="${value}" + ;; + esac +} |