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