# pro-archman # src/index.sh # Functions for working with package feed indices # # Copyright (C) 2013, 2015, 2019 Patrick McDermott # # This file is part of the ProteanOS Archive Manager. # # The ProteanOS Archive Manager 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. # # The ProteanOS Archive Manager 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 the ProteanOS Archive Manager. If not, see # . feed_sign() { local feed_idx="${1}" shift 1 local usign= if [ x"${conf_key}" = x'' ]; then return fi if ${in_place} && ${USIGN_EMBEDDED}; then usign="${builddir}/3rdparty/usign/usign" else usign="${USIGN}" fi "${usign}" -S -m "${feed_idx}" -s "${base_dir}/${conf_key}" } 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}" shift 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' \ 1>"${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/ .*$//')" \ 1>>"${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}" 1>"${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}" shift 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}" 1>"${old_dir}/${pkg_hash}" return 0 } feed_create() { local chan="${1}" local dist="${2}" local arch="${3}" local plat="${4}" local sect="${5}" shift 5 mkdir -p -- \ "${base_dir}/feeds/.db/${chan}_${dist}/${arch}_${plat}/${sect}"\ "${base_dir}/feeds/${chan}/${dist}/${arch}/${plat}/${sect}/.db" 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 \ 1>"${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 \ 1>"${sect}/Packages~" mv -- "${sect}/Packages~" \ "${sect}/Packages" else # Must be non-empty for usign to work. printf '\n' 1>"${sect}/Packages" fi if ${conf_gzip}; then "${GZIP}" -9c -- "${sect}/Packages" \ 1>"${sect}/Packages.gz" fi feed_sign "${sect}/Packages" rmdir -- "${sect_dirent}" done rmdir -- "${archplat_dirent}" done rmdir -- "${suite_dirent}" done # Generate all suites' arch/plat/sect manifests. for suite_dirent in "${base_dir}/feeds/"*/*/; do ( cd "${suite_dirent}" printf '%s\n' */*/* >'Manifest~' mv 'Manifest~' 'Manifest' ) done return 0 }