Annotation of /tags/mage-0_4_113/usr/lib/mage/convert_databases_meta.sh
Parent Directory | Revision Log
Revision 1642 -
(hide annotations)
(download)
(as text)
Fri Jan 13 18:37:52 2012 UTC (12 years, 8 months ago) by niro
Original Path: trunk/mage/usr/lib/mage/convert_databases_meta.sh
File MIME type: application/x-sh
File size: 13022 byte(s)
Fri Jan 13 18:37:52 2012 UTC (12 years, 8 months ago) by niro
Original Path: trunk/mage/usr/lib/mage/convert_databases_meta.sh
File MIME type: application/x-sh
File size: 13022 byte(s)
-honor the PCATEGORIE deprecation and make the scripts work with the latest changes to smage/mage
1 | niro | 491 | #!/bin/bash |
2 | |||
3 | niro | 1642 | : ${MAGERC="/etc/mage.rc"} |
4 | |||
5 | niro | 491 | source /etc/mage.rc.global |
6 | niro | 1642 | source ${MAGERC} |
7 | source ${MLIBDIR}/mage4.functions.sh | ||
8 | source ${MLIBDIR}/smage2.functions.sh | ||
9 | niro | 491 | |
10 | #### fixups #### | ||
11 | METADIR=/var/cache/mage/meta | ||
12 | ################# | ||
13 | |||
14 | source ${MLIBDIR}/sql_functions.sh | ||
15 | |||
16 | die() | ||
17 | { | ||
18 | echo -e "Exited ${BASH_SOURCE} at line no ${BASH_LINENO}." | ||
19 | echo -e "$@" | ||
20 | exit 1 | ||
21 | } | ||
22 | |||
23 | sql() | ||
24 | { | ||
25 | local sqlcmd="$*" | ||
26 | [[ -z ${sqlcmd} ]] && die "no sqlcmd given." | ||
27 | |||
28 | sqlite3 -nullvalue 'NULL' -list -separator '|' ${DBFILE} << EOF || die "error running '$@'" | ||
29 | ${sqlcmd}; | ||
30 | EOF | ||
31 | } | ||
32 | |||
33 | create_database_layout() | ||
34 | { | ||
35 | sql "create table categories(id integer primary key, pcat text unique)" | ||
36 | sql "create table packages(id integer primary key, | ||
37 | pname text, | ||
38 | pver text, | ||
39 | pbuild text, | ||
40 | pcat_id numeric, | ||
41 | state text, | ||
42 | provide text, | ||
43 | pkgtype text | ||
44 | )" | ||
45 | sql "create table depends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" | ||
46 | sql "create table sdepends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" | ||
47 | sql "create table packages_info(id integer primary key, pkg_id numeric, arch text, md5 text, mtime numeric, homepage text, description text, size numeric)" | ||
48 | #sql "create table packages_content(id integer primary key, pkginfo_id numeric, char text, dirs text, files text, pipes text, symlinks text)" | ||
49 | sql "create table packages_content(id integer primary key, pkginfo_id numeric, char blob, dirs blob, files blob, pipes blob, symlinks blob)" | ||
50 | sql "create table packages_routines(id integer primary key, | ||
51 | pkg_id numeric, | ||
52 | mincludes text, | ||
53 | preinstall numeric, | ||
54 | postinstall numeric, | ||
55 | preremove numeric, | ||
56 | postremove numeric, | ||
57 | script text)" | ||
58 | } | ||
59 | |||
60 | convert_meta_db() | ||
61 | { | ||
62 | local i | ||
63 | local magefile | ||
64 | local pcat | ||
65 | local pname | ||
66 | local pver | ||
67 | local pbuild | ||
68 | local pcatid | ||
69 | local state | ||
70 | local pkgid | ||
71 | local dep | ||
72 | local descriptiom | ||
73 | local homepage | ||
74 | local provide | ||
75 | local pkgtype | ||
76 | local preinstall | ||
77 | local postinstall | ||
78 | local preremove | ||
79 | local postremove | ||
80 | local sym | ||
81 | local depname | ||
82 | local depver | ||
83 | local depbuild | ||
84 | local depcat | ||
85 | local depcatid | ||
86 | local md5file | ||
87 | local md5sum | ||
88 | |||
89 | # create categories | ||
90 | cat ${SMAGESCRIPTSDIR}/.known_categories | while read pcat | ||
91 | do | ||
92 | case ${pcat} in | ||
93 | include|profiles) continue;; | ||
94 | esac | ||
95 | |||
96 | sql "insert into categories (pcat) values('${pcat}')" | ||
97 | done | ||
98 | |||
99 | # create packages | ||
100 | for pkg in $(find ${METADIR} -mindepth 2 -maxdepth 2 -type d | sort) | ||
101 | do | ||
102 | case ${DEBUG} in | ||
103 | 1|true) echo "converting ${pkg}" ;; | ||
104 | esac | ||
105 | pcat="$(sed -n '2p' ${pkg}/meta)" | ||
106 | pname="$(sed -n '1p' ${pkg}/meta)" | ||
107 | pver="$(sed -n '3p' ${pkg}/meta)" | ||
108 | pbuild="$(sed -n '4p' ${pkg}/meta)" | ||
109 | state="$(sed -n '5p' ${pkg}/meta)" | ||
110 | [[ -f ${pkg}/provides ]] && provide="$(< ${pkg}/provides)" | ||
111 | pkgtype="$(sed -n '8p' ${pkg}/meta)" | ||
112 | |||
113 | pcatid=$(sql "select id from categories where pcat='${pcat}'") | ||
114 | sql "insert into packages(pname, pver, pbuild, pcat_id, state, provide, pkgtype ) | ||
115 | values('${pname}','${pver}','${pbuild}','${pcatid}','${state}','${provide}','${pkgtype}')" | ||
116 | |||
117 | pkgid=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") | ||
118 | |||
119 | if [[ -f ${pkg}/depend ]] | ||
120 | then | ||
121 | # depends | ||
122 | while read sym dep | ||
123 | do | ||
124 | [[ -z ${dep} ]] && continue | ||
125 | depcat="$(dep2pcat ${dep})" | ||
126 | depcatid=$(sql "select id from categories where pcat='${depcat}'") | ||
127 | depname="$(dep2pname ${dep})" | ||
128 | depver="$(dep2pver ${dep})" | ||
129 | sql "insert into depends(pkg_id, relation, pcat_id, pname, pver, pbuild) | ||
130 | values('${pkgid}', '${sym}', '${depcatid}', '${depname}', '${depver}', '${depbuild}')" | ||
131 | done << EOF | ||
132 | $(<${pkg}/depend) | ||
133 | EOF | ||
134 | fi | ||
135 | |||
136 | if [[ -f ${pkg}/sdepend ]] | ||
137 | then | ||
138 | # sdepends | ||
139 | while read sym dep | ||
140 | do | ||
141 | [[ -z ${dep} ]] && continue | ||
142 | depcat="$(dep2pcat ${dep})" | ||
143 | depcatid=$(sql "select id from categories where pcat='${depcat}'") | ||
144 | depname="$(dep2pname ${dep})" | ||
145 | depver="$(dep2pver ${dep})" | ||
146 | sql "insert into sdepends(pkg_id, relation, pcat_id, pname, pver, pbuild) | ||
147 | values('${pkgid}', '${sym}', '${depcatid}', '${depname}', '${depver}', '${depbuild}')" | ||
148 | done << EOF | ||
149 | $(<${pkg}/sdepend) | ||
150 | EOF | ||
151 | fi | ||
152 | |||
153 | for arch in i686 x86_64 | ||
154 | do | ||
155 | if [[ -f ${pkg}/${arch}/desc ]] | ||
156 | then | ||
157 | md5sum="$(sed -n '1p' ${pkg}/${arch}/desc)" | ||
158 | mtime="$(sed -n '3p' ${pkg}/${arch}/desc)" | ||
159 | size="$(sed -n '2p' ${pkg}/${arch}/desc)" | ||
160 | fi | ||
161 | |||
162 | # fix descriptions | ||
163 | description="$(sed -n '6p' ${pkg}/meta | sed s:\':\'\':g)" | ||
164 | homepage="$(sed -n '7p' ${pkg}/meta)" | ||
165 | |||
166 | sql "insert into packages_info(pkg_id, arch, md5, description, homepage, mtime, size) | ||
167 | values('${pkgid}','${arch}','${md5sum}','${description}','${homepage}','${mtime}','${size}')" | ||
168 | done | ||
169 | |||
170 | # id, pkg_id, arch, md5, mtime, homepage, description, size | ||
171 | |||
172 | |||
173 | mincludes="$(sed -n '10p' ${pkg}/meta)" | ||
174 | |||
175 | # | ||
176 | # install routines & includes | ||
177 | # | ||
178 | # # needs special magic: the last line of typeset has no ';' | ||
179 | # # but to eval the function we must append it | ||
180 | # # so this sed deletes the last line of the typeset output | ||
181 | # # and replaces it with an ;} and a newline between | ||
182 | # # | ||
183 | # # but we will not add this fun when no postinstall etc are given | ||
184 | # # -> [[ -n $(typeset -f postinstall ]] && | ||
185 | # # | ||
186 | # # also the character ' is a problem while importing to sql | ||
187 | # # because we use ' as escape char. so we replace it with '' | ||
188 | # # | ||
189 | # # $([[ -n $(typeset -f postinstall) ]] && echo -e "$(typeset -f postinstall | sed s:\':\'\':g | sed '$d');\n}") | ||
190 | # # | ||
191 | # sql "insert into packages_routines(pkg_id, | ||
192 | # mincludes, | ||
193 | # postinstall, | ||
194 | # preinstall, | ||
195 | # preremove, | ||
196 | # postremove) | ||
197 | # values('${pkgid}', | ||
198 | # '${mincludes}', | ||
199 | # '$([[ -n $(typeset -f postinstall) ]] && echo -e "$(typeset -f postinstall | sed s:\':\'\':g | sed '$d');\n}")', | ||
200 | # '$([[ -n $(typeset -f preinstall) ]] && echo -e "$(typeset -f preinstall | sed s:\':\'\':g | sed '$d');\n}")', | ||
201 | # '$([[ -n $(typeset -f preremove) ]] && echo -e "$(typeset -f preremove | sed s:\':\'\':g | sed '$d');\n}")', | ||
202 | # '$([[ -n $(typeset -f postremove) ]] && echo -e "$(typeset -f postremove | sed s:\':\'\':g | sed '$d');\n}")')" | ||
203 | |||
204 | local do_preinst=0 | ||
205 | local do_postinst=0 | ||
206 | local do_prerm=0 | ||
207 | local do_postrm=0 | ||
208 | local do_script=0 | ||
209 | local script="" | ||
210 | |||
211 | [[ -f ${pkg}/preinstall ]] && do_preinst=1 && do_script=1 | ||
212 | [[ -f ${pkg}/postinstall ]] && do_postinst=1 && do_script=1 | ||
213 | [[ -f ${pkg}/preremove ]] && do_prerm=1 && do_script=1 | ||
214 | [[ -f ${pkg}/postremove ]] && do_postrm=1 && do_script=1 | ||
215 | |||
216 | if [[ ${do_script} = 1 ]] | ||
217 | then | ||
218 | script="$(basename ${DBFILE} .sql).routines/${pkgid}/routines.sh" | ||
219 | install -d $(dirname ${DBFILE})/$(dirname ${script}) | ||
220 | cat ${pkg}/routines.sh > $(dirname ${DBFILE})/${script} | ||
221 | chmod 0755 $(dirname ${DBFILE})/${script} | ||
222 | fi | ||
223 | |||
224 | sql "insert into packages_routines(pkg_id, | ||
225 | mincludes, | ||
226 | postinstall, | ||
227 | preinstall, | ||
228 | preremove, | ||
229 | postremove, | ||
230 | script) | ||
231 | values('${pkgid}', | ||
232 | '${INHERITS}', | ||
233 | '${do_postinst}', | ||
234 | '${do_preinst}', | ||
235 | '${do_prerm}', | ||
236 | '${do_postrm}', | ||
237 | '${script}')" | ||
238 | |||
239 | unset state | ||
240 | unset pkgtype | ||
241 | unset md5sum | ||
242 | unset mtime | ||
243 | unset size | ||
244 | unset description | ||
245 | unset mincludes | ||
246 | unset pname | ||
247 | unset pver | ||
248 | unset pbuild | ||
249 | unset preinstall | ||
250 | unset postinstall | ||
251 | unset preremove | ||
252 | unset postremove | ||
253 | done | ||
254 | } | ||
255 | |||
256 | |||
257 | convert_install_db() | ||
258 | { | ||
259 | local i | ||
260 | local magefile | ||
261 | local pcat | ||
262 | local pname | ||
263 | local pver | ||
264 | local pbuild | ||
265 | local pcatid | ||
266 | local state | ||
267 | local preinstall | ||
268 | local postinstall | ||
269 | local preremove | ||
270 | local postremove | ||
271 | local pkgid | ||
272 | local dep | ||
273 | local PKGNAME | ||
274 | local STATE | ||
275 | local DESCRIPTION | ||
276 | local HOMEPAGE | ||
277 | local DEPEND | ||
278 | local SDEPEND | ||
279 | local PROVIDE | ||
280 | local PKGTYPE | ||
281 | local preinstall | ||
282 | local postinstall | ||
283 | local preremove | ||
284 | local postremove | ||
285 | local sym | ||
286 | local depname | ||
287 | local depver | ||
288 | local depbuild | ||
289 | local depcat | ||
290 | local depcatid | ||
291 | local md5file | ||
292 | local md5sum | ||
293 | local pkginfoid | ||
294 | local entrydir | ||
295 | |||
296 | # create categories | ||
297 | for i in virtual ${INSTALLDB}/* | ||
298 | do | ||
299 | pcat="$(basename ${i})" | ||
300 | case ${pcat} in | ||
301 | include|profiles) continue;; | ||
302 | esac | ||
303 | |||
304 | sql "insert into categories (pcat) values('${pcat}')" | ||
305 | done | ||
306 | |||
307 | # create packages | ||
308 | for magefile in $(find ${INSTALLDB} -type f -name *.mage| sort) | ||
309 | do | ||
310 | case ${DEBUG} in | ||
311 | 1|true) echo "converting ${magefile}" ;; | ||
312 | esac | ||
313 | |||
314 | pcat="$(magename2pcat ${magefile})" | ||
315 | pname="$(magename2pname ${magefile})" | ||
316 | pver="$(magename2pver ${magefile})" | ||
317 | pbuild="$(magename2pbuild ${magefile})" | ||
318 | # substitute r from pbuild | ||
319 | pbuild="${pbuild/r/}" | ||
320 | |||
321 | niro | 1642 | smagesource ${magefile} |
322 | niro | 491 | |
323 | pcatid=$(sql "select id from categories where pcat='${pcat}'") | ||
324 | sql "insert into packages( | ||
325 | pname, | ||
326 | pver, | ||
327 | pbuild, | ||
328 | pcat_id, | ||
329 | state, | ||
330 | provide, | ||
331 | pkgtype | ||
332 | ) | ||
333 | values( | ||
334 | '${pname}', | ||
335 | '${pver}', | ||
336 | '${pbuild}', | ||
337 | '${pcatid}', | ||
338 | '${STATE}', | ||
339 | '${PROVIDE}', | ||
340 | '${PKGTYPE}' | ||
341 | )" | ||
342 | |||
343 | pkgid=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") | ||
344 | # depends | ||
345 | while read sym dep | ||
346 | do | ||
347 | [[ -z ${dep} ]] && continue | ||
348 | depcat="$(dep2pcat ${dep})" | ||
349 | depcatid=$(sql "select id from categories where pcat='${depcat}'") | ||
350 | depname="$(dep2pname ${dep})" | ||
351 | depver="$(dep2pver ${dep})" | ||
352 | sql "insert into depends(pkg_id, | ||
353 | relation, | ||
354 | pcat_id, | ||
355 | pname, | ||
356 | pver, | ||
357 | pbuild) | ||
358 | values('${pkgid}', | ||
359 | '${sym}', | ||
360 | '${depcatid}', | ||
361 | '${depname}', | ||
362 | '${depver}', | ||
363 | '${depbuild}')" | ||
364 | done << EOF | ||
365 | ${DEPEND} | ||
366 | EOF | ||
367 | # sdepends | ||
368 | while read sym dep | ||
369 | do | ||
370 | [[ -z ${dep} ]] && continue | ||
371 | depcat="$(dep2pcat ${dep})" | ||
372 | depcatid=$(sql "select id from categories where pcat='${depcat}'") | ||
373 | depname="$(dep2pname ${dep})" | ||
374 | depver="$(dep2pver ${dep})" | ||
375 | sql "insert into sdepends(pkg_id, | ||
376 | relation, | ||
377 | pcat_id, | ||
378 | pname, | ||
379 | pver, | ||
380 | pbuild) | ||
381 | values('${pkgid}', | ||
382 | '${sym}', | ||
383 | '${depcatid}', | ||
384 | '${depname}', | ||
385 | '${depver}', | ||
386 | '${depbuild}')" | ||
387 | done << EOF | ||
388 | ${SDEPEND} | ||
389 | EOF | ||
390 | |||
391 | DESCRIPTION="$(echo ${DESCRIPTION} | sed s:\':\'\':g)" | ||
392 | sql "insert into packages_info(pkg_id, arch, md5, description, homepage) | ||
393 | values('${pkgid}','${ARCH}','${md5sum}','${DESCRIPTION}','${HOMEPAGE}')" | ||
394 | |||
395 | |||
396 | # install routines & includes | ||
397 | sql "insert into packages_routines(pkg_id, | ||
398 | mincludes, | ||
399 | postinstall, | ||
400 | preinstall, | ||
401 | preremove, | ||
402 | postremove) | ||
403 | values('${pkgid}', | ||
404 | '${mincludes}', | ||
405 | '$(typeset -f postinstall | sed s:\':\'\':g)', | ||
406 | '$(typeset -f preinstall | sed s:\':\'\':g)', | ||
407 | '$(typeset -f preremove | sed s:\':\'\':g)', | ||
408 | '$(typeset -f postremove | sed s:\':\'\':g)')" | ||
409 | |||
410 | #### #### | ||
411 | # record contents # | ||
412 | #### #### | ||
413 | pkginfoid=$(sql "select id from packages_info where pkg_id='${pkgid}' and arch='${ARCH}'") | ||
414 | entrydir="$(dirname ${magefile})" | ||
415 | # sql "insert into packages_content(pkginfo_id, | ||
416 | # char, | ||
417 | # dirs, | ||
418 | # files, | ||
419 | # pipes, | ||
420 | # symlinks) | ||
421 | # values('${pkginfoid}', | ||
422 | # '$(< ${entrydir}/.char)', | ||
423 | # '$(< ${entrydir}/.dirs)', | ||
424 | # '$(< ${entrydir}/.files)', | ||
425 | # '$(< ${entrydir}/.pipes)', | ||
426 | # '$(< ${entrydir}/.symlinks)')" | ||
427 | sql "insert into packages_content(pkginfo_id, | ||
428 | char, | ||
429 | dirs, | ||
430 | files, | ||
431 | pipes, | ||
432 | symlinks) | ||
433 | values('${pkginfoid}', | ||
434 | 'records/${pkginfoid}/char.bz2', | ||
435 | 'records/${pkginfoid}/dirs.bz2', | ||
436 | 'records/${pkginfoid}/files.bz2', | ||
437 | 'records/${pkginfoid}/pipes.bz2', | ||
438 | 'records/${pkginfoid}/symlinks.bz2')" | ||
439 | # create compressed content files | ||
440 | local entryfile | ||
441 | for entryfile in char dirs files pipes symlinks | ||
442 | do | ||
443 | install -d $(dirname ${DBFILE})/records/${pkginfoid} | ||
444 | cat ${entrydir}/.${entryfile} | bzip2 -9 >> $(dirname ${DBFILE})/records/${pkginfoid}/${entryfile}.bz2 | ||
445 | done | ||
446 | |||
447 | unset PKGNAME | ||
448 | unset DEPEND | ||
449 | unset SDEPEND | ||
450 | unset PROVIDE | ||
451 | |||
452 | # unset these functions | ||
453 | unset -f preinstall | ||
454 | unset -f postinstall | ||
455 | unset -f preremove | ||
456 | unset -f postremove | ||
457 | done | ||
458 | } | ||
459 | |||
460 | convert_virtual_defaults() | ||
461 | { | ||
462 | local virtual | ||
463 | local package | ||
464 | local vcat | ||
465 | local vname | ||
466 | local pcat | ||
467 | local pname | ||
468 | |||
469 | sql "create table virtual_defaults(id integer primary key, vcat text,vname text, pcat text, pname text)" | ||
470 | |||
471 | while read virtual package | ||
472 | do | ||
473 | vcat="$(dirname ${virtual})" | ||
474 | vname="$(basename ${virtual})" | ||
475 | pcat="$(dirname ${package})" | ||
476 | pname="$(basename ${package})" | ||
477 | |||
478 | sql "insert into virtual_defaults(vcat,vname,pcat,pname) values('${vcat}','${vname}','${pcat}','${pname}')" | ||
479 | done < /etc/mage-profile/virtuals.defaults | ||
480 | } | ||
481 | |||
482 | |||
483 | # packages db | ||
484 | #DBFILE=/home/tjoke/DATABASES/mage6.sql | ||
485 | #create_database_layout | ||
486 | #convert_mage_db | ||
487 | |||
488 | # virtual default | ||
489 | #DBFILE=/home/tjoke/DATABASES/virtuals6.sql | ||
490 | #convert_virtual_defaults | ||
491 | |||
492 | # # install db | ||
493 | # DBFILE=/home/tjoke/DATABASES/install6.sql | ||
494 | # create_database_layout | ||
495 | # convert_install_db | ||
496 | |||
497 | |||
498 | METHOD="$1" | ||
499 | DBFILE="$2" | ||
500 | |||
501 | [[ -z ${METHOD} ]] && die "No method given. Use --install, --packages or --virtual for your appropiate task" | ||
502 | [[ -z ${DBFILE} ]] && die "No database given." | ||
503 | |||
504 | case $1 in | ||
505 | --install|-i) | ||
506 | create_database_layout | ||
507 | convert_install_db | ||
508 | ;; | ||
509 | --packages|-p) | ||
510 | create_database_layout | ||
511 | convert_meta_db | ||
512 | ;; | ||
513 | --virtuals|-v) | ||
514 | convert_virtual_defaults | ||
515 | ;; | ||
516 | *) die "Unkown method." ;; | ||
517 | esac |