# -F include file content
# -S don't include script content
-die() {
+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
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:auon opt; do
+while getopts :f:vd:FSs:auonO opt; do
case $opt in
f) pkgfile="$OPTARG" ;;
- v) verbose=1 ;;
+ v) verbose=$(( verbose + 1 )) ;;
d) target="$OPTARG" ;;
F) mergefiles=1 ;;
S) mergescripts=0 ;;
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
pkgfile="$pkgid.zpm"
fi
- if [ $verbose -gt 0 ]; then
+ if [ $verbose -gt 1 ]; then
echo merging $pkgfile $pkgid into $target
fi
pkglist=$pkgid
fi
}
-# check for already merged packages
-if [ $update -eq 0 ]; then
- efail=0
+check_have() {
+ merged=$(zpm shell "$target" "select 1 from packages_pkgid where pkgid = '$1'")
+ test -n "$merged"
+}
- for pkg in $pkglist; do
- merged=$(zpm shell "$target" "select 1 from packages_pkgid where pkgid = '$pkgid'")
- if [ -n "$merged" ]; then
- warn "$pkgid already exists in $target";
- efail=1
+filter_out_have() {
+ mlist=
+ for pkgid in "$@"; do
+ if ! check_have "$pkgid" ; then
+ mlist="$mlist $pkgid"
fi
done
- if [ $efail -eq 1 ]; then
- die "aborting merge"
- fi
-fi
+ 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') from packages_pkgid where package = '$package'")
+ 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;
+ return 0
fi
return 1
}
-mlist="$pkglist"
-if [ $only_if_newer -eq 1 ]; then
+filter_newer() {
mlist=
- for pkgid in $pkglist; do
+ for pkgid in "$@"; do
if check_newer "$pkgid" ; then
mlist="$mlist $pkgid"
fi
done
- if [ -z "$mlist" ]; then
- exit 0
- fi
-fi
+ 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 $pkglist; do
+ for pkgid in "$@"; do
mergeone "$pkgid"
done
printf "insert or ignore into elflibraries select * from remote.elflibraries;\n"
printf "commit;\n"
-} | zpm shell $target
+) | 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 [ $verbose -ne 0 ]; then
- printf "%s\n" $pkglist
+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