# 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 . [ "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 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}" # 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}" 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" else rm -f "${sect}/Packages" fi rmdir "${sect_dirent}" try_rmdir "${sect}" done rmdir "${archplat_dirent}" try_rmdir "${archplat}" try_rmdir "${archplat%/*}" done rmdir "${suite_dirent}" try_rmdir "${suite}" try_rmdir "${suite%/*}" done return 0 }