update=0
remove_older=0
only_if_newer=0
+one_at_a_time=0
target=${ZPMDB:=/var/lib/zpm/local.db}
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
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
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
if [ $verbose -ne 0 ]; then
printf "%s\n" $pkglist
fi
+}
+
+# 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
+ merge_list $pkgid
+ done
+else
+ merge_list $pkglist
+fi