# 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 . use dir feed_add_package() { local chan="${1}" local dist="${2}" local plat="${3}" local arch="${4}" local sect="${5}" local pkg="${6}" local size="${7}" local file="${8}" local pkg_hash= local feed_hash_idx= local old_dir= pkg_hash="$(hash_name "${pkg}")" # Add package metadata to feed hash index. feed_hash_idx="${opt_base_dir}/feeds/${chan}/${dist}/${plat}/${arch}" feed_hash_idx="${feed_hash_idx}/${sect}/.db/${pkg_hash}" mkdir -p "${feed_hash_idx}" tar -xzOf "${opt_base_dir}/${file}" 'control.tar.gz' | \ tar -xzO './control' >"${feed_hash_idx}/info/${pkg}.control" printf 'Filename: %s\nSize: %s\nMD5sum: %s\n\n' \ "../../../../../../${file}" "${size}" \ "$(md5sum "${opt_base_dir}/${file}" | sed 's/ .*$//')" \ >>"${feed_hash_idx}/info/${pkg}.control" # Mark feed index fragment as outdated. old_dir="${opt_base_dir}/feeds/.db/${chan}_${dist}/${plat}_${arch}" 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 plat="${3}" local arch="${4}" local sect="${5}" local pkg="${6}" local pkg_hash= local feed_hash_idx= local old_dir= pkg_hash="$(hash_name "${pkg}")" # Remove package metadata from feed hash index. feed_hash_idx="${opt_base_dir}/feeds/${chan}/${dist}/${plat}/${arch}" 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="${opt_base_dir}/feeds/.db/${chan}_${dist}/${plat}_${arch}" old_dir="${old_dir}/${sect}" mkdir -p "${old_dir}" >"${old_dir}/${pkg_hash}" return 0 } update_feeds() { local script= local suite_dirent= local archplat_dirent= local sect_dirent= local feed= local hash_dirent= local idx= script='s|^.*//*\(..*\)_\(..*\)//*\(..*\)_\(..*\)//*\(..*\)/$' script="${script}|${opt_base_dir}/feeds/"'\1/\2/\3/\4/\5|' # For each suite: for suite_dirent in "${opt_base_dir}/feeds/.db/"*_*/; do if [ ! -d "${suite_dirent}" ]; then continue fi # For each archplat: for archplat_dirent in "${suite_dirent}/"*_*/; do if [ ! -d "${archplat_dirent}" ]; then continue fi # For each section: for sect_direct in "${archplat_dirent}/"*/; do if [ ! -d "${sect_dirent}" ]; then continue fi # Get the feed path from the index path. feed="$(printf '%s\n' "${sect_dirent}" | \ sed "${script}")" # For each package name hash: for hash_dirent in "${sect_dirent}/"*; do if [ ! -d "${hash_dirent}" ]; then continue fi idx="${feed}/.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" fi rm -f "${hash_dirent}" done # Ensure there are still packages here. if ! try_rmdir "${feed}/.db"; then cat "${feed}/.db/"*/Packages \ >"${feed}/Packages~" mv "${feed}/Packages~" \ "${feed}/Packages" else >"${feed}/Packages" fi rmdir "${sect_dirent}" done rmdir "${archplat_dirent}" done rmdir "${suite_dirent}" done return 0 }