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