diff options
Diffstat (limited to 'src/index.sh')
-rw-r--r-- | src/index.sh | 200 |
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 +} |