#!/bin/sh # 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 # zpm install [options] pkgver=${ZPMPACKAGEVER:-1.0} pkgrel=${ZPMPACKAGEREL:-1} pkgroot=/ # allocate an install id, perhaps hash package and timestamp # installid=$(echo $(date) $pkglist | zpm hash) # extract pre-scripts and run them # get list of paths to install # for each path, if directory, create and set mode # for each path, create leading directories # extract to something like /var/tmp/.hash, with low perms # only atomic if same filesystem, so use .installid.hash in the # install directory # set perms and such # move into place # after all the files, extract post scripts and run them # also need to mark package as installing so if it fails part way # through, it can be finished later # probably also want an option to "backup" any packages being upgraded # so it's trivial to downgrade or to revert if the install fails # option for "multipackage" just to let the system know that's what you meant # option to take filenames from stdin # parse package, version, release from file if not given # TODO what's the difference between prefix and pkgroot # need an option to not chown the files # option to install but not merge/track # options # -R install root, if installing as root, will chroot? # -C no chroot, even if root # -N no pre-scripts # -X no post-scripts # -f source repository file # -d local (recording) repository database # -D don't locally record # -t only files matching tags # -T exclude files matching tags 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" ;; C) chroot=0 ;; f) pkgfile="$OPTARG" ;; u) user="$OPTARG" ;; g) group="$OPTARG" ;; d) ZPMDB="$OPTARG" ;; esac done shift $((OPTIND - 1)) : ${ZPMDB:=/var/lib/zpm/db.zpm} export ZPMDB die() { printf 'zpm-install:' 1>&2 printf ' %s' $* 1>&2 printf '\n' 1>&2 exit 1 } if [ -z "$pkgfile" ]; then # actually, if no pkgfile, get pkgfile from repo # but need to loop over finding package files then # so this program probably needs to be "install from pkgfile" # and a separate one that will loop over a package # spec list and find from repos die "must specify package file" pkgfile="$package-$pkgver-$pkgrel.zpm" fi set -e zpm test -v $pkgfile if [ $# -gt 0 ]; then pkglist="$@" else pkglist=$(zpm findpkg $pkgfile) fi pathlist() { zpm shell $pkgfile<