]> pd.if.org Git - zpackage/blobdiff - bin/zpm-pathmod
move programs to bin for build
[zpackage] / bin / zpm-pathmod
diff --git a/bin/zpm-pathmod b/bin/zpm-pathmod
new file mode 100755 (executable)
index 0000000..90c29c1
--- /dev/null
@@ -0,0 +1,141 @@
+#!/bin/sh
+
+# edit package metadata
+
+#zpm pkg -s packager=foo zpm
+
+# zpm pkg -f <pkgfile> zpm path 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}
+
+pathglob=0
+
+while getopts f:g opt; do
+       case $opt in
+               f) pkgfile="$OPTARG" ;;
+               g) pathglob=1 ;;
+       esac
+done
+shift $((OPTIND - 1))
+
+if [ $pathglob -eq 1 ]; then
+       pathop='glob'
+else
+       pathop='='
+fi
+
+set -e
+
+if [ ! -f $pkgfile ]; then
+       echo cannot find $pkgfile
+       exit 1
+fi
+
+item=$1
+shift
+#printf "pkg: %s\n" $pkg
+pkgid=$(zpm findpkg -f $pkgfile "$item")
+
+if [ -z "$pkgid" ]; then
+       die "can't find pkgid for $item in $pkgfile"
+fi
+
+path=$1
+shift
+path=$(zpm quote "$path")
+
+(
+rv=0
+
+{
+printf "begin;\n"
+while [ $# -gt 0 ]; do
+       item=$1
+       shift
+       show=0
+       case "$item" in
+               :*)
+                       pkgid=$(zpm findpkg -f $pkgfile "${item#:}")
+                       continue
+                       ;;
+               +*)
+                       path="${item#+}"
+                       path=$(zpm quote "$path")
+                       continue
+                       ;;
+               *=*)
+                       field=${item%%=*}
+                       value=${item#*=}
+                       ;;
+               *=)
+                       field=${item%%=*}
+                       value=
+                       ;;
+               *)
+               field=$item
+               show=1
+               ;;
+       esac
+
+       # TODO if field = pkgid, parse and set
+       # TODO if changing pkgid, and it doesn't exist, better error
+       # message
+
+       if [ -z "$pkgid" ]; then
+               warn "can't find pkgid for $item in $pkgfile"
+               break;
+       fi
+
+       if [ $field = delete ]; then
+               printf "delete from packagefiles_pkgid where pkgid = '%s' and path $pathop '%s';\n" "$pkgid" "$path"
+       else
+               vfield=$(zpm quote "$field")
+
+               hasfield=$(zpm shell $pkgfile "select name from pragma_table_info('packagefiles') where name = '$vfield';")
+               if [ -z "$hasfield" ]; then
+                       warn "$field is not a valid packagefile field"
+                       break
+               fi
+
+               field=$(zpm quote -i "$field")
+
+               if [ $show -eq 1 ]; then
+                       printf "select %s from packagefiles_pkgid where pkgid = '%s' and path $pathop '$path';\n" "$field" "$pkgid"
+                       continue
+               fi
+
+               if [ -z "$value" ]; then
+                       value=NULL
+               else
+                       value=$(zpm quote -q "$value")
+               fi
+
+               printf "update packagefiles_pkgid set %s = %s where pkgid = '$pkgid' and path $pathop '$path';\n" $field $value
+       fi
+done
+
+if [ $rv -eq 0 ]; then
+       printf "commit;\n"
+else
+       printf "rollback;\n"
+fi
+
+} | zpm shell $pkgfile
+exit $rv
+)