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