#!/bin/sh
-# TODO: add duplicate checker to seeif a pkg is in multiple virtual pkgs
+# TODO: add duplicate checker to see if a pkg is in multiple virtual pkgs
prog=$(basename $0)
usage() {
$prog del <packages> <virtual>
Remove <packages> from virtual package <virtual>. Empty virtual
- packages are removed from world. The shorthand '$prog del * <virtual>' can
- be used to empty <virtual>.
+ packages are removed from world. The shorthand '$prog del * <virtual>'
+ can be used to empty <virtual>, which is equivalent to
+ 'apk del <virtual>', though with special handling of leading dots.
$prog list [-o | packages]
List virtual packages and their contents.
# ignore getopt's --, we don't care if an arg begins with - anyway
[ "$1" = '--' ] && switch >/dev/null
- # OPTIMIZE: getting deps of virtual packages is slow, it would be
- # great to use apk info -R from show_reqs in orphan loop
- all=$(apk info)
+ all=$(apk info | sort)
# show packages if no args
if [ $# -eq 0 ]; then
for x in $(echo "$all" | grep '^\.'); do
done
fi
# set all child packages of virtual packages as owned
+ # OPTIMIZE: getting deps of virtual packages is slow, it would be
+ # great to use apk info -R from show_reqs in orphan loop
+ # NOTE: since we don't have arrays in sh, set individual vars instead
for v in $(echo "$all" | grep '^\.'); do
for c in $(apk info -R $v | tail +2 | grep -v '^\.'); do
# NOTE: use tr because shell may not have ksh-derived ${c//}
- # XXX: package name may have illegal chars for variable name
- # past those already replaced, and replacing chars may
- # result in variable collision—but official apk repos do
- # not have any packages that would cause issues
- eval "__$(echo $c | tr -s '.:-' _)=1"
+ # XXX: have not verified if package name may have more illegal
+ # chars for variable name past those already replaced, and
+ # replacing chars may result in variable collision—but
+ # official apk repos do not have any package names that
+ # would cause issues
+ eval "__$(echo $c | tr -s '.:+-' _ | tr -s '<=~>@' "\n" | head -1)=1"
done
done
# check world against owned packages
- # TODO: notify user if package is in world and also a virtual package
+ # TODO: notify user if package is both in world and virtual package
orphans=$(
for x in $(cat /etc/apk/world | grep -v '^\.'); do
eval "[ \${__$(
- echo $x | tr -s '.:-' _ | tr -s '<>=' "\n" | head -1
+ echo $x | tr -s '.:+-' _ | tr -s '<=~>@' "\n" | head -1
)-0} -eq 0 ]" && echo $x
done
)
# remove packages from world if they are being moved to a virtual one
del=
for x in $pkgs; do
- if apk info -e "$x" >/dev/null 2>&1; then
+ #apk_adb.c: [!]name[<,<=,<~,=,~,>~,>=,>,><]ver, @ for pinning
+ if grep -qE "^$x($|[<=~>@])" /etc/apk/world; then
del="$del $x"
fi
done