#!/bin/sh
+warn() {
+ echo $* 1>&2
+}
+
die() {
echo $* 1>&2
+ zpm log -i -a 'aborting install' -t "$pkgid" "$*"
exit 1
}
verbose=0
runscripts=1
runconfigure=1
+absorb=0
+overwrite=0
+syncopts=''
# zpm-install [-SCn] [ -d localdb ] [ -f pkgfile ] [ -R installroot ] pkgstr ...
-while getopts f:d:R:nSCv opt; do
+while getopts f:d:R:nSCvAO opt; do
case $opt in
f) pkgfile="$OPTARG" ;;
d) localdb="$OPTARG" ;;
R) rootdir="$OPTARG" ;;
S) runscripts=0 ;;
C) runconfigure=0 ;;
+ A) absorb=1; syncopts="${syncopts} -A" ;;
+ O) overwrite=1; syncopts="${syncopts} -O" ;;
n) dryrun=1 ;;
v) verbose=1 ;;
*) die "usage ..." ;;
pkgver=$(zpm quote "$version")
pkgrel=$(zpm quote "$release")
-if [ -z "$localdb" ]; then
+if [ -n "$rootdir" ]; then
: rootdir=${rootdir%%/}
- localdb=${rootdir:-/}/var/lib/zpm/local.db
+fi
+
+if [ -z "$localdb" ]; then
+ localdb=${rootdir}/var/lib/zpm/local.db
fi
if [ ! -f "$localdb" ]; then
+ if [ -n "$rootdir" ] && [ ! -d $rootdir ]; then
+ mkdir $rootdir || die "can't create $rootdir: $!"
+ fi
+ for d in /var /var/lib /var/lib/zpm; do
+ test -d $rootdir/$d || mkdir $rootdir/$d || die "can't create $rootdir/$d/: $!"
+ done
zpm init "$localdb"
if [ $? -ne 0 ]; then
die "aborting install"
export ZPM_ROOT_DIR
fi
-# TODO mark already installed packages as updating?
for pkgstr in "$@"; do
pkgid=$(zpm findpkg -f $pkgfile $pkgstr)
if [ $? -ne 0 ]; then
- # TODO log
die "can't find package $pkgstr in $pkgfile"
fi
current=$(zpm list -s installed "$package")
if [ $runscripts -gt 0 ]; then
- zpm runscript -f $pkgfile -p pre-install $pkgid $current
+ # TODO run pre-upgrade script if needed
+ # zpm runscript -p pre-upgrade $current $pkgid
+ zpm script -f $pkgfile -p pre-install $pkgid $current
if [ $? -ne 0 ]; then
- # TODO log
die "pre-install script for $pkgid failed"
fi
fi
+ # remove the package if it exists. can't be in an installed
+ # state, would have bailed above. So, if it exists, can only
+ # be 'upgraded'. This should be fast, because we won't run
+ # a garbage collect, so any possible duplicate files between
+ # an upgraded or removed files, if they're there, won't need
+ # to be merged.
+
# only merge if localdb and pkgfile are different
if [ "$pkgfile" != "$ZPMDB" ]; then
+ zpm rmpackage $pkgid
zpm merge -f $pkgfile -s installing $pkgid
if [ $? -ne 0 ]; then
- # TODO log
die "merging $pkgid failed"
fi
+ else
+ zpm pkg $pkgid status=installing
fi
- # TODO but need to mark as installing if not merged
#zpm shell $ZPMDB 'select * from install_status' 1>&2
if [ $dryrun -gt 0 ]; then
#zpm list -v
#zpm shell $ZPMDB 'select * from install_status'
- zpm syncfs -nv -f $pkgfile
+ zpm syncfs $syncopts -nv -f $pkgfile
zpm pkg $pkgid status=dryrun
continue
fi
if [ $verbose -gt 0 ]; then
- zpm syncfs -v -f $pkgfile
- else
- zpm syncfs -f $pkgfile
+ syncopts="${syncopts} -v"
fi
+ zpm syncfs $syncopts -f $pkgfile
+
if [ $? -ne 0 ]; then
+ zpm pkg $pkgid status=failed
die 'zpm-syncfs failed';
fi
if [ $runscripts -gt 0 ]; then
- zpm runscript -f $pkgfile -p post-install $pkgid $current
+ zpm script -f $pkgfile -p post-install $pkgid $current
fi
if [ -n "$current" ]; then
fi
if [ $(id -u) -eq 0 ]; then
- if [ -f $rootdir/sbin/ldconfig ]; then
+ if [ ! -d $rootdir/etc ]; then
+ warn "no etc directory in $rootdir, skipping ldconfig"
+ elif [ -f $rootdir/sbin/ldconfig ]; then
$rootdir/sbin/ldconfig -r ${rootdir:-/}
elif [ -f /sbin/ldconfig ]; then
/sbin/ldconfig -r ${rootdir:-/}
# TODO skip configure if not on a terminal, regardless of settings
# TODO will need force option
if [ $runconfigure -gt 0 ]; then
- zpm runscript -f $pkgfile -p configure $pkgid $current
+ zpm script -f $pkgfile -p configure $pkgid $current
+ else
+ true
fi
done