]> pd.if.org Git - zpackage/commitdiff
alter zpm-pkg syntax
authorNathan Wagner <nw@hydaspes.if.org>
Sun, 23 Sep 2018 08:10:59 +0000 (08:10 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Mon, 24 Sep 2018 10:40:18 +0000 (10:40 +0000)
allows setting multiple items in one transaction

zpm-pkg

diff --git a/zpm-pkg b/zpm-pkg
index 663866ed2e0a074da7ce537097ed59c73c435426..14a01654ea598e79152aabd9ac7eb701cac4ce6d 100755 (executable)
--- a/zpm-pkg
+++ b/zpm-pkg
@@ -2,16 +2,25 @@
 
 # edit package metadata
 
-package=${1:-$ZPMPACKAGE}
-pkgver=${ZPMPKGVER:-1.0}
-pkgrel=${ZPMPKGREL:-1}
-
 #zpm pkg -s packager=foo zpm
 
 # zpm pkg -f <pkgfile> zpm packager=xyz
 # zpm pkg zpm packager zyz
 # zpm pkg zpm packager
 
+warn() {
+       printf '%s:' "$0" 1>&2
+       printf ' %s' $* 1>&2
+       printf '\n' 1>&2
+       rv=1
+}
+
+die() {
+       printf '%s:' "$0" 1>&2
+       printf ' %s' $* 1>&2
+       printf '\n' 1>&2
+       exit 1
+}
 
 pkgfile=${ZPMDB:-/var/lib/zpm/db.zpm}
 
@@ -29,38 +38,78 @@ if [ ! -f $pkgfile ]; then
        exit 1
 fi
 
-pkg=$1
+item=$1
 shift
 #printf "pkg: %s\n" $pkg
-pkgid=$(zpm findpkg $pkgfile $pkg)
+pkgid=$(zpm findpkg $pkgfile "$item")
 
-#printf "pkgid: %s\n" $pkgid
+if [ -z "$pkgid" ]; then
+       die "can't find pkgid for $item in $pkgfile"
+fi
 
-case $1 in
-       status) item=status ;;
-       *) printf 'no such field %s\n' $1; exit 1 ;;
-esac
+(
+rv=0
 
-item=$1
+{
+printf "begin;\n"
+while [ $# -gt 0 ]; do
+       item=$1
+       shift
+       show=0
+       case "$item" in
+               :*)
+                       pkgid=$(zpm findpkg $pkgfile "${item#:}")
+                       continue
+                       ;;
+               *=*)
+                       field=${item%%=*}
+                       value=${item#*=}
+                       ;;
+               *=)
+                       field=${item%%=*}
+                       value=
+                       ;;
+               *)
+               field=$item
+               show=1
+               ;;
+       esac
 
-if [ -n "$2" ]; then
-       setting=$2
-zpm shell $pkgfile <<EOS
-update packages set $item = '$setting'
-where
-printf('%s-%s-%s', package,version,release) = '$pkgid'
-;
-EOS
-else
-       setting=$(zpm shell $pkgfile <<EOS
-select $item from packages
-where
-printf('%s-%s-%s', package,version,release) = '$pkgid'
-;
-EOS
-)
-       if [ -n "$setting" ]; then
-               printf '%s\n' "$setting"
+       if [ -z "$pkgid" ]; then
+               warn "can't find pkgid for $item in $pkgfile"
+               break;
+       fi
+
+       vfield=$(zpm quote "$field")
+
+       hasfield=$(zpm shell $pkgfile "select name from pragma_table_info('packages') where name = '$vfield';")
+       if [ -z "$hasfield" ]; then
+               warn "$field is not a valid package field"
+               break
+       fi
+
+       field=$(zpm quote -i "$field")
+
+       if [ $show -eq 1 ]; then
+               printf "select %s from packages_pkgid where pkgid = '%s';\n" "$field" "$pkgid"
+               continue
+       fi
+
+       if [ -z "$value" ]; then
+               value=NULL
+       else
+               value=$(zpm quote -q "$value")
        fi
+
+       printf "update packages_pkgid set %s = %s where pkgid = '$pkgid';\n" $field $value
+done
+
+if [ $rv -eq 0 ]; then
+       printf "commit;\n"
+else
+       printf "rollback;\n"
 fi
 
+} | zpm shell $pkgfile
+exit $rv
+)