+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() {
+ nv=$1
+ ov=$2
+# printf "zzz checking %s vs %s\n" "$1" "$2"
+# printf "zzz checking %s vs %s\n" "$nv" "$ov"
+ 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 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
+ zpm pkg $newver status installing
+
+ newct=$(newfiles "$newver" "$oldver" | wc -l)
+ echo newfiles $newct
+
+ if [ $newct -gt 0 ]; then
+ newfiles $newver $oldver
+ { newfiles "$newver" "$oldver"; } | xargs zpm ipkgfile ${user+-u $user} ${group+-g $group} -R "$pkgroot" -f $pkgfile -- $nver
+ fi
+
+ ct=$(changedfiles $newver $oldver | wc -l)
+ echo changed $ct
+ if [ $ct -gt 0 ]; then
+ changedfiles $newver $oldver | xargs zpm ipkgfile ${user+-u $user} ${group+-g $group} -R "$pkgroot" -f $pkgfile -- $pkg
+ fi
+
+ ct=$(removedfiles $newver $oldver | wc -l)
+ echo removed $ct
+ if [ $ct -gt 0 ]; then
+ removedfiles $newver $oldver | xargs rm
+ fi
+
+ 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
+}
+
+conflicts() {
+ echo conflict check $pkg $pkgfile
+ #newver=$1
+ {
+ zpm shell $pkgfile<<-EOS
+ .separator " "
+ select hash,path from packagefiles
+ where package||'-'||version||'-'||release = '$pkg'
+ and filetype = 'r'
+ ;
+ EOS
+ } | while read hash path; do
+ rpath=$pkgroot$path
+ if [ -f $rpath ]; then
+ ihash=$(zpm hash $rpath)
+ if [ $ihash != $hash ]; then
+ die $path already exists
+ fi
+ elif [ -d $rpath ]; then
+ die $path already exists
+ fi
+ done
+
+ {
+ zpm shell $pkgfile<<-EOS
+ .separator " "
+ select path from packagefiles
+ where package||'-'||version||'-'||release = '$pkg'
+ and filetype = 'd'
+ ;
+ EOS
+ } | while read hash path; do
+ rpath=$pkgroot$path
+ if [ -f $rpath ]; then
+ die $path already exists
+ elif [ -d $rpath ]; then
+ die $path already exists
+ elif [ -e $rpath ]; then
+ die $path already exists
+ fi
+ done
+}