X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=zpm-merge;fp=zpm-merge;h=0000000000000000000000000000000000000000;hb=0419c62f964b259df1c1816f5870ef62eb97ed7c;hp=48d826f4d2f6f7cba8ea8798194e3b1fb7305882;hpb=0c2216d1e0dc8565a6bf61c9572e47bb1ae1c1fb;p=zpackage diff --git a/zpm-merge b/zpm-merge deleted file mode 100755 index 48d826f..0000000 --- a/zpm-merge +++ /dev/null @@ -1,253 +0,0 @@ -#!/bin/sh - -# merge -# collects info from package file and copies it into another package file - -# merge [ -d ZPMDB ] [-f $pkgfile] pkg -# -F include file content -# -S don't include script content - -warn() { - printf 'zpm-merge:' 1>&2 - printf ' %s' "$@" 1>&2 - printf '\n' 1>&2 - exit 1 -} - -die() { - warn "$@" - exit 1 -} - -verbose=0 -mergefiles=0 -mergescripts=1 -mergeall=1 -update=0 -remove_older=0 -only_if_newer=0 -one_at_a_time=0 - -target=${ZPMDB:=/var/lib/zpm/local.db} - -# TODO option to only update if new -# new is hash is different or build time is later -# TODO option to merge all packages found in pkgfile -while getopts :f:vd:FSs:auonO opt; do - case $opt in - f) pkgfile="$OPTARG" ;; - v) verbose=$(( verbose + 1 )) ;; - d) target="$OPTARG" ;; - F) mergefiles=1 ;; - S) mergescripts=0 ;; - s) newstatus="$OPTARG" ;; - a) mergeall=1 ;; - u) update=1 ;; - o) remove_older=1 ;; - n) only_if_newer=1 ;; - O) one_at_a_time=1 ;; - *) echo 'zpm-merge unknown option' $OPTARG; exit 1 ;; - esac -done -shift $((OPTIND - 1)) - -# TODO test target -if [ ! -e "$target" ]; then - die "target file $target does not exist" -fi - -zpm test -v "$target" || exit 1 - -if [ $# -eq 0 ]; then - mergeall=1 -else - mergeall=0 -fi - -# TODO if pkgfile is specified, allow multiple packages as args -if [ $mergeall -eq 0 ]; then - pkgid=$1 - shift - - if [ -z "$pkgid" ]; then - die "must specify pkgid" - fi - - eval "$(zpm parse -E $pkgid)" - - if [ -z "$pkgfile" ]; then - pkgfile=$ZPM_PACKAGE_FILE - fi - - # calculate package id, pkgfile, etc - # cases R = full package id, F = specified package file - - # immediate error - # --- 000 error, must specify something - if [ -z "$release" ] && [ -z "$pkgfile" ]; then - die must specify package file or complete package id - fi - - # try to get from package file - if [ -z "$release" ]; then - pkgid=$(zpm findpkg -f $pkgfile $pkgid) - if [ -z "$pkgid" ]; then - die cannot find package id - fi - eval "$(zpm parse -E $pkgid)" - fi - - # --F 001 error, wouldn't know which pkgid to create, could derive from file? - if [ -z "$release" ]; then - die must specify complete package id - fi - - # set file from pkgid - # -R- 010 set file from pkgid, create in file, error if no file - if [ -z "$pkgfile" ]; then - pkgfile="$pkgid.zpm" - fi - - if [ $verbose -gt 1 ]; then - echo merging $pkgfile $pkgid into $target - fi - pkglist=$pkgid -else - pkglist=$(zpm list -f "$pkgfile") -fi - -zpm test -v "$pkgfile" || exit 1 - -if [ -n "$newstatus" ]; then - newstatus=$(zpm quote "$newstatus") -fi - -mergeone() { - pkgid=$1 - package=$(zpm parse -n "$pkgid") - where="where printf('%s-%s-%s', P.package, P.version, P.release) = '$pkgid'" - if [ $update -eq 1 ]; then - printf "delete from packages_pkgid where pkgid = '%s';\n" "$pkgid" - fi - if [ $remove_older -eq 1 ]; then - printf "delete from packages_pkgid where package = '$package' and pkgid < '%s' collate vercmp;\n" "$pkgid" - fi - printf "insert or rollback into packages select * from remote.packages P %s;\n" "$where" - printf "insert or rollback into packagefiles select * from remote.packagefiles P %s;\n" "$where" - printf "insert or rollback into scripts select * from remote.scripts P %s;\n" "$where" - if [ $mergefiles -eq 1 ]; then - printf "insert into files select F.* from remote.files F\n" - printf "inner join remote.packagefiles_pkgid P on P.hash = F.hash %s\n" "$where" - printf "on conflict (hash) do nothing;\n"; - fi - # scripts - if [ $mergescripts -eq 1 ]; then - printf "insert into files select F.* from remote.files F\n" - printf "inner join remote.scripts_pkgid P on P.hash = F.hash where P.pkgid = '%s'\n" "$pkgid" - printf "on conflict (hash) do nothing;\n"; - fi - if [ -n "$newstatus" ]; then - newstatus=$(zpm quote "$newstatus") - printf "update packages as P set status = '$newstatus' %s;\n" "$where" - fi -} - -check_have() { - merged=$(zpm shell "$target" "select 1 from packages_pkgid where pkgid = '$1'") - test -n "$merged" -} - -filter_out_have() { - mlist= - for pkgid in "$@"; do - if ! check_have "$pkgid" ; then - mlist="$mlist $pkgid" - fi - done - mlist=${mlist#' '} - printf '%s' "$mlist" -} - -filter_have() { - mlist= - for pkgid in "$@"; do - if check_have "$pkgid" ; then - mlist="$mlist $pkgid" - fi - done - mlist=${mlist#' '} - printf '%s' "$mlist" -} - -check_newer() { - pkg=$1 - package=$(zpm parse -n "$pkg") - newer=$(zpm shell "$target" "select '$pkg' > (select max(pkgid collate vercmp) from packages_pkgid where package = '$package') collate vercmp") - if [ "$newer" = '1' ] || [ -z "$newer" ]; then - return 0 - fi - return 1 -} - -filter_newer() { - mlist= - for pkgid in "$@"; do - if check_newer "$pkgid" ; then - mlist="$mlist $pkgid" - fi - done - mlist=${mlist#' '} - printf '%s' "$mlist" -} - -merge_list() { -# TODO file tags and package tags -( - printf ".bail on\n" - printf "attach '%s' as remote;\n" "$pkgfile" - printf "begin;\n" - - for pkgid in "$@"; do - mergeone "$pkgid" - done - - printf "insert or ignore into elfneeded select * from remote.elfneeded;\n" - printf "insert or ignore into elflibraries select * from remote.elflibraries;\n" - printf "insert or ignore into package_signatures select * from remote.package_signatures PS where PS.packagehash in (select hash from remote.packages);\n" - - printf "commit;\n" -) | zpm shell $target -} - -# check for already merged packages -if [ $update -eq 0 ] && [ $only_if_newer -eq 0 ]; then - have=$(filter_have $pkglist) - if [ -n "$have" ]; then - die "already merged: $have" - fi -fi - -if [ $update -eq 0 ]; then - pkglist=$(filter_out_have $pkglist) -fi - -if [ $only_if_newer -eq 1 ]; then - pkglist=$(filter_newer $pkglist) - if [ -z "$pkglist" ]; then - exit 0 - fi -fi - -if [ $one_at_a_time -eq 1 ]; then - for pkgid in $pkglist; do - if [ $verbose -ne 0 ]; then - printf '%s\n' $pkgid - fi - merge_list $pkgid - done -else - if [ $verbose -ne 0 ]; then - printf "%s\n" $pkglist - fi - merge_list $pkglist -fi