diff options
-rw-r--r-- | lib/index.sh | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/lib/index.sh b/lib/index.sh new file mode 100644 index 0000000..0320f75 --- /dev/null +++ b/lib/index.sh @@ -0,0 +1,136 @@ +# 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/>. + +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="${archive}/feeds/${chan}/${dist}/${plat}/${arch}/${sect}" + feed_hash_idx="${feed_hash_idx}/.db/${pkg_hash}" + mkdir -p "${feed_hash_idx}" + tar -xzOf "${archive}/${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 "${archive}/${file}" | sed 's/ .*$//')" \ + >>"${feed_hash_idx}/info/${pkg}.control" + + # Mark feed index fragment as outdated. + old_dir="${archive}/feeds/.db/${chan}_${dist}/${plat}_${arch}/${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="${archive}/feeds/${chan}/${dist}/${plat}/${arch}/${sect}" + feed_hash_idx="${feed_hash_idx}/.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="${archive}/feeds/.db/${chan}_${dist}/${plat}_${arch}/${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}|${archive}/feeds/"'\1/\2/\3/\4/\5|' + + # For each suite: + for suite_dirent in "${archive}/feeds/.db/"*_*/; do + # For each archplat: + for archplat_dirent in "${suite_dirent}/"*_*/; do + # For each section: + for sect_direct in "${archplat_dirent}/"*/; do + # 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 + 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 +} |