diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-06-17 18:26:02 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-06-17 18:29:39 +0800 |
commit | c080ad1bddbd32382e13e5d0b0540281d3b9b86f (patch) | |
tree | a2829113de000327bdc89cb3bbd638c8c829cc0d | |
parent | 9f8b695866c239e271c26a9ce808f03386c287e9 (diff) | |
download | wspkg-c080ad1bddbd32382e13e5d0b0540281d3b9b86f.tar wspkg-c080ad1bddbd32382e13e5d0b0540281d3b9b86f.tar.gz wspkg-c080ad1bddbd32382e13e5d0b0540281d3b9b86f.tar.bz2 wspkg-c080ad1bddbd32382e13e5d0b0540281d3b9b86f.tar.lz wspkg-c080ad1bddbd32382e13e5d0b0540281d3b9b86f.tar.xz wspkg-c080ad1bddbd32382e13e5d0b0540281d3b9b86f.tar.zst wspkg-c080ad1bddbd32382e13e5d0b0540281d3b9b86f.zip |
arch: Support package groups
-rwxr-xr-x | arch/arch.deps.sh | 106 |
1 files changed, 100 insertions, 6 deletions
diff --git a/arch/arch.deps.sh b/arch/arch.deps.sh index 35b3984..f6e6a81 100755 --- a/arch/arch.deps.sh +++ b/arch/arch.deps.sh @@ -1,14 +1,108 @@ #!/bin/sh +msg () { + echo "$@" 1>&2 +} + list_file="$1" : ${list_file:="arch.list"} +: ${TAR:="tar"} +: ${ARCH_DBPATH:="/var/lib/pacman"} +dbpath_sync="${ARCH_DBPATH}/sync" -loop_first=1 -for pkg in `cat "${list_file}"`; do - if [ "${loop_first}" = "1" ]; then - printf "'%s'" "${pkg}" +newline=' +' +pkg_groups_map='' +pkg_groups_prev='' + +# pkg_groups_add <package> <group> +pkg_groups_add () { + if [ "$1" = "${pkg_groups_prev}" ]; then + pkg_groups_map="${pkg_groups_map}/$2/" else - printf " '%s'" "${pkg}" + pkg_groups_map="${pkg_groups_map}${newline}$1 /$2/" + fi + pkg_groups_prev="$1" +} + +# pkg_groups_find <group> +pkg_groups_find () { + echo "${pkg_groups_map}" | grep "/$1/" | cut -f 1 -d ' ' +} + +# Build the list of groups +for db in "${dbpath_sync}"/*.db; do + msg "==> Loading package database ${db}" + tmpdir="`mktemp -d`" + if [ -z "${tmpdir}" ] || [ "`dirname "${tmpdir}"`" = "/" ]; then + msg "==> Invalid temporary directory ${tmpdir}" + exit 1 + fi + ${TAR} -xf "${db}" -C "${tmpdir}" + for desc in "${tmpdir}"/*/desc; do + have_groups=0 + case "`cat "${desc}"`" in + *%GROUPS%*) + have_groups=1 + ;; + esac + if [ "${have_groups}" = "0" ]; then + continue + fi + name='' + name_next=0 + groups_found=0 + while read -r oneline; do + case "${oneline}" in + %GROUPS%) + groups_found=1 + continue + ;; + %NAME%) + if [ "${name_next}" = "0" ]; then + name_next=1 + continue + fi + ;; + %*%) + if [ "${groups_found}" = "1" ]; then + break + fi + ;; + esac + if [ "${name_next}" = "1" ]; then + name="${oneline}" + name_next=2 + continue + fi + if [ "${groups_found}" = "1" ]; then + if [ "${name_next}" != "2" ]; then + msg "==> %GROUPS% found before %NAME%" + exit 1 + fi + if [ -z "${oneline}" ]; then + continue + fi + pkg_groups_add "${name}" "${oneline}" + fi + done < "${desc}" + done + rm -rf "${tmpdir}" +done + +loop_first=1 +msg "==> Expanding all groups" +for pkg_or_group in `cat "${list_file}"`; do + pkgs="`pkg_groups_find "${pkg_or_group}"`" + if [ -z "${pkgs}" ]; then + pkgs="${pkg_or_group}" fi - loop_first=0 + for pkg in ${pkgs}; do + if [ "${loop_first}" = "1" ]; then + printf "'%s'" "${pkg}" + else + printf " '%s'" "${pkg}" + fi + loop_first=0 + done done |