]> pd.if.org Git - zpackage/commitdiff
zpm-install work on upgrades
authorNathan Wagner <nw@hydaspes.if.org>
Fri, 10 Aug 2018 05:31:51 +0000 (05:31 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Fri, 10 Aug 2018 05:31:51 +0000 (05:31 +0000)
zpm-install

index 589cb84adc3e9acd90fc7fba90293e5f2bbfe93a..b312afa7279498c24f4b726df2cb9ac8696e1c3c 100755 (executable)
@@ -1,11 +1,31 @@
 #!/bin/sh
 
+# do one thing and do it well
+# this program installs packages from a package file
+# by default, it will install the latest version of each package
+# found in the file.
+
+# todo
+
+# if package specifiers are given as arguments after the package file
+# it will only install those packages.
+
+# package specifiers are of the form pkg[-ver[-rel]], i.e the
+# release can be omitted, and the version-release can be omitted.
+# examples:
+# zpm install -f foo-0.1-1.zpm
+# zpm install -f foo.zpm foo-0.1
+
+# todo: file tag handling
+
 # what we need to install a package:
 
 # recording repo: where we record what we've done
 # source: where we get the package and files from
 # install root: really just a prefix, but thought about differently,
 #    and we might need to do a chroot
+# package name to install, could be "all" or "all most recent"
+# but for now, assume only one package in a file?
 
 # zpm install [options] <package ...>
 
@@ -53,10 +73,6 @@ pkgroot=/
 
 chroot=1
 
-for cf in /etc/zpmrc ~/.zpmrc ./.zpmrc; do
-       test -r $cf && . $cf
-done
-
 while getopts :R:CNXf:d:Dt:T:u:g: opt; do
        case $opt in
                R) pkgroot="$OPTARG" ;;
@@ -70,6 +86,10 @@ done
 
 shift $((OPTIND - 1))
 
+for cf in /etc/zpmrc ~/.zpmrc ./.zpmrc; do
+       test -r $cf && . $cf
+done
+
 : ${ZPMDB:=/var/lib/zpm/db.zpm}
 
 export ZPMDB
@@ -117,16 +137,135 @@ installpkg() (
        package="$1"
 )
 
-zpm merge $pkgfile
+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
+}
 
 for pkg in $pkglist; do
+       pname=$(pkgname $pkg)
+       curver=$(zpm findpkg $ZPMDB $pname)
+       pkg=$(zpm findpkg $pkgfile $pkg)
+       upgrade='n'
+
+       if [ -n "$curver" ]; then
+               set +e
+               upgrade=$(zpm vercmp $pkg $curver)
+       fi
+
+       case $upgrade in
+               0) die 'already installed' $curver;;
+               1) do_upgrade $pkg $curver ; exit 0 ;;
+               -1) die 'would be downgrade' $curver '->' $pkg ;;
+               n) printf 'ok to install %s\n' $pkg ;;
+       esac
+
+       zpm merge $pkgfile $pkg
        # TODO find scripts marked as pre-install
+       #run_preinstall
+
        # TODO if this is an upgrade, run pre-upgrade
+       #if [ $upgrade != 'n' ]; then
+       #       run_preupgrade
+       #fi
 
        # TODO get total size of install so we can do a progress bar
+       #tsize=totalsize
 
        # add package info to local package db
+       #zpm merge $pkgfile $pkg
+
        # check for conflicts
+
        # mark package in localdb as installing
        # zpm setmark installing $pkg
        # install all the files for a package
@@ -134,6 +273,7 @@ for pkg in $pkglist; do
        echo installing $pkglist
        filecount=$(pathlist | wc -l)
        echo $filecount files
+       #die 'aborting for test'
        #pathlist
        pathlist | xargs zpm ipkgfile ${user+-u $user} ${group+-g $group} -R "$pkgroot" -f $pkgfile -- $pkg