X-Git-Url: https://pd.if.org/git/?p=zpackage;a=blobdiff_plain;f=bin%2Fzpm-pathmod;fp=bin%2Fzpm-pathmod;h=90c29c1d750ef9051e361c87f1d87bb977375c5a;hp=0000000000000000000000000000000000000000;hb=0419c62f964b259df1c1816f5870ef62eb97ed7c;hpb=0c2216d1e0dc8565a6bf61c9572e47bb1ae1c1fb diff --git a/bin/zpm-pathmod b/bin/zpm-pathmod new file mode 100755 index 0000000..90c29c1 --- /dev/null +++ b/bin/zpm-pathmod @@ -0,0 +1,141 @@ +#!/bin/sh + +# edit package metadata + +#zpm pkg -s packager=foo zpm + +# zpm pkg -f 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 +)