X-Git-Url: https://git.sev.monster/~sev/dotfiles.git/blobdiff_plain/de4637f97cad9a689386999615e329b166952a32..4fa653d992e741dd96b3c58a265b2fb71cd8b0b7:/bin/apkv?ds=sidebyside diff --git a/bin/apkv b/bin/apkv index 5e586a2..2a4d342 100755 --- a/bin/apkv +++ b/bin/apkv @@ -1,5 +1,5 @@ #!/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() { @@ -13,8 +13,9 @@ Usage: $prog del Remove from virtual package . Empty virtual - packages are removed from world. The shorthand '$prog del * ' can - be used to empty . + packages are removed from world. The shorthand '$prog del * ' + can be used to empty , which is equivalent to + 'apk del ', though with special handling of leading dots. $prog list [-o | packages] List virtual packages and their contents. @@ -84,9 +85,7 @@ if [ "$method" = list ]; then # 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 @@ -94,22 +93,26 @@ if [ "$method" = list ]; then 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 ) @@ -186,7 +189,8 @@ else # 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