]> pd.if.org Git - zpackage/blob - zpm-ipkgfile
cleanup foreach-path
[zpackage] / zpm-ipkgfile
1 #!/bin/sh
2
3 # install a file from a package
4 # -f pkgfile
5 # -R root of pkg
6 # -P prefix to file
7 # -S strip prefix
8 # -p pkgname
9
10 pkgroot=/
11
12 while getopts :f:v:r:d:a:u:g:l:p:b:P:R: opt; do
13         case $opt in
14                 R) pkgroot="$OPTARG" ;;
15                 f) pkgfile="$OPTARG" ;;
16                 v) pkgver="$OPTARG" ;;
17                 r) pkgrel="$OPTARG" ;;
18                 P) prefix="$OPTARG" ;;
19                 u) owner="$OPTARG" ;;
20                 g) group="$OPTARG" ;;
21         esac
22 done
23 shift $((OPTIND - 1))
24
25 die() {
26         echo $* 1>&2
27         exit 1
28 }
29
30 pkgfileinfo() {
31         zpm shell $pkgfile<<EOS
32 select $1 from packagefiles
33         where path='$2'
34         and package||'-'||version||'-'||release = '$pkg'
35         ;
36 EOS
37 }
38
39 # if not from a package file, from local db
40 if [ -z "$pkgfile" ]; then
41         die "installing from non-pkgfile not supported"
42 fi
43
44 pkg="$1"
45 shift
46
47 ZPMPKGFILE=$pkgfile
48 export ZPMPKGFILE
49
50 set -e
51 for path in "$@"; do
52         name=$(basename -- "$path")
53         dir=$(dirname -- "$path")
54         dir=${dir#/}
55
56         if [ "$pkgroot" != '/' ]; then
57                 dir=$pkgroot/$dir
58                 dir=${dir%/.}
59 #               if [ "$dir" = "//" ]; then dir=/ ; fi
60         else
61                 dir="/$dir"
62         fi
63
64         # TODO generate some unique hash
65         tmppath=$dir/.installing.$name
66
67         printf '%s installing %s\n' $pkg $dir/$name
68
69         fhash=$(pkgfileinfo hash $path)
70         mode=$(pkgfileinfo mode $path)
71         ftype=$(pkgfileinfo filetype $path)
72         : ${owner:=$(pkgfileinfo username $path)}
73         : ${group:=$(pkgfileinfo groupname $path)}
74
75         # TODO if the file already exists, and is the correct
76         # hash or directory, do nothing
77
78         # can't use install because it's not posix.
79         # probably worth writing a zpm-install, but with
80         # a different name since that wants to be a package install
81         # probably makes the most sense for extract to know how
82         # to do the extract to temp and such, then
83         # you can just add the -S option (secure)
84         #cat <<-EOC
85         mkdir -p $dir
86         umask 0700
87         case $ftype in
88                 r*) zpm extract $pkgfile $fhash $tmppath
89                         chown $owner:$group $tmppath
90                         chmod $mode $tmppath
91                         # TODO mv -n non-posix, going to need to have extract
92                         # do all of this
93                         mv $tmppath $dir/$name
94                         ;;
95                 d*)
96                         mkdir -m 000 $dir/$name
97                         chown $owner:$group $dir/$name
98                         chmod $mode $dir/name
99                         ;;
100
101                 *) echo unknown filetype ; exit 1 ;;
102         esac
103
104         #EOC
105 done