+pkgname() {
+ # strip off a trailing release
+ nv=$(printf '%s' "$1" | sed -e 's/-[0-9]\+$//')
+ nv=$(printf '%s' "$nv" | sed -e 's/-[0-9][^-]*$//')
+ printf '%s' "$nv"
+}
+
+# TODO see if we're already installed
+# if we are, then bail...
+
+
+# how to do an upgrade?
+# paths to add
+# paths to remove
+# paths to replace
+
+newfiles() {
+ #zpm merge $pkgfile $newver
+
+ # add...
+ zpm shell $ZPMDB<<-EOS
+ select NV.path
+ from packagefiles NV
+ where
+ printf('%s-%s-%s', NV.package, NV.version, NV.release) = '$1'
+ except
+ select OV.path
+ from packagefiles OV
+ where
+ printf('%s-%s-%s', OV.package, OV.version, OV.release) = '$2'
+ ;
+ EOS
+}
+
+removedfiles() {
+ #zpm merge $pkgfile $newver
+
+ zpm shell $ZPMDB<<-EOS
+ select OV.path
+ from packagefiles OV
+ where
+ printf('%s-%s-%s', OV.package, OV.version, OV.release) = '$2'
+ except
+ select NV.path
+ from packagefiles NV
+ where
+ printf('%s-%s-%s', NV.package, NV.version, NV.release) = '$1'
+ ;
+ EOS
+}
+
+changedfiles() {
+ # add...
+ zpm shell $ZPMDB<<-EOS
+ select NV.path
+ from packagefiles OV
+ inner join packagefiles NV
+ on OV.path = NV.path
+ where
+ printf('%s-%s-%s', NV.package, NV.version, NV.release) = '$1'
+ and
+ printf('%s-%s-%s', OV.package, OV.version, OV.release) = '$2'
+ and NV.hash != OV.hash
+ ;
+ EOS
+}
+
+do_upgrade() {
+ newver=$1
+ oldver=$2
+
+ set -e
+ echo merging $newver
+ zpm merge $pkgfile $newver
+
+ echo newfiles
+ newfiles $newver $oldver | xargs zpm ipkgfile ${user+-u $user} ${group+-g $group} -R "$pkgroot" -f $pkgfile -- $nver
+
+ echo changed
+ changedfiles $newver $oldver | xargs zpm ipkgfile ${user+-u $user} ${group+-g $group} -R "$pkgroot" -f $pkgfile -- $pkg
+
+ echo removed
+ removedfiles $newver $oldver | xargs rm
+
+ zpm pkg $newver status installed
+ zpm pkg $oldver status upgraded
+
+ zpm shell $ZPMDB<<-EOS
+ delete from packages
+ where
+ printf('%s-%s-%s', package, version, release) = '$oldver';
+ EOS
+}