+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() {