]> pd.if.org Git - zpackage/blob - zpm-install
install will init the localdb if it does not exist
[zpackage] / zpm-install
1 #!/bin/sh
2
3 die() {
4         echo $* 1>&2
5         exit 1
6 }
7
8 dryrun=0
9 verbose=0
10 runscripts=1
11 runconfigure=1
12
13 # zpm-install [-SCn] [ -d localdb ] [ -f pkgfile ] [ -R installroot ] pkgstr ...
14 while getopts f:d:R:nSCv opt; do
15         case $opt in
16                 f) pkgfile="$OPTARG" ;;
17                 d) localdb="$OPTARG" ;;
18                 R) rootdir="$OPTARG" ;;
19                 S) runscripts=0 ;;
20                 C) runconfigure=0 ;;
21                 n) dryrun=1 ;;
22                 v) verbose=1 ;;
23                 *) die "usage ..." ;;
24         esac
25 done
26 shift $(( OPTIND - 1))
27
28 pkgid=$1
29
30 if [ -z "$pkgid" ]; then
31         die "must specify pkgid"
32 fi
33
34 eval "$(zpm parse -E $pkgid)"
35
36 if [ -z "$pkgfile" ]; then
37         pkgfile=$ZPM_PACKAGE_FILE
38 fi
39
40 # cases R = full package id, F = specified package file
41
42 # immediate error
43 # -- 00 error, must specify something
44 if [ -z "$release" ] && [ -z "$pkgfile" ]; then
45         die must specify package file or complete package id
46 fi
47
48 # TODO look in package file
49 # -F 01 error, wouldn't know which pkgid to create, could derive from file?
50 if [ -z "$release" ]; then
51         # must have package file, or would have died above
52         pkgid=$(zpm findpkg -f $pkgfile $pkgid)
53         if [ -n "$pkgid" ]; then
54                 eval "$(zpm parse -E $pkgid)"
55         fi
56 fi
57
58 if [ -z "$pkgid" ]; then
59         die "$0 can't figure out a package id"
60 fi
61
62 # set file from pkgid
63 # R- 10 set file from pkgid, create in file, error if no file
64 if [ -z "$pkgfile" ]; then
65         pkgfile="$pkgid.zpm"
66 fi
67
68 # will now be one of these
69 # RF 11 create package in file, error if file doesn't exist
70 if [ ! -f "$pkgfile" ]; then
71         die $pkgfile does not exist
72 fi
73
74 if [ "$idempotent" = 1 ]; then
75         idempotent='or ignore'
76 fi
77
78 package=$(zpm quote "$name")
79 pkgver=$(zpm quote "$version")
80 pkgrel=$(zpm quote "$release")
81
82 if [ -z "$localdb" ]; then
83         : rootdir=${rootdir%%/}
84         localdb=${rootdir:-/}/var/lib/zpm/local.db
85 fi
86
87 if [ ! -f "$localdb" ]; then
88         zpm init "$localdb"
89 fi
90
91 ZPMDB=$localdb
92 export ZPMDB
93
94 if [ -z "$ZPMDB" ]; then
95         die "no local db"
96 else
97         #echo "localdb = $ZPMDB"
98         true
99 fi
100
101 zpm test -v "$ZPMDB" || die "$ZPMDB is not a zpm database"
102
103 # check if we're installing something already
104 var=$(zpm list -f $localdb -s installing | wc -l)
105 if [ $var -gt 0 ]; then
106         zpm list -v -f $localdb -s installing 
107         die "already ($localdb) installing $var package(s)"
108 fi
109 # check if we're installing something already
110 var=$(zpm list -f $localdb -s removing | wc -l)
111 if [ $var -gt 0 ]; then
112         zpm list -v -f $localdb -s removing 
113         die "already ($localdb) removing $var package(s)"
114 fi
115 var=$(zpm list -f $localdb -s updating | wc -l)
116 if [ $var -gt 0 ]; then
117         zpm list -v -f $localdb -s updating 
118         die "already ($localdb) updating $var package(s)"
119 fi
120
121 if [ -n "$rootdir" ]; then
122         ZPM_ROOT_DIR="$rootdir"
123         export ZPM_ROOT_DIR
124 fi
125
126 # TODO mark already installed packages as updating?
127 for pkgstr in "$@"; do
128         pkgid=$(zpm findpkg -f $pkgfile $pkgstr)
129         if [ $? -ne 0 ]; then
130                 # TODO log
131                 die "can't find package $pkgstr in $pkgfile"
132         fi
133
134         curstatus=$(zpm pkg $pkgid status)
135         if [ "$curstatus" = 'installed' ]; then
136                 die "$pkgid already installed"
137         fi
138
139         eval $(zpm parse -E $pkgid)
140
141         #zpm list -v
142         current=$(zpm list -s installed "$package")
143         
144         if [ $runscripts -gt 0 ]; then
145                 zpm runscript -f $pkgfile -p pre-install $pkgid $current
146                 if [ $? -ne 0 ]; then
147                         # TODO log
148                         die "pre-install script for $pkgid failed"
149                 fi
150         fi
151
152         # only merge if localdb and pkgfile are different
153         if [ "$pkgfile" != "$ZPMDB" ]; then
154                 zpm merge -f $pkgfile -s installing $pkgid
155                 if [ $? -ne 0 ]; then
156                         # TODO log
157                         die "merging $pkgid failed"
158                 fi
159         fi
160         # TODO but need to mark as installing if not merged
161
162         #zpm shell $ZPMDB 'select * from install_status' 1>&2
163         if [ $dryrun -gt 0 ]; then
164                 #zpm list -v
165                 #zpm shell $ZPMDB 'select * from install_status'
166                 zpm syncfs -nv -f $pkgfile
167                 zpm pkg $pkgid status=dryrun
168                 continue
169         fi
170
171         if [ $verbose -gt 0 ]; then
172                 zpm syncfs -v -f $pkgfile
173         else
174                 zpm syncfs -f $pkgfile
175         fi
176
177         if [ $? -ne 0 ]; then
178                 die 'zpm-syncfs failed';
179         fi
180
181         if [ $runscripts -gt 0 ]; then
182                 zpm runscript -f $pkgfile -p post-install $pkgid $current
183         fi
184
185         if [ -n "$current" ]; then
186                 zpm pkg $pkgid status=installed :$current status=updated
187         else
188                 zpm pkg $pkgid status=installed
189         fi
190
191         if [ $(id -u) -eq 0 ]; then
192                 /sbin/ldconfig
193         fi
194
195         # TODO skip configure if not on a terminal, regardless of settings
196         # TODO will need force option
197         if [ $runconfigure -gt 0 ]; then
198                 zpm runscript -f $pkgfile -p configure $pkgid $current
199         fi
200 done