pkgroot=/
-while getopts :f:v:r:d:a:u:l:p:b:P:R: opt; do
+while getopts :f:v:r:d:a:u:g:l:p:b:P:R: opt; do
case $opt in
R) pkgroot="$OPTARG" ;;
f) pkgfile="$OPTARG" ;;
v) pkgver="$OPTARG" ;;
r) pkgrel="$OPTARG" ;;
P) prefix="$OPTARG" ;;
+ u) owner="$OPTARG" ;;
+ g) group="$OPTARG" ;;
esac
done
shift $((OPTIND - 1))
pkg="$1"
shift
+ZPMPKGFILE=$pkgfile
+export ZPMPKGFILE
+
set -e
-for path in $*; do
- fhash=$(zpm pkgfileinfo hash $path)
- mode=$(zpm pkgfileinfo mode $path)
- owner=$(zpm pkgfileinfo username $path)
- group=$(zpm pkgfileinfo groupname $path)
- ftype=$(zpm pkgfileinfo filetype $path)
- name=$(basename -- $path)
+for path in "$@"; do
+ name=$(basename -- "$path")
+ dir=$(dirname -- "$path")
+ dir=${dir#/}
if [ "$pkgroot" != '/' ]; then
- dir=$pkgroot/$(dirname -- $path)
+ dir=$pkgroot/$dir
dir=${dir%/.}
- if [ "$dir" = "//" ]; then dir=/ ; fi
+# if [ "$dir" = "//" ]; then dir=/ ; fi
else
- dir=''
+ dir="/$dir"
fi
+ # TODO generate some unique hash
tmppath=$dir/.installing.$name
+ printf '%s installing %s\n' $pkg $dir/$name
+
+ fhash=$(pkgfileinfo hash $path)
+ mode=$(pkgfileinfo mode $path)
+ ftype=$(pkgfileinfo filetype $path)
+ : ${owner:=$(pkgfileinfo username $path)}
+ : ${group:=$(pkgfileinfo groupname $path)}
+
+ # TODO if the file already exists, and is the correct
+ # hash or directory, do nothing
+
# can't use install because it's not posix.
# probably worth writing a zpm-install, but with
# a different name since that wants to be a package install
# to do the extract to temp and such, then
# you can just add the -S option (secure)
#cat <<-EOC
- set -x
mkdir -p $dir
- zpm extract $pkgfile $fhash $tmppath 0
- chown $owner:$group $tmppath
- chmod $mode $tmppath
- # TODO mv -n non-posix, going to need to have extract do all
- # of this
- mv -n $tmppath $dir/$name
- set +x
+ umask 0700
+ case $ftype in
+ r*) zpm extract $pkgfile $fhash $tmppath
+ chown $owner:$group $tmppath
+ chmod $mode $tmppath
+ # TODO mv -n non-posix, going to need to have extract
+ # do all of this
+ mv $tmppath $dir/$name
+ ;;
+ d*)
+ mkdir -m 000 $dir/$name
+ chown $owner:$group $dir/$name
+ chmod $mode $dir/name
+ ;;
+
+ *) echo unknown filetype ; exit 1 ;;
+ esac
+
#EOC
done