Magellan Linux

Annotation of /trunk/mage/usr/lib/mage/convert_databases_meta.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1642 - (hide annotations) (download) (as text)
Fri Jan 13 18:37:52 2012 UTC (12 years, 4 months ago) by niro
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