]> pd.if.org Git - zpackage/blob - zpm-install
check for db init failure in install
[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         if [ $? -ne 0 ]; then
90                 die "aborting install"
91         fi
92 fi
93
94 ZPMDB=$localdb
95 export ZPMDB
96
97 if [ -z "$ZPMDB" ]; then
98         die "no local db"
99 else
100         #echo "localdb = $ZPMDB"
101         true
102 fi
103
104 zpm test -v "$ZPMDB" || die "$ZPMDB is not a zpm database"
105
106 # check if we're installing something already
107 var=$(zpm list -f $localdb -s installing | wc -l)
108 if [ $var -gt 0 ]; then
109         zpm list -v -f $localdb -s installing 
110         die "already ($localdb) installing $var package(s)"
111 fi
112 # check if we're installing something already
113 var=$(zpm list -f $localdb -s removing | wc -l)
114 if [ $var -gt 0 ]; then
115         zpm list -v -f $localdb -s removing 
116         die "already ($localdb) removing $var package(s)"
117 fi
118 var=$(zpm list -f $localdb -s updating | wc -l)
119 if [ $var -gt 0 ]; then
120         zpm list -v -f $localdb -s updating 
121         die "already ($localdb) updating $var package(s)"
122 fi
123
124 if [ -n "$rootdir" ]; then
125         ZPM_ROOT_DIR="$rootdir"
126         export ZPM_ROOT_DIR
127 fi
128
129 # TODO mark already installed packages as updating?
130 for pkgstr in "$@"; do
131         pkgid=$(zpm findpkg -f $pkgfile $pkgstr)
132         if [ $? -ne 0 ]; then
133                 # TODO log
134                 die "can't find package $pkgstr in $pkgfile"
135         fi
136
137         curstatus=$(zpm pkg $pkgid status)
138         if [ "$curstatus" = 'installed' ]; then
139                 die "$pkgid already installed"
140         fi
141
142         eval $(zpm parse -E $pkgid)
143
144         #zpm list -v
145         current=$(zpm list -s installed "$package")
146         
147         if [ $runscripts -gt 0 ]; then
148                 zpm runscript -f $pkgfile -p pre-install $pkgid $current
149                 if [ $? -ne 0 ]; then
150                         # TODO log
151                         die "pre-install script for $pkgid failed"
152                 fi
153         fi
154
155         # only merge if localdb and pkgfile are different
156         if [ "$pkgfile" != "$ZPMDB" ]; then
157                 zpm merge -f $pkgfile -s installing $pkgid
158                 if [ $? -ne 0 ]; then
159                         # TODO log
160                         die "merging $pkgid failed"
161                 fi
162         fi
163         # TODO but need to mark as installing if not merged
164
165         #zpm shell $ZPMDB 'select * from install_status' 1>&2
166         if [ $dryrun -gt 0 ]; then
167                 #zpm list -v
168                 #zpm shell $ZPMDB 'select * from install_status'
169                 zpm syncfs -nv -f $pkgfile
170                 zpm pkg $pkgid status=dryrun
171                 continue
172         fi
173
174         if [ $verbose -gt 0 ]; then
175                 zpm syncfs -v -f $pkgfile
176         else
177                 zpm syncfs -f $pkgfile
178         fi
179
180         if [ $? -ne 0 ]; then
181                 die 'zpm-syncfs failed';
182         fi
183
184         if [ $runscripts -gt 0 ]; then
185                 zpm runscript -f $pkgfile -p post-install $pkgid $current
186         fi
187
188         if [ -n "$current" ]; then
189                 zpm pkg $pkgid status=installed :$current status=updated
190         else
191                 zpm pkg $pkgid status=installed
192         fi
193
194         if [ $(id -u) -eq 0 ]; then
195                 /sbin/ldconfig
196         fi
197
198         # TODO skip configure if not on a terminal, regardless of settings
199         # TODO will need force option
200         if [ $runconfigure -gt 0 ]; then
201                 zpm runscript -f $pkgfile -p configure $pkgid $current
202         fi
203 done