summaryrefslogtreecommitdiffstats
path: root/src/include.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/include.sh')
-rw-r--r--src/include.sh181
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
+}