Annotation of /branches/mage-sql/usr/lib/mage/sql_functions.sh
Parent Directory | Revision Log
Revision 1121 -
(hide annotations)
(download)
(as text)
Thu Jul 22 07:47:49 2010 UTC (13 years, 10 months ago) by niro
File MIME type: application/x-sh
File size: 25910 byte(s)
Thu Jul 22 07:47:49 2010 UTC (13 years, 10 months ago) by niro
File MIME type: application/x-sh
File size: 25910 byte(s)
-added fullpname2p{cat,name,ver,build}() functions as sql compat equivalent of magename2*() functions -fixed is_higher logic -> some packages uses a zero in front of a subpver and this is not handled as a integer (1.08 -> 08) -fixed all_{s,}depends() functions, using the ones from sqlwalker globally and deleted them in sqlwalker -fixed fetch_packages(), compat md5sum_packages() and unpack_packages() functions to work with sqlwalker output -added repository support to mage_install()
1 | niro | 486 | #!/bin/bash |
2 | |||
3 | die() | ||
4 | { | ||
5 | echo -e "Exited ${BASH_SOURCE} at line no ${BASH_LINENO}." | ||
6 | echo -e "$@" | ||
7 | exit 1 | ||
8 | } | ||
9 | |||
10 | sql() | ||
11 | { | ||
12 | local sqlcmd="$*" | ||
13 | [[ -z ${sqlcmd} ]] && die "no sqlcmd given." | ||
14 | |||
15 | sqlite3 -nullvalue 'NULL' -list -separator '|' "${DBFILE}" << EOF || die "error running '$@'" | ||
16 | ${sqlcmd}; | ||
17 | EOF | ||
18 | } | ||
19 | |||
20 | mage_setup() | ||
21 | { | ||
22 | [ ! -d ${MROOT}${INSTALLDB} ] && install -d ${MROOT}${INSTALLDB} | ||
23 | [ ! -d ${MROOT}${INSTALLDB}/records ] && install -d ${MROOT}${INSTALLDB}/records | ||
24 | # [ ! -f ${MROOT}${VIRTUALDB_FILE} ] && touch ${MROOT}${VIRTUALDB_FILE} | ||
25 | [ ! -d ${PKGDIR} ] && install -d ${PKGDIR} | ||
26 | [ ! -d ${BUILDDIR} ] && install -d ${BUILDDIR} | ||
27 | [ ! -d ${MAGEDIR} ] && install -d ${MAGEDIR} | ||
28 | |||
29 | return 0 | ||
30 | } | ||
31 | |||
32 | dep2pver() | ||
33 | { | ||
34 | local pver | ||
35 | |||
36 | pver="${1##*/}" | ||
37 | |||
38 | # cut version only if not virtual or it will cut the name | ||
39 | if [[ $(dep2pcat $1) != virtual ]] && \ | ||
40 | [[ $2 != virtual ]] | ||
41 | then | ||
42 | echo "${pver##*-}" | ||
43 | fi | ||
44 | } | ||
45 | |||
46 | niro | 1121 | # returns pname from fullname |
47 | # fullname2pver [fullname] -> PCAT/PNAME-PVER-PBUILD | ||
48 | fullname2pname() | ||
49 | { | ||
50 | local i pname | ||
51 | |||
52 | i="${1#*/}" | ||
53 | pname="${i%-*-*}" | ||
54 | echo "${pname}" | ||
55 | } | ||
56 | |||
57 | # returns pver from fullname | ||
58 | # fullname2pver [fullname] -> PCAT/PNAME-PVER-PBUILD | ||
59 | fullname2pver() | ||
60 | { | ||
61 | local i pver | ||
62 | |||
63 | i="${1#*/}" | ||
64 | i="${i/$(fullname2pname $1)-/}" | ||
65 | pver="${i%-*}" | ||
66 | echo "${pver}" | ||
67 | } | ||
68 | |||
69 | # returns pbuild from fullname | ||
70 | # fullname2pbuild [fullname] -> PCAT/PNAME-PVER-PBUILD | ||
71 | fullname2pbuild() | ||
72 | { | ||
73 | local i pbuild | ||
74 | |||
75 | i="$1" | ||
76 | pbuild="${i##*-}" | ||
77 | echo "${pbuild}" | ||
78 | } | ||
79 | |||
80 | # returns pcat from magename | ||
81 | # fullname2pcat [fullname] -> PCAT/PNAME-PVER-PBUILD | ||
82 | fullname2pcat() | ||
83 | { | ||
84 | local i pcat | ||
85 | |||
86 | i="${1%/*}" | ||
87 | # get basename | ||
88 | pcat="${i##*/}" | ||
89 | echo "${pcat}" | ||
90 | } | ||
91 | |||
92 | |||
93 | niro | 486 | ## atoi string |
94 | atoi() | ||
95 | { | ||
96 | local pver="$1" | ||
97 | local len | ||
98 | local value | ||
99 | local finalpver | ||
100 | |||
101 | # first run a basic char to int on argv | ||
102 | len=${#pver} | ||
103 | for ((x=0; x < len; x++)) | ||
104 | do | ||
105 | value="${pver:${x}:1}" | ||
106 | case ${value} in | ||
107 | a) value=".1.";; | ||
108 | b) value=".2.";; | ||
109 | c) value=".3.";; | ||
110 | d) value=".4.";; | ||
111 | e) value=".5.";; | ||
112 | f) value=".6.";; | ||
113 | g) value=".7.";; | ||
114 | h) value=".8.";; | ||
115 | i) value=".9.";; | ||
116 | j) value=".10.";; | ||
117 | k) value=".11.";; | ||
118 | l) value=".12.";; | ||
119 | m) value=".13.";; | ||
120 | n) value=".14.";; | ||
121 | o) value=".15.";; | ||
122 | p) value=".16.";; | ||
123 | q) value=".17.";; | ||
124 | r) value=".18.";; | ||
125 | s) value=".19.";; | ||
126 | t) value=".20.";; | ||
127 | u) value=".21.";; | ||
128 | v) value=".22.";; | ||
129 | w) value=".23.";; | ||
130 | x) value=".24.";; | ||
131 | y) value=".25.";; | ||
132 | z) value=".26.";; | ||
133 | _|-|\|) value=".0.";; | ||
134 | esac | ||
135 | |||
136 | # save new var | ||
137 | finalpver="${finalpver}${value}" | ||
138 | done | ||
139 | echo ${finalpver} | ||
140 | } | ||
141 | |||
142 | ## max_len string1 string2 | ||
143 | max_len() | ||
144 | { | ||
145 | local str1="$1" | ||
146 | local str2="$2" | ||
147 | local len1 | ||
148 | local len2 | ||
149 | |||
150 | # substitute spaces | ||
151 | str1=$(echo "${str1}" | sed "s:\ ::g") | ||
152 | str2=$(echo "${str2}" | sed "s:\ ::g") | ||
153 | |||
154 | # bash returns lenghts always +1 | ||
155 | len1=$(( ${#str1} -1 )) | ||
156 | len2=$(( ${#str2} -1 )) | ||
157 | |||
158 | if [[ ${len1} -ge ${len2} ]] | ||
159 | then | ||
160 | echo "${len1}" | ||
161 | else | ||
162 | echo "${len2}" | ||
163 | fi | ||
164 | } | ||
165 | |||
166 | is_higher() | ||
167 | { | ||
168 | local pver1="$1" | ||
169 | local pver2="$2" | ||
170 | local fpver | ||
171 | local fpver | ||
172 | local arr1 | ||
173 | local arr2 | ||
174 | local maxarrlen | ||
175 | local i | ||
176 | local x | ||
177 | |||
178 | # build to arrays with fixed pvers | ||
179 | niro | 1114 | fpver1=($(atoi ${pver1} | sed "s:\.:\ :g")) |
180 | fpver2=($(atoi ${pver2} | sed "s:\.:\ :g")) | ||
181 | niro | 486 | |
182 | niro | 1114 | maxarrlen=$(max_len "${fpver1[*]}" "${fpver2[*]}") |
183 | niro | 486 | |
184 | # now fill the rest with ZEROS | ||
185 | niro | 1114 | x=${#fpver1[*]} |
186 | niro | 486 | if [[ ${x} -lt ${maxarrlen} ]] |
187 | then | ||
188 | for (( i=x; i<maxarrlen;i++)) | ||
189 | do | ||
190 | niro | 1114 | fpver1[${i}]="0" |
191 | niro | 486 | done |
192 | fi | ||
193 | |||
194 | # now fill the rest with ZEROS | ||
195 | niro | 1114 | x=${#fpver2[*]} |
196 | niro | 486 | if [[ ${x} -lt ${maxarrlen} ]] |
197 | then | ||
198 | for (( i=x; i<maxarrlen;i++)) | ||
199 | do | ||
200 | niro | 1114 | fpver2[${i}]="0" |
201 | niro | 486 | done |
202 | fi | ||
203 | |||
204 | # now compare the to arrays | ||
205 | for ((i=0; i < ${maxarrlen}; i++)) | ||
206 | do | ||
207 | niro | 1121 | #if [[ ${fpver1[${i}]} -ne ${fpver2[${i}]} ]] |
208 | if [[ ${fpver1[${i}]} != ${fpver2[${i}]} ]] | ||
209 | niro | 486 | then |
210 | niro | 1121 | #if [[ ${fpver1[${i}]} -gt ${fpver2[${i}]} ]] |
211 | if [[ ${fpver1[${i}]} > ${fpver2[${i}]} ]] | ||
212 | niro | 486 | then |
213 | echo "${pver1}" | ||
214 | return | ||
215 | else | ||
216 | echo "${pver2}" | ||
217 | return | ||
218 | fi | ||
219 | fi | ||
220 | done | ||
221 | |||
222 | # both values are the same, so print the first | ||
223 | echo "${pver1}" | ||
224 | } | ||
225 | |||
226 | niro | 1114 | highest_pkg() |
227 | niro | 486 | { |
228 | local pname="$1" | ||
229 | local state="$2" | ||
230 | niro | 1114 | local retval |
231 | niro | 486 | |
232 | case ${state} in | ||
233 | stable) search="state='stable'" ;; | ||
234 | testing) search="state='stable' or state='testing'" ;; | ||
235 | unstable) search="state='stable' or state='testing' or state='unstable'" ;; | ||
236 | esac | ||
237 | |||
238 | for current in $(sql "select pver,pbuild from packages where pname='${pname}' and (${search})") | ||
239 | do | ||
240 | [[ x -eq 0 ]] && max="${current}" | ||
241 | max="$(is_higher ${current} ${max})" | ||
242 | ((x++)) | ||
243 | done | ||
244 | |||
245 | echo "${max}" | ||
246 | } | ||
247 | |||
248 | all_depends() | ||
249 | { | ||
250 | local pname="$1" | ||
251 | niro | 1121 | local pver="$2" |
252 | local pbuild="$3" | ||
253 | niro | 486 | |
254 | sql "select categories.pcat, | ||
255 | depends.pname, | ||
256 | depends.pver, | ||
257 | depends.pbuild | ||
258 | from depends | ||
259 | inner join packages | ||
260 | on depends.pkg_id=packages.id | ||
261 | and packages.pname='${pname}' | ||
262 | and packages.pver='${pver}' | ||
263 | and packages.pbuild='${pbuild}' | ||
264 | inner join categories | ||
265 | on depends.pcat_id=categories.id" | ||
266 | } | ||
267 | |||
268 | all_sdepends() | ||
269 | { | ||
270 | local pname="$1" | ||
271 | niro | 1121 | local pver="$2" |
272 | local pbuild="$3" | ||
273 | niro | 486 | |
274 | sql "select categories.pcat, | ||
275 | sdepends.pname, | ||
276 | sdepends.pver, | ||
277 | sdepends.pbuild | ||
278 | from sdepends | ||
279 | inner join packages | ||
280 | on sdepends.pkg_id=packages.id | ||
281 | and packages.pname='${pname}' | ||
282 | and packages.pver='${pver}' | ||
283 | and packages.pbuild='${pbuild}' | ||
284 | inner join categories | ||
285 | on sdepends.pcat_id=categories.id" | ||
286 | } | ||
287 | |||
288 | niro | 1114 | default_virtualname_to_pkgname() |
289 | { | ||
290 | local vcat="$1" | ||
291 | local vname="$2" | ||
292 | |||
293 | sql "select pcat,pname from virtual_defaults where vcat='${vcat}' and vname='${vname}'" | ||
294 | } | ||
295 | |||
296 | niro | 486 | # fetch_packages /path/to/mage/file1 /path/to/mage/file2 |
297 | fetch_packages() | ||
298 | { | ||
299 | niro | 1121 | local list=( $@ ) |
300 | niro | 486 | local pkg |
301 | local mirr | ||
302 | niro | 1121 | local item |
303 | niro | 486 | local md5file |
304 | local opt | ||
305 | local count_current | ||
306 | local count_total | ||
307 | local pname | ||
308 | local pver | ||
309 | local pbuild | ||
310 | |||
311 | niro | 1121 | [[ -z ${MIRRORS} ]] && die "You have no mirrors defined. Please edit your ${MAGERC}." |
312 | niro | 486 | |
313 | # get count of total packages | ||
314 | declare -i count_current=0 | ||
315 | declare -i count_total=0 | ||
316 | |||
317 | niro | 1121 | count_total="${#list[*]}" |
318 | niro | 486 | |
319 | niro | 1121 | for item in ${list[*]} |
320 | niro | 486 | do |
321 | niro | 1121 | pname="$(fullname2pname ${item})" |
322 | pver="$(fullname2pver ${item})" | ||
323 | pbuild="$(fullname2pbuild ${item})" | ||
324 | niro | 486 | pkg="${pname}-${pver}-${ARCH}-${pbuild}.${PKGSUFFIX}" |
325 | |||
326 | niro | 1114 | pkgtype=$(sql "select pkgtype from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") |
327 | niro | 486 | |
328 | (( count_current++ )) | ||
329 | xtitle "[ (${count_current}/${count_total}) Fetching ${pkg} ]" | ||
330 | |||
331 | # abort on virtual pkg | ||
332 | if [[ ${pkgtype} = virtual ]] | ||
333 | then | ||
334 | echo -ne " ${COLBLUE}---${COLDEFAULT}" | ||
335 | echo " !fetch virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... " | ||
336 | continue | ||
337 | fi | ||
338 | |||
339 | # abort on sources pkg | ||
340 | if [[ ${pkgtype} = sources ]] | ||
341 | then | ||
342 | echo -ne " ${COLBLUE}---${COLDEFAULT}" | ||
343 | echo " !fetch sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... " | ||
344 | continue | ||
345 | fi | ||
346 | |||
347 | # abort if already exist | ||
348 | if [ -f ${PKGDIR}/${pkg} ] | ||
349 | then | ||
350 | echo -ne " ${COLBLUE}***${COLDEFAULT}" | ||
351 | echo " fetch complete (${count_current}/${count_total}): ${pkg} ... " | ||
352 | continue | ||
353 | fi | ||
354 | |||
355 | for mirr in ${MIRRORS} | ||
356 | do | ||
357 | echo -ne " ${COLBLUE}***${COLDEFAULT}" | ||
358 | #echo -e " fetching (${count_current}/${count_total}): ${mirr}/${pkg} ... " | ||
359 | echo -e " fetching (${count_current}/${count_total}): ${pkg} ... " | ||
360 | [[ ${VERBOSE} = off ]] && opt="--quiet" | ||
361 | wget \ | ||
362 | --passive-ftp \ | ||
363 | --tries 3 \ | ||
364 | --continue \ | ||
365 | --progress bar \ | ||
366 | --directory-prefix=${PKGDIR} \ | ||
367 | ${opt} ${mirr}/${PACKAGES_SERVER_PATH}/${pkg} | ||
368 | if [[ $? = 0 ]] | ||
369 | then | ||
370 | break | ||
371 | else | ||
372 | continue | ||
373 | fi | ||
374 | done | ||
375 | |||
376 | if [ ! -f ${PKGDIR}/${pkg} ] | ||
377 | then | ||
378 | die "Could not download ${pkg}" | ||
379 | fi | ||
380 | done | ||
381 | |||
382 | # add a crlf for a better view | ||
383 | if [ ${count_total} -gt 1 ]; then echo; fi | ||
384 | } | ||
385 | |||
386 | niro | 1121 | md5sum_packages() |
387 | { | ||
388 | local list=( $@ ) | ||
389 | local item | ||
390 | local pcat | ||
391 | local pname | ||
392 | local pkgname | ||
393 | local pkgfile | ||
394 | local pkgtype | ||
395 | local count_current | ||
396 | local count_total | ||
397 | local pver | ||
398 | local pbuild | ||
399 | |||
400 | # get count of total packages | ||
401 | declare -i count_current=0 | ||
402 | declare -i count_total=0 | ||
403 | |||
404 | count_total="${#list[*]}" | ||
405 | |||
406 | for item in ${list[*]} | ||
407 | do | ||
408 | pcat=${item%%/*} | ||
409 | pname=$(fullname2pname ${item}) | ||
410 | pver=$(fullname2pver ${item}) | ||
411 | pbuild=$(fullname2pbuild ${item}) | ||
412 | |||
413 | pkgname="${pname}-${pver}-${ARCH}-${pbuild}" | ||
414 | pkgfile="${pkgname}.${PKGSUFFIX}" | ||
415 | pkgtype=$(sql "select pkgtype from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") | ||
416 | md5=$(sql "select packages_info.md5 from packages_info inner join packages on packages_info.pkg_id=packages.id where packages.pname='${pname}' and packages.pver='${pver}' and packages.pbuild='${pbuild}' and arch='${ARCH}'") | ||
417 | |||
418 | (( count_current++ )) | ||
419 | xtitle "[ (${count_current}/${count_total}) MD5SUM: ${pkgfile} ]" | ||
420 | |||
421 | # abort on virtual pkg | ||
422 | if [[ ${pkgtype} = virtual ]] | ||
423 | then | ||
424 | echo -ne " ${COLBLUE}---${COLDEFAULT}" | ||
425 | echo " !md5sum virtual (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... " | ||
426 | continue | ||
427 | fi | ||
428 | |||
429 | # abort on sources pkg | ||
430 | if [[ ${pkgtype} = sources ]] | ||
431 | then | ||
432 | echo -ne " ${COLBLUE}---${COLDEFAULT}" | ||
433 | echo " !md5sum sources (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... " | ||
434 | continue | ||
435 | fi | ||
436 | |||
437 | if [[ ! -z ${md5} ]] | ||
438 | then | ||
439 | echo -ne "${COLBLUE} *** ${COLDEFAULT}" | ||
440 | echo -ne "checking md5sum (${count_current}/${count_total}): " | ||
441 | ( cd ${PKGDIR}; md5sum --check << EOF ;)|| die "md5 for ${pkgfile} failed" | ||
442 | ${md5} ${pkgfile} | ||
443 | EOF | ||
444 | else | ||
445 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" | ||
446 | echo -e "!! no md5sum file found for ${pkgfile} :(" | ||
447 | fi | ||
448 | done | ||
449 | |||
450 | # add a crlf for a better view | ||
451 | if [ ${count_total} -gt 1 ]; then echo; fi | ||
452 | } | ||
453 | |||
454 | unpack_packages() | ||
455 | { | ||
456 | local list=( $@ ) | ||
457 | local item | ||
458 | local pkg | ||
459 | local pkgtype | ||
460 | local count_current | ||
461 | local count_total | ||
462 | |||
463 | # get count of total packages | ||
464 | declare -i count_current=0 | ||
465 | declare -i count_total=0 | ||
466 | |||
467 | count_total="${#list[*]}" | ||
468 | |||
469 | for item in ${list[*]} | ||
470 | do | ||
471 | pname=$(fullname2pname ${item}) | ||
472 | pver=$(fullname2pver ${item}) | ||
473 | pbuild=$(fullname2pbuild ${item}) | ||
474 | pkg="${pname}-${pver}-${ARCH}-${pbuild}.${PKGSUFFIX}" | ||
475 | pkgtype=$(sql "select pkgtype from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") | ||
476 | |||
477 | (( count_current++ )) | ||
478 | xtitle "[ (${count_current}/${count_total}) Unpacking ${pkg} ]" | ||
479 | |||
480 | # abort on virtual pkg | ||
481 | if [[ ${pkgtype} = virtual ]] | ||
482 | then | ||
483 | echo -ne " ${COLBLUE}---${COLDEFAULT}" | ||
484 | echo " !unpack virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... " | ||
485 | continue | ||
486 | fi | ||
487 | |||
488 | # abort on sources pkg | ||
489 | if [[ ${pkgtype} = sources ]] | ||
490 | then | ||
491 | echo -ne " ${COLBLUE}---${COLDEFAULT}" | ||
492 | echo " !unpack sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... " | ||
493 | continue | ||
494 | fi | ||
495 | |||
496 | echo -e " ${COLBLUE}***${COLDEFAULT} unpacking (${count_current}/${count_total}): ${pkg} ... " | ||
497 | tar xjmf ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}" | ||
498 | done | ||
499 | |||
500 | # add a crlf for a better view | ||
501 | if [ ${count_total} -gt 1 ]; then echo; fi | ||
502 | } | ||
503 | |||
504 | niro | 486 | mage_install() |
505 | { | ||
506 | # local all possible vars of a mage file | ||
507 | # to prevent bad issues | ||
508 | local PKGNAME | ||
509 | local STATE | ||
510 | local DESCRIPTION | ||
511 | local HOMEPAGE | ||
512 | local DEPEND | ||
513 | local SDEPEND | ||
514 | local PROVIDE | ||
515 | local PKGTYPE | ||
516 | local preinstall | ||
517 | local postinstall | ||
518 | local preremove | ||
519 | local postremove | ||
520 | |||
521 | local pcat | ||
522 | local pname | ||
523 | local pver | ||
524 | local pbuild | ||
525 | local count_total | ||
526 | local count_current | ||
527 | local magefile | ||
528 | local src_install | ||
529 | |||
530 | # very basic getops | ||
531 | for i in $* | ||
532 | do | ||
533 | case $1 in | ||
534 | --pcat|-c) shift; pcat="$1" ;; | ||
535 | --pname|-n) shift; pname="$1" ;; | ||
536 | --pver|-v) shift; pver="$1" ;; | ||
537 | --pbuild|-b) shift; pbuild="$1" ;; | ||
538 | --count-total) shift; count_total="$1" ;; | ||
539 | --count-current) shift; count_current="$1" ;; | ||
540 | --src-install|-s) shift; src_install=true ;; | ||
541 | esac | ||
542 | shift | ||
543 | done | ||
544 | |||
545 | # sanity checks; abort if not given | ||
546 | [ -z "${pcat}" ] && die "mage_install() \$pcat not given." | ||
547 | [ -z "${pname}" ] && die "mage_install() \$pname not given." | ||
548 | [ -z "${pver}" ] && die "mage_install() \$pver not given." | ||
549 | [ -z "${pbuild}" ] && die "mage_install() \$pbuild not given." | ||
550 | |||
551 | # check needed global vars | ||
552 | [ -z "${MAGEDIR}" ] && die "mage_install() \$MAGEDIR not set." | ||
553 | [ -z "${INSTALLDB}" ] && die "mage_install() \$INSTALLDB not set." | ||
554 | [ -z "${BUILDDIR}" ] && die "mage_install() \$BUILDDIR not set." | ||
555 | |||
556 | xtitle "[ (${count_current}/${count_total}) Installing ${pcat}/${pname}-${pver}-${pbuild} ]" | ||
557 | echo -ne "${COLBLUE} >>> ${COLDEFAULT}" | ||
558 | echo -n "installing (${count_current}/${count_total}): " | ||
559 | echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}" | ||
560 | echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}" | ||
561 | |||
562 | # magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage" | ||
563 | # source ${magefile} | ||
564 | PKGNAME="${pname}-${pver}-${ARCH}-${pbuild}" | ||
565 | |||
566 | # abort on sources if no srcinstall | ||
567 | if [[ ${PKGTYPE} = sources ]] && [[ ${src_install} != true ]] | ||
568 | then | ||
569 | echo | ||
570 | echo -e "This Package is a Source Package." | ||
571 | echo | ||
572 | echo -e "Only 'srcinstall' works with this type of packages" | ||
573 | echo -en "If you have done a srcinstall before, " | ||
574 | echo -e "you will find the files in /usr/src." | ||
575 | echo | ||
576 | exit 1 | ||
577 | fi | ||
578 | |||
579 | ## preinstall scripts | ||
580 | if [ -n "$(typeset -f preinstall)" ] | ||
581 | then | ||
582 | echo -e " ${COLBLUE}***${COLDEFAULT} running preinstall ... " | ||
583 | preinstall | ||
584 | unset preinstall | ||
585 | fi | ||
586 | |||
587 | if [[ ${src_install} = true ]] | ||
588 | then | ||
589 | local smage2file | ||
590 | niro | 1121 | local repository |
591 | niro | 486 | # check needed global vars |
592 | [ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not set." | ||
593 | [ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not set." | ||
594 | [ -z "${BINDIR}" ] && die "\$BINDIR not set." | ||
595 | |||
596 | # build the package first | ||
597 | if [[ ${MAGEDEBUG} = on ]] | ||
598 | then | ||
599 | echo M:${pname} | ||
600 | echo V:${pver} | ||
601 | echo B:${pbuild} | ||
602 | fi | ||
603 | niro | 1121 | repository=$(sql "select repositories.name from repositories |
604 | inner join packages | ||
605 | on packages.repo_id=repositories.id | ||
606 | where packages.pname='${pname}' | ||
607 | and packages.pver='${pver}' | ||
608 | and packages.pbuild='${pbuild}';") | ||
609 | smage2file=${SMAGESCRIPTSDIR}/${repository}/${pname}/${pname}-${pver}-${pbuild}.smage2 | ||
610 | niro | 486 | if [ -f "${smage2file}" ] |
611 | then | ||
612 | echo -e " ${COLBLUE}***${COLDEFAULT} building package from source ... " | ||
613 | smage2 ${smage2file} || die "compile failed" | ||
614 | else | ||
615 | echo | ||
616 | echo "$(basename ${SMAGEFILE}) not found." | ||
617 | echo "update your smage-tree and try it again." | ||
618 | echo | ||
619 | die | ||
620 | fi | ||
621 | fi | ||
622 | |||
623 | if [[ ${PKGTYPE} != virtual ]] && \ | ||
624 | [[ ${PKGTYPE} != sources ]] | ||
625 | then | ||
626 | echo -e " ${COLBLUE}***${COLDEFAULT} merging files into system ... " | ||
627 | build_doinstall ${PKGNAME} | ||
628 | fi | ||
629 | |||
630 | ## postinstall scripts | ||
631 | if [ -n "$(typeset -f postinstall)" ] | ||
632 | then | ||
633 | echo -e " ${COLBLUE}***${COLDEFAULT} running postinstall ... " | ||
634 | postinstall | ||
635 | unset postinstall | ||
636 | fi | ||
637 | |||
638 | # install a database entry | ||
639 | install_database_entry \ | ||
640 | --pcat "${pcat}" \ | ||
641 | --pname "${pname}" \ | ||
642 | --pver "${pver}" \ | ||
643 | --pbuild "${pbuild}" \ | ||
644 | --pkgname "${PKGNAME}" \ | ||
645 | --pkgtype "${PKGTYPE}" \ | ||
646 | || die "error in mage_install() running install_database_entry()." | ||
647 | |||
648 | # remove the package dir now | ||
649 | if [ -d ${BUILDDIR}/${PKGNAME} ] | ||
650 | then | ||
651 | rm -rf ${BUILDDIR}/${PKGNAME} | ||
652 | fi | ||
653 | |||
654 | # rebuilds toplevel info node | ||
655 | if [[ ${MAGE_INFO_REBUILD} = true ]] | ||
656 | then | ||
657 | echo -ne "${COLBLUE} *** ${COLDEFAULT}" | ||
658 | echo -n "rebuilding top-level info node ... " | ||
659 | ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \ | ||
660 | > ${MROOT}/usr/share/info/dir && \ | ||
661 | echo "done." || echo "failure." | ||
662 | unset MAGE_INFO_REBUILD | ||
663 | fi | ||
664 | |||
665 | # rebuilds the enviroment with the content of /etc/env.d | ||
666 | if [[ ${MAGE_ENV_REBUILD} = true ]] | ||
667 | then | ||
668 | echo -ne "${COLBLUE} *** ${COLDEFAULT}" | ||
669 | echo -n "rebuilding environment ... " | ||
670 | ${MLIBDIR}/env-rebuild.sh > /dev/null && \ | ||
671 | echo "done." || echo "failure." | ||
672 | unset MAGE_ENV_REBUILD | ||
673 | fi | ||
674 | |||
675 | xtitleclean | ||
676 | |||
677 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" | ||
678 | echo -n "package " | ||
679 | # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}" | ||
680 | # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} " | ||
681 | echo "successfully installed." | ||
682 | |||
683 | # unset these functions | ||
684 | unset -f preinstall | ||
685 | unset -f postinstall | ||
686 | unset -f preremove | ||
687 | unset -f postremove | ||
688 | } | ||
689 | |||
690 | install_packages() | ||
691 | { | ||
692 | local list="$@" | ||
693 | local pkg | ||
694 | local pcat | ||
695 | local pname | ||
696 | local pver | ||
697 | local pbuild | ||
698 | local total_pkgs | ||
699 | local current_pkg | ||
700 | local src_install | ||
701 | local uninstall_list | ||
702 | |||
703 | # check for --src-install | ||
704 | if [[ $1 = --src-install ]] | ||
705 | then | ||
706 | # remove --src-install from list | ||
707 | list=${list/--src-install/} | ||
708 | # enable src-install | ||
709 | src_install="--src-install" | ||
710 | fi | ||
711 | |||
712 | # reset MAGE_PROTECT_COUNTER | ||
713 | declare -i MAGE_PROTECT_COUNTER=0 | ||
714 | export MAGE_PROTECT_COUNTER | ||
715 | |||
716 | # get count of total packages | ||
717 | declare -i total_pkgs=0 | ||
718 | declare -i current_pkg=0 | ||
719 | for i in ${list}; do (( total_pkgs++ )); done | ||
720 | |||
721 | echo | ||
722 | |||
723 | if [[ -n ${MROOT} ]] | ||
724 | then | ||
725 | echo -ne ${COLRED} | ||
726 | echo "!! installing in MROOT=${MROOT}" | ||
727 | echo -ne ${COLDEFAULT} | ||
728 | echo | ||
729 | fi | ||
730 | |||
731 | for pkg in ${list} | ||
732 | do | ||
733 | (( current_pkg++ )) | ||
734 | #pcat=$(magename2pcat ${pkg}) | ||
735 | pcat="${pkg%%/*}" | ||
736 | pname=$(magename2pname ${pkg}) | ||
737 | pver=$(magename2pver ${pkg}) | ||
738 | pbuild=$(magename2pbuild ${pkg}) | ||
739 | |||
740 | mage_install \ | ||
741 | --pcat ${pcat} \ | ||
742 | --pname ${pname} \ | ||
743 | --pver ${pver} \ | ||
744 | --pbuild ${pbuild} \ | ||
745 | --count-total ${total_pkgs} \ | ||
746 | --count-current ${current_pkg} \ | ||
747 | ${src_install} | ||
748 | |||
749 | # check for allready installed packages and remove them | ||
750 | # except the package we have installed | ||
751 | uninstall_list="$(get_uninstall_candidates \ | ||
752 | --pcat "${pcat}" \ | ||
753 | --pname "${pname}" \ | ||
754 | --protected ${pcat}/${pname}-${pver}-${pbuild})" | ||
755 | |||
756 | # uninstall all packges in uninstall_list if not empty | ||
757 | if [ -n "${uninstall_list}" ] | ||
758 | then | ||
759 | echo | ||
760 | uninstall_packages ${uninstall_list} \ | ||
761 | || die "install_packges() uninstalling not-needed." | ||
762 | fi | ||
763 | |||
764 | # crlf for better view in VERBOSE mode | ||
765 | #if [[ ${VERBOSE} = on ]]; then echo; fi | ||
766 | echo | ||
767 | done | ||
768 | |||
769 | #echo "DEBUG MAGE_PROTECT_COUNTER=${MAGE_PROTECT_COUNTER}" | ||
770 | show_etc_update_mesg | ||
771 | } | ||
772 | |||
773 | uninstall_packages() | ||
774 | { | ||
775 | local list="$@" | ||
776 | local pcat | ||
777 | local pname | ||
778 | local pver | ||
779 | local pbuild | ||
780 | local can_pcat | ||
781 | local can_pname | ||
782 | local can_ver_list | ||
783 | |||
784 | if [[ -n ${MROOT} ]] | ||
785 | then | ||
786 | echo -ne ${COLRED} | ||
787 | echo "!! uninstalling from MROOT=${MROOT}" | ||
788 | echo -ne ${COLDEFAULT} | ||
789 | echo | ||
790 | fi | ||
791 | |||
792 | # generate a candidates list | ||
793 | for pkg in ${list} | ||
794 | do | ||
795 | #pcat=$(dep2pcat ${pkg}) | ||
796 | pcat="${pkg%%/*}" | ||
797 | pname=$(magename2pname ${pkg}) | ||
798 | pver=$(magename2pver ${pkg}) | ||
799 | pbuild=$(magename2pbuild ${pkg}) | ||
800 | can_pcat="${pcat}" | ||
801 | can_pname="${pname}" | ||
802 | |||
803 | if [ -z "${can_ver_list}" ] | ||
804 | then | ||
805 | can_ver_list=" ${pver}-${pbuild}" | ||
806 | else | ||
807 | can_ver_list="${can_ver_list}, ${pver}-${pbuild}" | ||
808 | fi | ||
809 | done | ||
810 | |||
811 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" | ||
812 | echo "following candidate(s) will be removed:" | ||
813 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" | ||
814 | echo -ne "${COLBOLD}${can_pcat}/${can_pname}:${COLDEFAULT}" | ||
815 | echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}" | ||
816 | echo | ||
817 | if [ ${MAGE_UNINSTALL_TIMEOUT} -gt 0 ] | ||
818 | then | ||
819 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" | ||
820 | echo "( Press [CTRL+C] to abort )" | ||
821 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" | ||
822 | echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..." | ||
823 | for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--)) | ||
824 | do | ||
825 | echo -ne "${COLRED} ${i}${COLDEFAULT}" | ||
826 | sleep 1 | ||
827 | done | ||
828 | echo | ||
829 | echo | ||
830 | fi | ||
831 | |||
832 | for pkg in ${list} | ||
833 | do | ||
834 | pcat=$(dep2pcat ${pkg}) | ||
835 | pname=$(magename2pname ${pkg}) | ||
836 | pver=$(magename2pver ${pkg}) | ||
837 | pbuild=$(magename2pbuild ${pkg}) | ||
838 | |||
839 | mage_uninstall \ | ||
840 | --pcat ${pcat} \ | ||
841 | --pname ${pname} \ | ||
842 | --pver ${pver} \ | ||
843 | --pbuild ${pbuild} \ | ||
844 | --count-total ${total_pkgs} \ | ||
845 | --count-current ${current_pkg} \ | ||
846 | ${src_install} | ||
847 | |||
848 | # crlf for better view in VERBOSE mode | ||
849 | #if [[ ${VERBOSE} = on ]]; then echo; fi | ||
850 | echo | ||
851 | done | ||
852 | } | ||
853 | |||
854 | is_installed() | ||
855 | { | ||
856 | local DBFILE | ||
857 | local pkgid | ||
858 | local pcat | ||
859 | local pname | ||
860 | local pbuild | ||
861 | local pver | ||
862 | |||
863 | # very basic getops | ||
864 | for i in $* | ||
865 | do | ||
866 | case $1 in | ||
867 | --pcat|-c) shift; pcat="$1" ;; | ||
868 | --pname|-n) shift; pname="$1" ;; | ||
869 | --pver|-v) shift; pver="$1" ;; | ||
870 | --pbuild|-b) shift; pbuild="$1" ;; | ||
871 | esac | ||
872 | shift | ||
873 | done | ||
874 | |||
875 | DBFILE="${MAGE_INSTALL_DB}" | ||
876 | pkgid=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") | ||
877 | |||
878 | [[ ! -z ${pkgid} ]] && return 0 | ||
879 | return 1 | ||
880 | } | ||
881 | |||
882 | reverse_depends() | ||
883 | { | ||
884 | local DBFILE | ||
885 | local pname="$1" | ||
886 | |||
887 | DBFILE="${MAGE_INSTALL_DB}" | ||
888 | sql "select categories.pcat, | ||
889 | packages.pname, | ||
890 | packages.pver, | ||
891 | packages.pbuild | ||
892 | from depends | ||
893 | inner join packages on packages.id=depends.pkg_id | ||
894 | inner join categories on categories.id=packages.pcat_id | ||
895 | where depends.pname='${pname}'" | ||
896 | } | ||
897 | |||
898 | reverse_sdepends() | ||
899 | { | ||
900 | local DBFILE | ||
901 | local pname="$1" | ||
902 | |||
903 | DBFILE="${MAGE_INSTALL_DB}" | ||
904 | sql "select categories.pcat, | ||
905 | packages.pname, | ||
906 | packages.pver, | ||
907 | packages.pbuild | ||
908 | from sdepends | ||
909 | inner join packages on packages.id=sdepends.pkg_id | ||
910 | inner join categories on categories.id=packages.pcat_id | ||
911 | where sdepends.pname='${pname}'" | ||
912 | } | ||
913 | |||
914 | create_database_layout() | ||
915 | { | ||
916 | sql "create table categories(id integer primary key, pcat text unique)" | ||
917 | sql "create table packages(id integer primary key, | ||
918 | pname text, | ||
919 | pver text, | ||
920 | pbuild text, | ||
921 | pcat_id numeric, | ||
922 | state text, | ||
923 | provide text, | ||
924 | pkgtype text | ||
925 | )" | ||
926 | sql "create table depends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" | ||
927 | sql "create table sdepends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" | ||
928 | sql "create table packages_info(id integer primary key, pkg_id numeric, arch text, md5 text, mtime numeric, homepage text, description text, size numeric)" | ||
929 | #sql "create table packages_content(id integer primary key, pkginfo_id numeric, char text, dirs text, files text, pipes text, symlinks text)" | ||
930 | sql "create table packages_content(id integer primary key, pkginfo_id numeric, char blob, dirs blob, files blob, pipes blob, symlinks blob)" | ||
931 | } | ||
932 | |||
933 | install_database_entry() | ||
934 | { | ||
935 | local pcat | ||
936 | local pname | ||
937 | local pver | ||
938 | local pbuild | ||
939 | local pkgtype | ||
940 | local pkgname | ||
941 | local magefile | ||
942 | local dbrecorddir | ||
943 | local provide | ||
944 | local homepage | ||
945 | local description | ||
946 | local pkgid | ||
947 | local depends | ||
948 | local sdepends | ||
949 | local relation | ||
950 | local depcatid | ||
951 | local depname | ||
952 | local depver | ||
953 | local depbuild | ||
954 | local mage_pkg_id | ||
955 | local i | ||
956 | local install_pkg_id | ||
957 | local table | ||
958 | |||
959 | # very basic getops | ||
960 | for i in $* | ||
961 | do | ||
962 | case $1 in | ||
963 | --pcat|-c) shift; pcat="$1" ;; | ||
964 | --pname|-n) shift; pname="$1" ;; | ||
965 | --pver|-v) shift; pver="$1" ;; | ||
966 | --pbuild|-b) shift; pbuild="$1" ;; | ||
967 | --pkgname|-a) shift; pkgname="$1" ;; | ||
968 | # --state|-s) shift; state="$1" ;; | ||
969 | --pkgtype|-t) shift; pkgtype="$1" ;; | ||
970 | esac | ||
971 | shift | ||
972 | done | ||
973 | |||
974 | # sanity checks; abort if not given | ||
975 | [[ -z ${pcat} ]] && die "install_database_entry() \$pcat not given." | ||
976 | [[ -z ${pname} ]] && die "install_database_entry() \$pname not given." | ||
977 | [[ -z ${pver} ]] && die "install_database_entry() \$pver not given." | ||
978 | [[ -z ${pbuild} ]] && die "install_database_entry() \$pbuild not given." | ||
979 | [[ -z ${pkgname} ]] && die "install_database_entry() \$pkgname not given." | ||
980 | # [[ -z ${state} ]] && die "install_database_entry() \$state not given." | ||
981 | |||
982 | # check needed global vars | ||
983 | [[ -z ${MAGEDIR} ]] && die "install_database_entry() \$MAGEDIR not set." | ||
984 | [[ -z ${INSTALLDB} ]] && die "install_database_entry() \$INSTALLDB not set." | ||
985 | |||
986 | # first of all convert pbuild to database format (remove the r) | ||
987 | niro | 1114 | pbuild="${pbuild}" |
988 | niro | 486 | |
989 | # check if | ||
990 | # copy all things over over | ||
991 | # mage.pkg_id | ||
992 | DBFILE="${MAGE_PACKAGES_DB}" | ||
993 | mage_pkg_id=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") | ||
994 | |||
995 | DBFILE="${MAGE_INSTALL_DB}" | ||
996 | # add pcat to installdb if missing | ||
997 | if [[ -z $(sql "select id from categories where pcat='${pcat}'") ]] | ||
998 | then | ||
999 | sql "insert into categories (pcat) values ('${pcat}')" | ||
1000 | fi | ||
1001 | |||
1002 | # attach install database | ||
1003 | # install.categories.id != main.categories.id !!! | ||
1004 | # so get pcat from pcat_id via inner join. | ||
1005 | # then query install db which id pcat has and use this one | ||
1006 | # final phase copies the whole crap to the install db | ||
1007 | # use some more rows to copy the whole table | ||
1008 | sqlite3 ${MAGE_PACKAGES_DB} \ | ||
1009 | "attach database '${MAGE_INSTALL_DB}' as install; | ||
1010 | insert into install.packages | ||
1011 | (pcat_id, | ||
1012 | pname, | ||
1013 | pver, | ||
1014 | pbuild, | ||
1015 | state, | ||
1016 | provide, | ||
1017 | pkgtype) | ||
1018 | select mage_id, | ||
1019 | main.packages.pname, | ||
1020 | main.packages.pver, | ||
1021 | main.packages.pbuild, | ||
1022 | main.packages.state, | ||
1023 | main.packages.provide, | ||
1024 | main.packages.pkgtype | ||
1025 | from main.packages, | ||
1026 | (select id as mage_id | ||
1027 | from install.categories where pcat=( | ||
1028 | select pcat from main.packages | ||
1029 | inner join main.categories | ||
1030 | on main.categories.id=main.packages.pcat_id | ||
1031 | where main.packages.id='${mage_pkg_id}') | ||
1032 | ) | ||
1033 | where main.packages.id=${mage_pkg_id};" | ||
1034 | |||
1035 | # get install db pkg_id | ||
1036 | install_pkg_id=$(sql "select max(id) from packages") | ||
1037 | |||
1038 | # now copy dependencies | ||
1039 | # replace pkg with the one from insatll.db | ||
1040 | for table in depends sdepends | ||
1041 | do | ||
1042 | sqlite3 ${MAGE_PACKAGES_DB} \ | ||
1043 | "attach database '${MAGE_INSTALL_DB}' as install; | ||
1044 | insert into install.${table} | ||
1045 | (pkg_id, | ||
1046 | relation, | ||
1047 | pcat_id, | ||
1048 | pname, | ||
1049 | pver, | ||
1050 | pbuild) | ||
1051 | select '${install_pkg_id}', | ||
1052 | relation, | ||
1053 | pcat_id, | ||
1054 | pname, | ||
1055 | pver, | ||
1056 | pbuild | ||
1057 | from main.${table} where pkg_id='${mage_pkg_id}'" | ||
1058 | done | ||
1059 | |||
1060 | # and now the package infos | ||
1061 | sqlite3 ${MAGE_PACKAGES_DB} \ | ||
1062 | "attach database '${MAGE_INSTALL_DB}' as install; | ||
1063 | insert into install.packages_info | ||
1064 | (pkg_id, | ||
1065 | arch, | ||
1066 | md5, | ||
1067 | mtime, | ||
1068 | homepage, | ||
1069 | description, | ||
1070 | size) | ||
1071 | select '${install_pkg_id}', | ||
1072 | arch, | ||
1073 | md5, | ||
1074 | mtime, | ||
1075 | homepage, | ||
1076 | description, | ||
1077 | size | ||
1078 | from main.packages_info | ||
1079 | where pkg_id='${mage_pkg_id}' and arch='${ARCH}'" | ||
1080 | |||
1081 | # now install PKGTYPE specific files | ||
1082 | case ${pkgtype} in | ||
1083 | virtual) echo ;; | ||
1084 | sources) echo ;; | ||
1085 | *) | ||
1086 | # and finally the package_content | ||
1087 | # but we first need to know the pkg_info id | ||
1088 | # because of the arch dependency | ||
1089 | pkg_info_id=$(sql "select max(id) from packages_info") | ||
1090 | |||
1091 | sql "insert into packages_content | ||
1092 | (pkginfo_id, | ||
1093 | char, | ||
1094 | dirs, | ||
1095 | files, | ||
1096 | pipes, | ||
1097 | symlinks) | ||
1098 | values('${pkg_info_id}', | ||
1099 | 'records/${pkg_info_id}/char.bz2', | ||
1100 | 'records/${pkg_info_id}/dirs.bz2', | ||
1101 | 'records/${pkg_info_id}/files.bz2', | ||
1102 | 'records/${pkg_info_id}/pipes.bz2', | ||
1103 | 'records/${pkg_info_id}/symlinks.bz2')" | ||
1104 | # create compressed content files | ||
1105 | niro | 1114 | entrydir=${BUILDDIR}/${pname}-${pver}-${ARCH}-${pbuild} |
1106 | niro | 486 | local entryfile |
1107 | for entryfile in char dirs files pipes symlinks | ||
1108 | do | ||
1109 | install -d $(dirname ${MAGE_INSTALL_DB})/records/${pkg_info_id} | ||
1110 | cat ${entrydir}/.${entryfile} | bzip2 -9 >> $(dirname ${MAGE_INSTALL_DB})/records/${pkg_info_id}/${entryfile}.bz2 | ||
1111 | done | ||
1112 | ;; | ||
1113 | esac | ||
1114 | } |