#!/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 ...>
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" ;;
shift $((OPTIND - 1))
+for cf in /etc/zpmrc ~/.zpmrc ./.zpmrc; do
+ test -r $cf && . $cf
+done
+
: ${ZPMDB:=/var/lib/zpm/db.zpm}
export ZPMDB
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
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