aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2016-06-17 18:26:02 +0800
committerTing-Wei Lan <lantw44@gmail.com>2016-06-17 18:29:39 +0800
commitc080ad1bddbd32382e13e5d0b0540281d3b9b86f (patch)
treea2829113de000327bdc89cb3bbd638c8c829cc0d
parent9f8b695866c239e271c26a9ce808f03386c287e9 (diff)
downloadwspkg-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-xarch/arch.deps.sh106
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