summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/index.sh136
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
+}