summaryrefslogtreecommitdiffstats
path: root/src/index.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/index.sh')
-rw-r--r--src/index.sh200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/index.sh b/src/index.sh
new file mode 100644
index 0000000..8749897
--- /dev/null
+++ b/src/index.sh
@@ -0,0 +1,200 @@
+# pro-archman
+# lib/index.sh
+# Functions for working with package feed indices
+#
+# Copyright (C) 2013 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${_INDEX_SM+set}" = 'xset' ] && return 0
+_INDEX_SM=1
+
+use locale
+use output
+use dir
+
+feed_add_package()
+{
+ local chan="${1}"
+ local dist="${2}"
+ local arch="${3}"
+ local plat="${4}"
+ local sect="${5}"
+ local pkg="${6}"
+ local size="${7}"
+ local file="${8}"
+ local pkg_hash=
+ local feed_hash_idx=
+ local old_dir=
+
+ info_v "$(get_msg 'feed_adding')" "${pkg}" \
+ "${chan}" "${dist}" "${arch}" "${plat}" "${sect}"
+
+ pkg_hash="$(hash_name "${pkg}")"
+
+ # Add package metadata to feed hash index.
+ feed_hash_idx="${base_dir}/feeds/${chan}/${dist}/${arch}/${plat}"
+ feed_hash_idx="${feed_hash_idx}/${sect}/.db/${pkg_hash}"
+ mkdir -p "${feed_hash_idx}/info"
+ tar -xzOf "${base_dir}/${file}" 'control.tar.gz' | \
+ tar -xzO './control' >"${feed_hash_idx}/info/${pkg}.control"
+ printf 'Filename: %s\nSize: %s\nMD5sum: %s\nSHA256sum: %s\n\n' \
+ "../../../../../../${file}" "${size}" \
+ "$(md5sum "${base_dir}/${file}" | sed 's/ .*$//')" \
+ "$(sha256sum "${base_dir}/${file}" | sed 's/ .*$//')" \
+ >>"${feed_hash_idx}/info/${pkg}.control"
+
+ # Mark feed index fragment as outdated.
+ old_dir="${base_dir}/feeds/.db/${chan}_${dist}/${arch}_${plat}"
+ old_dir="${old_dir}/${sect}"
+ mkdir -p "${old_dir}"
+ >"${old_dir}/${pkg_hash}"
+
+ return 0
+}
+
+feed_remove_package()
+{
+ local chan="${1}"
+ local dist="${2}"
+ local arch="${3}"
+ local plat="${4}"
+ local sect="${5}"
+ local pkg="${6}"
+ local pkg_hash=
+ local feed_hash_idx=
+ local old_dir=
+
+ info_v "$(get_msg 'feed_removing')" "${pkg}" \
+ "${chan}" "${dist}" "${arch}" "${plat}" "${sect}"
+
+ pkg_hash="$(hash_name "${pkg}")"
+
+ # Remove package metadata from feed hash index.
+ feed_hash_idx="${base_dir}/feeds/${chan}/${dist}/${arch}/${plat}"
+ feed_hash_idx="${feed_hash_idx}/${sect}/.db/${pkg_hash}"
+ rm -f "${feed_hash_idx}/info/${pkg}.control"
+ try_rmdir "${feed_hash_idx}/info"
+
+ # Mark feed index fragment as outdated.
+ old_dir="${base_dir}/feeds/.db/${chan}_${dist}/${arch}_${plat}"
+ old_dir="${old_dir}/${sect}"
+ mkdir -p "${old_dir}"
+ >"${old_dir}/${pkg_hash}"
+
+ return 0
+}
+
+update_feeds()
+{
+ local suite_dirent=
+ local chan=
+ local dist=
+ local suite=
+ local archplat_dirent=
+ local arch=
+ local plat=
+ local archplat=
+ local sect_dirent=
+ local sect=
+ local manifest_entry=
+ local hash_dirent=
+ local idx=
+
+ info_v "$(get_msg 'updating_feeds')"
+
+ # For each suite:
+ for suite_dirent in "${base_dir}/feeds/.db/"*_*/; do
+ if [ ! -d "${suite_dirent}" ]; then
+ continue
+ fi
+ chan="${suite_dirent%/}"
+ chan="${chan##*/}"
+ dist="${chan##*_}"
+ chan="${chan%_*}"
+ suite="${base_dir}/feeds/${chan}/${dist}"
+ exec 3>"${suite}/Manifest~"
+ # For each archplat:
+ for archplat_dirent in "${suite_dirent}/"*_*/; do
+ if [ ! -d "${archplat_dirent}" ]; then
+ continue
+ fi
+ arch="${archplat_dirent%/}"
+ arch="${arch##*/}"
+ plat="${arch##*_}"
+ arch="${arch%_*}"
+ archplat="${suite}/${arch}/${plat}"
+ # For each section:
+ for sect_dirent in "${archplat_dirent}/"*/; do
+ if [ ! -d "${sect_dirent}" ]; then
+ continue
+ fi
+ sect="${sect_dirent%/}"
+ sect="${sect##*/}"
+ info_v "$(get_msg 'updating_feed')" \
+ "${chan}" "${dist}" \
+ "${arch}" "${plat}" "${sect}"
+ manifest_entry="${arch}/${plat}/${sect}"
+ sect="${archplat}/${sect}"
+ # For each package name hash:
+ for hash_dirent in "${sect_dirent}/"*; do
+ if [ ! -f "${hash_dirent}" ]; then
+ continue
+ fi
+ idx="${sect}/.db/${hash_dirent##*/}"
+ # Ensure there are still packages here.
+ if [ -d "${idx}/info" ]; then
+ cat "${idx}/info/"*.control \
+ >"${idx}/Packages"
+ else
+ rm -f "${idx}/Packages"
+ rmdir "${idx}"
+ fi
+ rm -f "${hash_dirent}"
+ done
+ # Ensure there are still packages here.
+ if ! try_rmdir "${sect}/.db"; then
+ cat "${sect}/.db/"*/Packages \
+ >"${sect}/Packages~"
+ mv "${sect}/Packages~" \
+ "${sect}/Packages"
+ if ${conf_gzip}; then
+ gzip -9c "${sect}/Packages" \
+ >"${sect}/Packages.gz"
+ fi
+ printf '%s\n' "${manifest_entry}" >&3
+ else
+ rm -f "${sect}/Packages" \
+ "${sect}/Packages.gz"
+ fi
+ rmdir "${sect_dirent}"
+ try_rmdir "${sect}"
+ done
+ rmdir "${archplat_dirent}"
+ try_rmdir "${archplat}"
+ try_rmdir "${archplat%/*}"
+ done
+ rmdir "${suite_dirent}"
+ exec 3>&-
+ if [ -s "${suite}/Manifest~" ]; then
+ mv "${suite}/Manifest~" "${suite}/Manifest"
+ else
+ rm -f "${suite}/Manifest~" "${suite}/Manifest"
+ rmdir "${suite}"
+ rmdir "${suite%/*}"
+ fi
+ done
+
+ return 0
+}