Magellan Linux

Diff of /branches/mage-next/src/mage4.functions.sh.in

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 226 by niro, Fri Sep 9 16:35:46 2005 UTC revision 2156 by niro, Wed Aug 14 07:25:43 2013 UTC
# Line 1  Line 1 
1  #!/bin/bash  #!/bin/bash
2  # Magellan Linux Installer Functions (mage.functions.sh)  # Magellan Linux Installer Functions (mage.functions.sh)
3  # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions.sh,v 1.1 2005-09-09 16:35:38 niro Exp $  # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions.sh,v 1.38 2008-10-05 10:32:24 niro Exp $
4    
5    COLRED="\033[1;6m\033[31m"
6    COLGREEN="\033[1;6m\033[32m"
7    COLYELLOW="\033[1;6m\033[33m"
8    COLBLUE="\033[1;6m\033[34m"
9    COLMAGENTA="\033[1;6m\033[35m"
10    COLWHITE="\033[1;6m\033[37m"
11    COLGRAY="\033[0;6m\033[37m"
12    COLBOLD="\033[1m"
13    COLDEFAULT="\033[0m"
14    
15    if [[ ${NOCOLORS} = true ]]
16    then
17     COLRED=""
18     COLGREEN=""
19     COLYELLOW=""
20     COLBLUE=""
21     COLMAGENTA=""
22     COLWHITE=""
23     COLGRAY=""
24     COLBOLD=""
25     COLDEFAULT=""
26    fi
27    
28  mage_setup()  mage_setup()
29  {  {
# Line 15  mage_setup() Line 38  mage_setup()
38   return 0   return 0
39  }  }
40    
41    mchecksum()
42    {
43     local i
44     local rundir
45     local file
46     local method
47     local cmd
48     local retval
49    
50     # very basic getops
51     for i in $*
52     do
53     case $1 in
54     --rundir|-r) shift; rundir="$1" ;;
55     --file|-f) shift; file="$1" ;;
56     --method|-m) shift; method="$1" ;;
57     esac
58     shift
59     done
60    
61     # sanity checks
62     [[ -z ${rundir} ]] && die "mchecksum(): rundir missing"
63     [[ -z ${file} ]] && die "mchecksum(): file missing"
64     [[ -z ${method} ]] && die "mchecksum(): method missing"
65    
66     case ${method} in
67     md5) cmd="md5sum" ;;
68     sha256) cmd="sha256sum" ;;
69     *) die "mchecksum(): unknown method '${method}'" ;;
70     esac
71    
72     if [[ -d ${rundir} ]]
73     then
74     pushd ${rundir} &> /dev/null
75     # be verbose here
76     ${cmd} -c ${file} #&> /dev/null
77     retval="$?"
78     popd &> /dev/null
79     else
80     retval=1
81     fi
82    
83     return "${retval}"
84    }
85    
86    mcheckemptydir()
87    {
88     local dir="$1"
89     local retval=1
90    
91     if [[ ! -d ${dir} ]]
92     then
93     echo "mcheckemptydir(): '${dir}' is not a directory!"
94     retval=3
95     else
96     shopt -s nullglob dotglob
97     files=( ${dir}/* )
98     (( ${#files[*]} )) || retval=0
99     shopt -u nullglob dotglob
100     fi
101    
102     return ${retval}
103    }
104    
105    unpack_package()
106    {
107     local magefile="$1"
108     local pkg
109     local pkgtype
110     local tar_opts
111    
112     pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
113     pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
114    
115     xtitle "[ Unpacking ${pkg} ]"
116    
117     # abort on virtual pkg
118     if [[ ${pkgtype} = virtual ]]
119     then
120     echo -ne " ${COLBLUE}---${COLDEFAULT}"
121     echo " !unpack virtual ${pkg/.${PKGSUFFIX}/} ... "
122     continue
123     fi
124    
125     # abort on sources pkg
126     if [[ ${pkgtype} = sources ]]
127     then
128     echo -ne " ${COLBLUE}---${COLDEFAULT}"
129     echo " !unpack sources ${pkg/.${PKGSUFFIX}/} ... "
130     continue
131     fi
132    
133     # busybox?
134     if need_busybox_support tar
135     then
136     tar_opts="xjf"
137     else
138     tar_opts="xjmf"
139     fi
140    
141     echo -e " ${COLBLUE}***${COLDEFAULT} unpacking ${pkg} ... "
142     tar ${tar_opts} ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}"
143    }
144    
145  unpack_packages()  unpack_packages()
146  {  {
147   local list="$@"   local list="$@"
148   local magefile   local magefile
  local pkg  
  local pkgtype  
149   local count_current   local count_current
150   local count_total   local count_total
151     local tar_opts
152    
153   # get count of total packages   # get count of total packages
154   declare -i count_current=0   declare -i count_current=0
# Line 32  unpack_packages() Line 158  unpack_packages()
158    
159   for magefile in ${list}   for magefile in ${list}
160   do   do
161   pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"   unpack_package "${magefile}"
  pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"  
   
162   (( count_current++ ))   (( count_current++ ))
  xtitle "[ (${count_current}/${count_total}) Unpacking ${pkg} ]"  
   
  # abort on virtual pkg  
  if [[ ${pkgtype} = virtual ]]  
  then  
  echo -ne " ${COLBLUE}---${COLDEFAULT}"  
  echo " !unpack virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "  
  continue  
  fi  
   
  # abort on sources pkg  
  if [[ ${pkgtype} = sources ]]  
  then  
  echo -ne " ${COLBLUE}---${COLDEFAULT}"  
  echo " !unpack sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "  
  continue  
  fi  
   
  echo -e " ${COLBLUE}***${COLDEFAULT} unpacking (${count_current}/${count_total}): ${pkg} ... "  
  tar xjmf ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}"  
163   done   done
164    
165   # add a crlf for a better view   # add a crlf for a better view
# Line 75  fix_mtime() Line 179  fix_mtime()
179   mtime=$(stat -c %Y "${reference}")   mtime=$(stat -c %Y "${reference}")
180   touch \   touch \
181   --no-create \   --no-create \
182     --no-dereference \
183   --time=mtime \   --time=mtime \
184   --reference "${reference}" \   --reference="${reference}" \
185   "${pathto}"   "${pathto}"
186    
187   echo "${mtime}"   echo "${mtime}"
# Line 130  install_directories() Line 235  install_directories()
235   while read pathto posix user group   while read pathto posix user group
236   do   do
237   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
238   [[ ${VERBOSE} = on ]] && echo -e "\t>>> DIR:  ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> DIR:  ${MROOT}${pathto}"
   
239    
240   # monitors /etc/env.d -> env-rebuild   # monitors /etc/env.d -> env-rebuild
241   [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true   [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true
# Line 198  install_files() Line 302  install_files()
302   is_config_protected "${pathto}"   is_config_protected "${pathto}"
303   retval="$?"   retval="$?"
304    
305   # 0 - not protected        #   # 0 - not protected         #
306   # 1 - error                #   # 1 - error                 #
307   # 2 - protected            #   # 2 - protected             #
308   # 3 - protected but masked #   # 3 - protected but masked  #
309     # 4 - protected but ignored #
310    
311   case ${retval} in   case ${retval} in
312   # file is not protected - (over)write it   # file is not protected - (over)write it
313   0|3)   0|3)
314   [[ ${VERBOSE} = on ]] && echo -e "\t>>> FILE: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> FILE: ${MROOT}${pathto}"
315   install -m "${posix}" -o "${user}" -g "${group}" \   install -m "${posix}" -o "${user}" -g "${group}" \
316   ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \   ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \
317   "${MROOT}${pathto}"   "${MROOT}${pathto}"
# Line 218  install_files() Line 323  install_files()
323   "${user}" \   "${user}" \
324   "${group}" \   "${group}" \
325   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
326   "${MROOT}${pathto}")" \   "${MROOT}${pathto}")" \
327   "${md5sum}"   "${md5sum}"
328   ;;   ;;
329    
330   # file is protected, write backup file   # file is protected, write backup file
331   2)   2)
332   if [[ ${VERBOSE} = on ]]   if mqueryfeature "verbose"
333   then   then
334   echo -en "${COLRED}"   echo -en "${COLRED}"
335   echo -n "! prot "   echo -n "! prot "
# Line 245  install_files() Line 350  install_files()
350   "${user}" \   "${user}" \
351   "${group}" \   "${group}" \
352   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
353   "${dest_protected}")" \   "${dest_protected}")" \
354   "${md5sum}"   "${md5sum}"
355    
356   # update global MAGE_PROTECT_COUNTER   # update global MAGE_PROTECT_COUNTER
357   (( MAGE_PROTECT_COUNTER++ ))   (( MAGE_PROTECT_COUNTER++ ))
358   export MAGE_PROTECT_COUNTER   export MAGE_PROTECT_COUNTER
359   ;;   ;;
360    
361     # file is protected but ignored, delete the update/do nothing
362     4)
363     if mqueryfeature "verbose"
364     then
365     echo -en "${COLRED}"
366     echo -n "! ignr "
367     echo -en "${COLDEFAULT}"
368     echo " === FILE: ${MROOT}${pathto}"
369     fi
370     # simply do nothing here - only fix mtime
371     fix_descriptor ${pkgname}/.files \
372     "${pathto}" \
373     "${posix}" \
374     "${user}" \
375     "${group}" \
376     "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
377     "${MROOT}${pathto}")" \
378     "${md5sum}"
379     ;;
380   esac   esac
381   done < ${BUILDDIR}/${pkgname}/.files   done < ${BUILDDIR}/${pkgname}/.files
382    
# Line 294  install_symlinks() Line 419  install_symlinks()
419   while read pathto posix link mtime   while read pathto posix link mtime
420   do   do
421   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
422   [[ ${VERBOSE} = on ]] && echo -e "\t>>> LINK: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> LINK: ${MROOT}${pathto}"
423    
424   ln -snf "${link}" "${MROOT}${pathto}"   ln -snf "${link}" "${MROOT}${pathto}"
425    
426   # fix mtime and db   # fix mtime and db
427   fix_descriptor ${pkgname}/.symlinks \   fix_descriptor ${pkgname}/.symlinks \
428   "${pathto}" \   "${pathto}" \
429   "${posix}" \   "${posix}" \
430   "${link}" \   "${link}" \
431   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
432   "${MROOT}${pathto}")"   "${MROOT}${pathto}")"
433    
434   done < ${BUILDDIR}/${pkgname}/.symlinks   done < ${BUILDDIR}/${pkgname}/.symlinks
435    
436   # now copy the fixed file over the old one  # # now copy the fixed file over the old one
437   [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && \  # [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && \
438   cp -f ${BUILDDIR}/${pkgname}/.symlinks{_fixed,}  # cp -f ${BUILDDIR}/${pkgname}/.symlinks{_fixed,}
439    
440   # very important: unsetting the '§' fieldseperator   # very important: unsetting the '§' fieldseperator
441   IFS=$'\n'   IFS=$'\n'
# Line 326  install_blockdevices() Line 451  install_blockdevices()
451   local pkgname="$1"   local pkgname="$1"
452   local pathto   local pathto
453   local posix   local posix
454     local user
455     local group
456   local IFS   local IFS
457    
458   # sanity checks; abort if not given   # sanity checks; abort if not given
# Line 339  install_blockdevices() Line 466  install_blockdevices()
466   # sets fieldseperator to "§" instead of " "   # sets fieldseperator to "§" instead of " "
467   IFS=§   IFS=§
468    
469   while read pathto posix   while read pathto posix major minor user group
470   do   do
471   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
472   [[ ${VERBOSE} = on ]] && echo -e "\t>>> PIPE: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> PIPE: ${MROOT}${pathto}"
473    
474   mkfifo -m "${posix}" "${MROOT}$pathto"   mknod -m "${posix}" "${MROOT}${pathto}"
475     # make it optional atm !!
476     if [[ ! -z ${user} ]] && [[ ! -z ${group} ]]
477     then
478     chown "${user}:${group}" "${MROOT}${pathto}" b "${major}" "${minor}"
479     fi
480   done < ${BUILDDIR}/${pkgname}/.pipes   done < ${BUILDDIR}/${pkgname}/.pipes
481    
482   # very important: unsetting the '§' fieldseperator   # very important: unsetting the '§' fieldseperator
# Line 361  install_characterdevices() Line 493  install_characterdevices()
493   local pkgname="$1"   local pkgname="$1"
494   local pathto   local pathto
495   local posix   local posix
496     local major
497     local minor
498     local user
499     local group
500   local IFS   local IFS
501    
502   # sanity checks; abort if not given   # sanity checks; abort if not given
# Line 374  install_characterdevices() Line 510  install_characterdevices()
510   # sets fieldseperator to "§" instead of " "   # sets fieldseperator to "§" instead of " "
511   IFS=§   IFS=§
512    
513   while read pathto posix   while read pathto posix major minor user group
514   do   do
515   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
516   [[ ${VERBOSE} = on ]] && echo -e "\t>>> CHAR: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> CHAR: ${MROOT}${pathto}"
517    
518     mknod -m ${posix} "${MROOT}${pathto}" b "${major}" "${minor}"
519    
520   mknode -m ${posix} -c "${MROOT}${pathto}"   # make it optional atm !!
521     if [[ ! -z ${user} ]] && [[ ! -z ${group} ]]
522     then
523     chown "${user}:${group}" "${MROOT}${pathto}"
524     fi
525   done < ${BUILDDIR}/${pkgname}/.char   done < ${BUILDDIR}/${pkgname}/.char
526    
527   # very important: unsetting the '§' fieldseperator   # very important: unsetting the '§' fieldseperator
528   IFS=$'\n'   IFS=$'\n'
529  }  }
530    
531    ###################################################
532    # function install_fifos                          #
533    # install_fifos $PKGNAME                    #
534    ###################################################
535    install_fifos()
536    {
537     local pkgname="$1"
538     local pathto
539     local posix
540     local user
541     local group
542     local IFS
543    
544     # sanity checks; abort if not given
545     [ -z "${pkgname}" ] && die "install_fifos() \$pkgname not given."
546    
547     # check needed global vars
548     [ -z "${BUILDDIR}" ] && die "install_fifos() \$BUILDDIR not set."
549    
550     # make it optional atm !!
551     #[ ! -f ${BUILDDIR}/${pkgname}/.fifo ] && die "install_fifos() .fifo not found"
552     [ ! -f ${BUILDDIR}/${pkgname}/.fifo ] && return
553    
554     # sets fieldseperator to "§" instead of " "
555     IFS=§
556    
557     while read pathto posix user group
558     do
559     [ -z "${pathto}" ] && continue
560     mqueryfeature "verbose" && echo -e "\t>>> FIFO: ${MROOT}${pathto}"
561    
562     mkfifo -m "${posix}" "${MROOT}${pathto}"
563     chown "${user}:${group}" "${MROOT}${pathto}"
564     done < ${BUILDDIR}/${pkgname}/.fifo
565    
566     # very important: unsetting the '§' fieldseperator
567     IFS=$'\n'
568    }
569    
570    
571  ###################################################  ###################################################
572  # function build_doinstall                        #  # function build_doinstall                        #
573  # build_doinstall $PKGNAME                  #  # build_doinstall $PKGNAME                  #
574  # NOTE: this is an wrapper do install packages    #  # NOTE: this is an wrapper to install packages    #
575  ###################################################  ###################################################
576  build_doinstall()  build_doinstall()
577  {  {
# Line 398  build_doinstall() Line 579  build_doinstall()
579    
580   # sanity checks; abort if not given   # sanity checks; abort if not given
581   [ -z "${pkgname}" ] && die "build_doinstall() \$pkgname not given."   [ -z "${pkgname}" ] && die "build_doinstall() \$pkgname not given."
582    
583   # this is only a wrapper   # this is only a wrapper
584    
585   # NOTE:   # NOTE:
# Line 413  build_doinstall() Line 594  build_doinstall()
594   install_symlinks ${pkgname} || die "install symlinks ${pkgname}"   install_symlinks ${pkgname} || die "install symlinks ${pkgname}"
595   install_blockdevices ${pkgname} || die "install blockdevices ${pkgname}"   install_blockdevices ${pkgname} || die "install blockdevices ${pkgname}"
596   install_characterdevices ${pkgname} || die "install chardevices ${pkgname}"   install_characterdevices ${pkgname} || die "install chardevices ${pkgname}"
597     install_fifos ${pkgname} || die "install fifos ${pkgname}"
598  }  }
599    
600    
# Line 432  install_database_entry() Line 614  install_database_entry()
614   local magefile   local magefile
615   local dbrecorddir   local dbrecorddir
616   local provide   local provide
617     local i
618    
619   # very basic getops   # very basic getops
620   for i in $*   for i in $*
# Line 473  install_database_entry() Line 656  install_database_entry()
656    
657   # create fake file descriptors   # create fake file descriptors
658   # used by virtual and source packages   # used by virtual and source packages
659   local i   for i in .dirs .symlinks .files .pipes .char .fifo
  for i in .dirs .symlinks .files .pipes .char  
660   do   do
661   touch ${dbrecorddir}/${i}   touch ${dbrecorddir}/${i}
662   done   done
# Line 492  install_database_entry() Line 674  install_database_entry()
674    
675   # normal packages needs these files   # normal packages needs these files
676   local i   local i
677   for i in .char .dirs .files .pipes .symlinks   for i in .char .dirs .files .pipes .symlinks .fifo
678   do   do
679   install -m 0644 ${BUILDDIR}/${pkgname}/${i} \   # make .fifo optional atm
680   ${dbrecorddir}/${i}   if [[ -f ${BUILDDIR}/${pkgname}/${i} ]]
681     then
682     install -m 0644 ${BUILDDIR}/${pkgname}/${i} ${dbrecorddir}/${i}
683     fi
684   done   done
685   ;;   ;;
686   esac   esac
# Line 504  install_database_entry() Line 689  install_database_entry()
689   provide="$(get_value_from_magefile PROVIDE ${magefile})"   provide="$(get_value_from_magefile PROVIDE ${magefile})"
690   if [ -n "${provide}" ]   if [ -n "${provide}" ]
691   then   then
692   virtuals_add "${provide}" "${pcat}/${pname}"   for i in ${provide}
693     do
694     virtuals_add "${i}" "${pcat}/${pname}"
695     done
696   fi   fi
697  }  }
698    
# Line 523  remove_database_entry() Line 711  remove_database_entry()
711   local magefile   local magefile
712   local dbrecorddir   local dbrecorddir
713   local provide   local provide
714     local i
715    
716   # very basic getops   # very basic getops
717   for i in $*   for i in $*
# Line 552  remove_database_entry() Line 741  remove_database_entry()
741   # abort if mage file not exists   # abort if mage file not exists
742   [ ! -f ${magefile} ] && die "remove_database_entry() ${magefile} not exist."   [ ! -f ${magefile} ] && die "remove_database_entry() ${magefile} not exist."
743    
744   # first unregister virtuals   # remove virtuals only if no other exist
745   provide="$(get_value_from_magefile PROVIDE ${magefile})"   if [[ $(count_installed_pkgs --pcat ${pcat} --pname ${pname}) -le 1 ]]
  if [ -n "${provide}" ]  
746   then   then
747   virtuals_del "${provide}" "${pcat}/${pname}"   # first unregister virtuals
748     provide="$(get_value_from_magefile PROVIDE ${magefile})"
749     if [ -n "${provide}" ]
750     then
751     for i in ${provide}
752     do
753     virtuals_del "${i}" "${pcat}/${pname}"
754     done
755     fi
756   fi   fi
757    
758   # removes database entry   # removes database entry
# Line 566  remove_database_entry() Line 762  remove_database_entry()
762   fi   fi
763  }  }
764    
765    # get the number of installed packages
766    count_installed_pkgs()
767    {
768     local pcat
769     local pname
770     local pkg
771     local i
772    
773     # very basic getops
774     for i in $*
775     do
776     case $1 in
777     --pcat|-c) shift; pcat="$1" ;;
778     --pname|-n) shift; pname="$1" ;;
779     esac
780     shift
781     done
782    
783     # sanity checks; abort if not given
784     [ -z "${pcat}" ] && die "pkg_count() \$pcat not given."
785     [ -z "${pname}" ] && die "pkg_count() \$pname not given."
786    
787     declare -i i=0
788     for pkg in $(get_uninstall_candidates --pcat ${pcat} --pname ${pname})
789     do
790     (( i++ ))
791     #echo "$i ${pkg}"
792     done
793    
794     # return the value
795     echo "${i}"
796    }
797    
798    
799  ###################################################  ###################################################
800  # function compare_mtime                          #  # function compare_mtime                          #
# Line 587  compare_mtime() Line 816  compare_mtime()
816    
817   mtime="$(stat -c %Y ${MROOT}${INSTALLDB}/${pfull}/.mtime)"   mtime="$(stat -c %Y ${MROOT}${INSTALLDB}/${pfull}/.mtime)"
818    
819   # if $pathto is a symlink than compare linked binary   # no extra handlink for symlinks anymore as fix_mtime
820   if [ -L "${MROOT}${pathto}" ]   # uses --no-dereference, compare directly
821   then   x=$(stat -c %Y "${MROOT}${pathto}")
  # readlink -f resolves full path of linked file  
  x="$(readlink -f "${MROOT}${pathto}")"  
   
  # abort if target does not exists  
  # we keep safe here, theoretically the link can removed  
  [ ! -e "${x}" ] && return 1  
   
  x=$(stat -c %Y "${x}")  
  else  
  x=$(stat -c %Y "${MROOT}${pathto}")  
  fi  
822    
823   [[ ${mtime} = ${x} ]] && return 0   [[ ${mtime} = ${x} ]] && return 0
824    
# Line 662  remove_symlinks() Line 880  remove_symlinks()
880   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
881   if [ ! -L "${MROOT}${pathto}" ]   if [ ! -L "${MROOT}${pathto}" ]
882   then   then
883   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
884   echo -e "${COLRED}! exist${COLDEFAULT} === LINK: ${MROOT}${pathto}"   echo -e "${COLRED}! exist${COLDEFAULT} === LINK: ${MROOT}${pathto}"
885   continue   continue
886   fi   fi
# Line 674  remove_symlinks() Line 892  remove_symlinks()
892   # 1=keep me   #   # 1=keep me   #
893   case ${retval} in   case ${retval} in
894   0)   0)
895   [[ ${VERBOSE} = on ]] && echo -e "\t<<< LINK: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t<<< LINK: ${MROOT}${pathto}"
896   rm "${MROOT}${pathto}"   rm "${MROOT}${pathto}"
897   ;;   ;;
898    
899   1)   1)
900   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
901   echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: ${MROOT}${pathto}"   echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: ${MROOT}${pathto}"
902   ;;   ;;
903   esac   esac
# Line 726  remove_files() Line 944  remove_files()
944   done   done
945    
946   # sanity checks; abort if not given   # sanity checks; abort if not given
947   [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."   [ -z "${pcat}" ] && die "remove_files() \$pcat not given."
948   [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."   [ -z "${pname}" ] && die "remove_files() \$pname not given."
949   [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."   [ -z "${pver}" ] && die "remove_files() \$pver not given."
950   [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."   [ -z "${pbuild}" ] && die "remove_files() \$pbuild not given."
951   pfull="${pcat}/${pname}-${pver}-${pbuild}"   pfull="${pcat}/${pname}-${pver}-${pbuild}"
952    
953   # check needed global vars   # check needed global vars
# Line 744  remove_files() Line 962  remove_files()
962   do   do
963   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
964    
965   if [ -e "${MROOT}${pathto}" ]   if [ ! -e "${MROOT}${pathto}" ]
966   then   then
967   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
968   echo -e "${COLRED}! exist${COLDEFAULT} === FILE: ${MROOT}${pathto}"   echo -e "${COLRED}! exist${COLDEFAULT} === FILE: ${MROOT}${pathto}"
969   continue   continue
970   fi   fi
# Line 758  remove_files() Line 976  remove_files()
976   # 1=keep me   #   # 1=keep me   #
977   case ${retval} in   case ${retval} in
978   0)   0)
979   [[ ${VERBOSE} = on ]] && echo -e "\t<<< FILE: ${MROOT}${pathto}"   # check if the file is config_protected
980   rm "${MROOT}${pathto}"   # ${MROOT} will automatically added if set !!
981   ;;   is_config_protected "${pathto}"
982     retval="$?"
983    
984     # 0 - not protected         #
985     # 1 - error                 #
986     # 2 - protected             #
987     # 3 - protected but masked  #
988     # 4 - protected but ignored #
989    
990     case ${retval} in
991     # file is not protected - delete it
992     0|3)
993     mqueryfeature "verbose" && echo -e "\t<<< FILE: ${MROOT}${pathto}"
994     rm "${MROOT}${pathto}"
995     ;;
996    
997     # file is protected, do not delete
998     2)
999     if mqueryfeature "verbose"
1000     then
1001     echo -en "${COLRED}"
1002     echo -n "! prot "
1003     echo -en "${COLDEFAULT}"
1004     echo " === FILE: ${MROOT}${pathto}"
1005     fi
1006     ;;
1007    
1008     # file is protected but ignored, delete the update/do nothing
1009     4)
1010     if mqueryfeature "verbose"
1011     then
1012     echo -en "${COLRED}"
1013     echo -n "! ignr "
1014     echo -en "${COLDEFAULT}"
1015     echo " === FILE: ${MROOT}${pathto}"
1016     fi
1017     # simply do nothing here
1018     ;;
1019     esac
1020     ;;
1021   1)   1)
1022   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
1023   echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: ${MROOT}${pathto}"   echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: ${MROOT}${pathto}"
1024   ;;   ;;
1025   esac   esac
# Line 782  remove_blockdevices() Line 1038  remove_blockdevices()
1038  {  {
1039   local pathto   local pathto
1040   local posix   local posix
1041     local user
1042     local group
1043   local IFS   local IFS
1044   local pcat   local pcat
1045   local pname   local pname
# Line 805  remove_blockdevices() Line 1063  remove_blockdevices()
1063   done   done
1064    
1065   # sanity checks; abort if not given   # sanity checks; abort if not given
1066   [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."   [ -z "${pcat}" ] && die "remove_blockdevices() \$pcat not given."
1067   [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."   [ -z "${pname}" ] && die "remove_blockdevices() \$pname not given."
1068   [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."   [ -z "${pver}" ] && die "remove_blockdevices() \$pver not given."
1069   [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."   [ -z "${pbuild}" ] && die "remove_blockdevices() \$pbuild not given."
1070   pfull="${pcat}/${pname}-${pver}-${pbuild}"   pfull="${pcat}/${pname}-${pver}-${pbuild}"
1071    
1072   # check needed global vars   # check needed global vars
# Line 819  remove_blockdevices() Line 1077  remove_blockdevices()
1077   # sets fieldseperator to "§" instead of " "   # sets fieldseperator to "§" instead of " "
1078   IFS=§   IFS=§
1079    
1080   while read pathto posix   while read pathto posix user group
1081   do   do
1082   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
1083    
1084   [[ ${VERBOSE} = on ]] && echo -e "\t<<< PIPE: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t<<< PIPE: ${MROOT}${pathto}"
1085   rm "${MROOT}${pathto}"   rm "${MROOT}${pathto}"
1086   done < ${MROOT}${INSTALLDB}/${pfull}/.pipes   done < ${MROOT}${INSTALLDB}/${pfull}/.pipes
1087    
# Line 840  remove_characterdevices() Line 1098  remove_characterdevices()
1098  {  {
1099   local pathto   local pathto
1100   local posix   local posix
1101     local user
1102     local group
1103   local IFS   local IFS
1104   local pcat   local pcat
1105   local pname   local pname
# Line 863  remove_characterdevices() Line 1123  remove_characterdevices()
1123   done   done
1124    
1125   # sanity checks; abort if not given   # sanity checks; abort if not given
1126   [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."   [ -z "${pcat}" ] && die "remove_characterdevices() \$pcat not given."
1127   [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."   [ -z "${pname}" ] && die "remove_characterdevices() \$pname not given."
1128   [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."   [ -z "${pver}" ] && die "remove_characterdevices() \$pver not given."
1129   [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."   [ -z "${pbuild}" ] && die "remove_characterdevices() \$pbuild not given."
1130   pfull="${pcat}/${pname}-${pver}-${pbuild}"   pfull="${pcat}/${pname}-${pver}-${pbuild}"
1131    
1132   # check needed global vars   # check needed global vars
# Line 877  remove_characterdevices() Line 1137  remove_characterdevices()
1137   # sets fieldseperator to "§" instead of " "   # sets fieldseperator to "§" instead of " "
1138   IFS=§   IFS=§
1139    
1140   while read pathto posix   while read pathto posix user group
1141   do   do
1142   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
1143    
1144   [[ ${VERBOSE} = on ]] && echo -e "\t<<< CHAR: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t<<< CHAR: ${MROOT}${pathto}"
1145   rm "${MROOT}${pathto}"   rm "${MROOT}${pathto}"
1146   done < ${MROOT}${INSTALLDB}/${pfull}/.char   done < ${MROOT}${INSTALLDB}/${pfull}/.char
1147    
# Line 891  remove_characterdevices() Line 1151  remove_characterdevices()
1151    
1152    
1153  ###################################################  ###################################################
1154    # function remove_fifos                           #
1155    # remove_fifos $PKGNAME                     #
1156    ###################################################
1157    remove_fifos()
1158    {
1159     local pathto
1160     local posix
1161     local user
1162     local group
1163     local IFS
1164     local pcat
1165     local pname
1166     local pver
1167     local pbuild
1168     local i
1169     local pfull
1170    
1171     IFS=$'\n'
1172    
1173     # very basic getops
1174     for i in $*
1175     do
1176     case $1 in
1177     --pcat|-c) shift; pcat="$1" ;;
1178     --pname|-n) shift; pname="$1" ;;
1179     --pver|-v) shift; pver="$1" ;;
1180     --pbuild|-b) shift; pbuild="$1" ;;
1181     esac
1182     shift
1183     done
1184    
1185     # sanity checks; abort if not given
1186     [ -z "${pcat}" ] && die "remove_fifos() \$pcat not given."
1187     [ -z "${pname}" ] && die "remove_fifos() \$pname not given."
1188     [ -z "${pver}" ] && die "remove_fifos() \$pver not given."
1189     [ -z "${pbuild}" ] && die "remove_fifos() \$pbuild not given."
1190     pfull="${pcat}/${pname}-${pver}-${pbuild}"
1191    
1192     # check needed global vars
1193     [ -z "${BUILDDIR}" ] && die "remove_fifos() \$BUILDDIR not set."
1194    
1195     # make it optional atm !!
1196     #[ ! -f ${MROOT}${INSTALLDB}/${pfull}/.fifo ] && die "remove_fifos() .fifo not found"
1197     [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.fifo ] && return
1198    
1199     # sets fieldseperator to "§" instead of " "
1200     IFS=§
1201    
1202     while read pathto posix user group
1203     do
1204     [ -z "${pathto}" ] && continue
1205    
1206     mqueryfeature "verbose" && echo -e "\t<<< FIFO: ${MROOT}${pathto}"
1207     rm "${MROOT}${pathto}"
1208     done < ${MROOT}${INSTALLDB}/${pfull}/.fifo
1209    
1210     # very important: unsetting the '§' fieldseperator
1211     IFS=$'\n'
1212    }
1213    
1214    
1215    ###################################################
1216  # function remove_direcories                      #  # function remove_direcories                      #
1217  # remove_direcories $PKGNAME                #  # remove_direcories $PKGNAME                #
1218  ###################################################  ###################################################
# Line 921  remove_directories() Line 1243  remove_directories()
1243   done   done
1244    
1245   # sanity checks; abort if not given   # sanity checks; abort if not given
1246   [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."   [ -z "${pcat}" ] && die "remove_directories() \$pcat not given."
1247   [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."   [ -z "${pname}" ] && die "remove_directories() \$pname not given."
1248   [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."   [ -z "${pver}" ] && die "remove_directories() \$pver not given."
1249   [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."   [ -z "${pbuild}" ] && die "remove_directories() \$pbuild not given."
1250   pfull="${pcat}/${pname}-${pver}-${pbuild}"   pfull="${pcat}/${pname}-${pver}-${pbuild}"
1251    
1252   # check needed global vars   # check needed global vars
# Line 932  remove_directories() Line 1254  remove_directories()
1254    
1255   [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.char ] && die "remove_directories() .dirs not found"   [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.char ] && die "remove_directories() .dirs not found"
1256    
  # uninstall of dirs ## added small hack to fix dirs  
  # must be reverse -> smage2 doesn't sort them  
  # -> using tac  
   
1257   # sets fieldseperator to "§" instead of " "   # sets fieldseperator to "§" instead of " "
1258   IFS=§   IFS=§
1259    
1260   while read pathto posix   # reversed order is mandatory !
1261     tac ${MROOT}${INSTALLDB}/${pfull}/.dirs | while read pathto posix
1262   do   do
1263   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
1264    
1265   if [ ! -d "${MROOT}${pathto}" ]   if [ ! -d "${MROOT}${pathto}" ]
1266   then   then
1267   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
1268   echo -e "${COLRED}! exist${COLDEFAULT} === DIR:  ${MROOT}${pathto}"   echo -e "${COLRED}! exist${COLDEFAULT} === DIR:  ${MROOT}${pathto}"
1269   continue   continue
1270   fi   fi
# Line 953  remove_directories() Line 1272  remove_directories()
1272   # exclude .keep directories   # exclude .keep directories
1273   if [ -f "${MROOT}${pathto}/.keep" ]   if [ -f "${MROOT}${pathto}/.keep" ]
1274   then   then
1275   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
1276   echo -e "${COLRED}  .keep${COLDEFAULT} === DIR:  ${MROOT}${pathto}"   echo -e "${COLRED}! .keep${COLDEFAULT} === DIR:  ${MROOT}${pathto}"
1277   continue   continue
1278   fi   fi
1279    
# Line 966  remove_directories() Line 1285  remove_directories()
1285    
1286   if rmdir "${MROOT}${pathto}" &> /dev/null   if rmdir "${MROOT}${pathto}" &> /dev/null
1287   then   then
1288   [[ ${VERBOSE} = on ]] && echo -e "\t<<< DIR:  ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t<<< DIR:  ${MROOT}${pathto}"
1289   else   else
1290   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
1291   echo -e "${COLRED}! empty${COLDEFAULT} === DIR:  ${MROOT}${pathto}"   echo -e "${COLRED}! empty${COLDEFAULT} === DIR:  ${MROOT}${pathto}"
1292   fi   fi
1293   done < ${MROOT}${INSTALLDB}/${pfull}/.dirs   done
1294    
1295   # very important: unsetting the '§' fieldseperator   # very important: unsetting the '§' fieldseperator
1296   IFS=$'\n'   IFS=$'\n'
# Line 981  remove_directories() Line 1300  remove_directories()
1300  ###################################################  ###################################################
1301  # function build_douninstall                      #  # function build_douninstall                      #
1302  # build_douninstall $PKGNAME                #  # build_douninstall $PKGNAME                #
1303  # NOTE: this is an wrapper do remove packages     #  # NOTE: this is an wrapper to remove packages     #
1304  ###################################################  ###################################################
1305  build_douninstall()  build_douninstall()
1306  {  {
# Line 1015  build_douninstall() Line 1334  build_douninstall()
1334   # !! we use § as field seperator !!   # !! we use § as field seperator !!
1335   # doing so prevent us to get errors by filenames with spaces   # doing so prevent us to get errors by filenames with spaces
1336    
1337   for i in symlinks files blockdevices characterdevices directories   for i in symlinks files blockdevices characterdevices directories fifos
1338   do   do
1339   remove_${i} \   remove_${i} \
1340   --pcat "${pcat}" \   --pcat "${pcat}" \
# Line 1026  build_douninstall() Line 1345  build_douninstall()
1345   done   done
1346  }  }
1347    
1348    # convertmirrors [uri]
1349    convertmirrors()
1350    {
1351     local uri="$1"
1352     local scheme
1353     local mirror
1354     local mirrors
1355     local addon
1356     local real_uri
1357     local output
1358    
1359     # needs
1360     [[ -z ${MIRRORS} ]] && die "convertmirrors(): no mirrors defined!"
1361     [[ -z ${SOURCEFORGE_MIRRORS} ]] && die "convertmirrors(): no sourceforge mirrors defined!"
1362     [[ -z ${GNU_MIRRORS} ]] && die "convertmirrors(): no gnu mirrors defined!"
1363     [[ -z ${GNOME_MIRRORS} ]] && die "convertmirrors(): no gnome mirrors defined!"
1364     [[ -z ${KDE_MIRRORS} ]] && die "convertmirrors(): no kde mirrors defined!"
1365    
1366     # check known uri schemes
1367     case ${uri} in
1368     http://*|https://*|ftp://*|ftps://*) mirrors="" ;;
1369     mirror://*) mirrors="${MIRRORS}"; scheme="mirror://"; addon="/sources" ;;
1370     package://*) mirrors="${MIRRORS}"; scheme="package://"; addon="/${PACKAGES_SERVER_PATH}" ;;
1371     gnu://*) mirrors="${GNU_MIRRORS}"; scheme="gnu://" ;;
1372     sourceforge://*) mirrors="${SOURCEFORGE_MIRRORS}"; scheme="sourceforge://" ;;
1373     gnome://*) mirrors="${GNOME_MIRRORS}"; scheme="gnome://" ;;
1374     kde://*) mirrors="${KDE_MIRRORS}"; scheme="kde://" ;;
1375     *) die "convertmirror(): unsupported uri scheme in '${uri}'!" ;;
1376     esac
1377    
1378     if [[ ! -z ${mirrors} ]]
1379     then
1380     for mirror in ${mirrors}
1381     do
1382     # add a whitespace to the output
1383     [[ -z ${output} ]] || output+=" "
1384     output+="${mirror}${addon}/${uri/${scheme}/}"
1385     done
1386     else
1387     output="${uri}"
1388     fi
1389    
1390     echo "${output}"
1391    }
1392    
1393    mdownload()
1394    {
1395     local i
1396     local uri
1397     local real_uris
1398     local mirror
1399     local outputfile
1400     local outputdir
1401     local retval
1402     local wget_opts
1403    
1404     # very basic getops
1405     for i in $*
1406     do
1407     case $1 in
1408     --uri|-u) shift; uri="$1" ;;
1409     --dir|-d) shift; outputdir="$1" ;;
1410     esac
1411     shift
1412     done
1413    
1414     # sanity checks; abort if not given
1415     [[ -z ${uri} ]] && die "mdownload(): no uri given!"
1416     [[ -z ${outputdir} ]] && die "mdownload(): no dir given!"
1417    
1418     # convert mirrored uris to the real ones
1419     real_uris="$(convertmirrors ${uri})"
1420    
1421     # verbose or not
1422     mqueryfeature "!verbose" && wget_opts+=" --quiet"
1423    
1424     # filter wget options if busybox was found
1425     wget_opts+=" $(busybox_filter_wget_options ${WGET_FETCH_OPTIONS})"
1426    
1427     # create outputdir
1428     [[ ! -d ${outputdir} ]] && install -d "${outputdir}"
1429    
1430     for mirror in ${real_uris}
1431     do
1432     # get the name of the output file
1433     outputfile="${mirror##*/}"
1434    
1435     wget ${wget_opts} --output-document="${outputdir}/${outputfile}" "${mirror}"
1436     retval="$?"
1437     if [[ ${retval} = 0 ]]
1438     then
1439     break
1440     else
1441     continue
1442     fi
1443     done
1444    
1445     # return wget retval
1446     return "${retval}"
1447    }
1448    
1449  # fetch_packages /path/to/mage/file1 /path/to/mage/file2  # fetch_packages /path/to/mage/file1 /path/to/mage/file2
1450  fetch_packages()  fetch_packages()
1451  {  {
1452     local i
1453   local list="$@"   local list="$@"
1454   local pkg   local pkg
1455   local mirr   local mirr
# Line 1037  fetch_packages() Line 1458  fetch_packages()
1458   local opt   local opt
1459   local count_current   local count_current
1460   local count_total   local count_total
1461     local wget_opts
1462    
1463     [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your ${MAGERC}."
1464    
1465   [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your /etc/mage.rc."   # filter wget command if busybox was found
1466     wget_opts="$(busybox_filter_wget_options ${WGET_FETCH_OPTIONS})"
1467    
1468   # get count of total packages   # get count of total packages
1469   declare -i count_current=0   declare -i count_current=0
# Line 1078  fetch_packages() Line 1503  fetch_packages()
1503   continue   continue
1504   fi   fi
1505    
1506   for mirr in ${MIRRORS}   echo -ne " ${COLBLUE}***${COLDEFAULT}"
1507   do   echo -e " fetching (${count_current}/${count_total}): ${pkg} ... "
1508   echo -ne " ${COLBLUE}***${COLDEFAULT}"   mdownload --uri "package://${pkg}" --dir "${PKGDIR}" || die "Could not download ${pkg}"
  #echo -e " fetching (${count_current}/${count_total}): ${mirr}/${pkg} ... "  
  echo -e " fetching (${count_current}/${count_total}): ${pkg} ... "  
  [[ ${VERBOSE} = off ]] && opt="--quiet"  
  wget \  
  --passive-ftp \  
  --tries 3 \  
  --continue \  
  --progress bar \  
  --directory-prefix=${PKGDIR} \  
  ${opt} ${mirr}/packages/${pkg}  
  if [[ $? = 0 ]]  
  then  
  break  
  else  
  continue  
  fi  
  done  
   
1509   if [ ! -f ${PKGDIR}/${pkg} ]   if [ ! -f ${PKGDIR}/${pkg} ]
1510   then   then
1511   die "Could not download ${pkg}"   die "Package '${pkg}' after download not found in '${PKGDIR}'"
1512   fi   fi
1513   done   done
1514    
# Line 1113  syncmage() Line 1520  syncmage()
1520  {  {
1521   if [ -z "${RSYNC}" ]   if [ -z "${RSYNC}" ]
1522   then   then
1523   die "You have no rsync-mirrors defined. Please edit your /etc/mage.rc."   die "You have no rsync-mirrors defined. Please edit your ${MAGERC}."
1524   fi   fi
1525    
1526   local i   local i
1527   for i in ${RSYNC}   for i in ${RSYNC}
1528   do   do
1529   rsync \   rsync ${RSYNC_FETCH_OPTIONS} ${i} ${MAGEDIR}
  --recursive \  
  --links \  
  --perms \  
  --times \  
  --devices \  
  --timeout=600 \  
  --verbose \  
  --compress \  
  --progress \  
  --stats \  
  --delete \  
  --delete-after \  
  ${i} ${MAGEDIR}  
1530   if [[ $? = 0 ]]   if [[ $? = 0 ]]
1531   then   then
1532   break   break
# Line 1142  syncmage() Line 1536  syncmage()
1536   done   done
1537    
1538   # clean up backup files (foo~)   # clean up backup files (foo~)
1539   find ${MAGEDIR} -name *~ -exec rm '{}' ';'   find ${MAGEDIR} -name \*~ -exec rm '{}' ';'
1540    
1541   # check if an newer mage version is available   # check if a newer mage version is available
1542   is_newer_mage_version_available   is_newer_mage_version_available
1543  }  }
1544    
1545    syncmage_tarball()
1546    {
1547     local latest_tarball
1548     local latest_md5
1549     local temp="$(mktemp -d)"
1550     local mirr mymirr
1551     local opt
1552     local tar_opts
1553     local wget_opts
1554    
1555     # try to get the md5 marked as latest on the server
1556     latest_md5="mage-latest.md5"
1557    
1558     # try to get the tarball marked as latest on the server
1559     latest_tarball="mage-latest.tar.bz2"
1560    
1561     # filter wget command if busybox was found
1562     wget_opts="$(busybox_filter_wget_options ${WGET_FETCH_OPTIONS})"
1563    
1564     for mirr in ${MIRRORS}
1565     do
1566     # path without distribution
1567     # (only for stable|testing|unstable and not DISTROTAG)
1568     case ${mirr##*/} in
1569     stable|testing|unstable) mymirr="${mirr%/*}";;
1570     *) mymirr="${mirr}";;
1571     esac
1572    
1573     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1574     echo "fetching latest md5 from ${mymirr} ..."
1575     mqueryfeature "!verbose" && opt="--quiet"
1576     wget \
1577     ${wget_opts} \
1578     --directory-prefix=${temp} \
1579     ${opt} ${mymirr}/rsync/tarballs/${latest_md5}
1580    
1581     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1582     echo "fetching latest tarball from ${mymirr} ..."
1583     wget \
1584     ${wget_opts} \
1585     --directory-prefix=${temp} \
1586     ${opt} ${mymirr}/rsync/tarballs/${latest_tarball}
1587     if [[ $? = 0 ]]
1588     then
1589     break
1590     else
1591     continue
1592     fi
1593     done
1594    
1595     if [[ -f ${temp}/${latest_tarball} ]]
1596     then
1597     # check md5
1598     if [[ ! -f ${temp}/${latest_md5} ]]
1599     then
1600     die "md5 is missing ... aborting"
1601     else
1602     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1603     echo -n "checking md5sum... "
1604     mchecksum --rundir "${temp}" --file "${latest_md5}" --method md5 || die "md5 for ${latest_tarball} failed"
1605     fi
1606    
1607     if [[ -d ${MAGEDIR} ]]
1608     then
1609     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1610     echo "cleaning old mage-tree ${MAGEDIR}..."
1611     # honor mountpoints and empty dirs
1612     if mountpoint -q ${MAGEDIR}
1613     then
1614     if ! mcheckemptydir ${MAGEDIR}
1615     then
1616     find ${MAGEDIR} -mindepth 1 -maxdepth 1 | xargs --no-run-if-empty rm -r
1617     fi
1618     else
1619     rm -rf ${MAGEDIR}
1620     fi
1621     fi
1622    
1623     if need_busybox_support tar
1624     then
1625     tar_opts="xjf"
1626     else
1627     tar_opts="xjmf"
1628     fi
1629    
1630     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1631     echo "updating mage-tree from tarball ..."
1632     # unpack in dirname of MAGEDIR, as the tarball has already the mage
1633     tar ${tar_opts} ${temp}/${latest_tarball} -C ${MAGEDIR%/*} || die "Unpacking tarball"
1634    
1635     if [[ -d ${temp} ]]
1636     then
1637     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1638     echo "cleaning temp-files ..."
1639     rm -rf ${temp}
1640     fi
1641    
1642     # check if a newer mage version is available
1643     is_newer_mage_version_available
1644     else
1645     die "Could not fetch the latest tarball ... aborting"
1646     fi
1647    }
1648    
1649  cleanpkg()  cleanpkg()
1650  {  {
1651   if [ -d "${PKGDIR}" ]   if [ -d "${PKGDIR}" ]
# Line 1178  xtitleclean() Line 1676  xtitleclean()
1676  }  }
1677    
1678    
1679  # cuts full pathnames or versioniezed names down to basename  # unused?
1680  choppkgname()  #
1681  {  # # cuts full pathnames or versionized names down to basename
1682   #we want this only if full name was used  # choppkgname()
1683   if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]  # {
1684   then  # #we want this only if full name was used
1685   #cuts ARCH and PBUILD  # if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
1686   #ARCH comes from /etc/mage.rc  # then
1687   MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")  # #cuts ARCH and PBUILD
1688    # #ARCH comes from ${MAGERC}
1689    # MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}$(print_distrotag)-r*.::g")
1690    #
1691    # #cuts version number
1692    # MAGENAME=$(basename ${MAGENAME%-*} .mage)
1693    # fi
1694    # }
1695    
  #cuts version number  
  MAGENAME=$(basename ${MAGENAME%-*} .mage)  
  fi  
 }  
1696    
1697  # get_categorie $PNAME, returns CATEGORIE  # get_categorie $PNAME, returns CATEGORIE
1698  # $1=pname  # $1=pname
# Line 1218  pname2pcat() Line 1719  pname2pcat()
1719  # returns 0=stable 1=unstable  # returns 0=stable 1=unstable
1720  check_stable_package()  check_stable_package()
1721  {  {
1722     # first check if this magefile is not blacklisted
1723     blacklisted "$1" || return 1
1724    
1725   local STATE   local STATE
1726   STATE="$(get_value_from_magefile STATE "$1")"   STATE="$(get_value_from_magefile STATE "$1")"
1727    
1728   # state testing   # state testing
1729   if [[ ${USE_TESTING} = true ]]   if [[ ${USE_TESTING} = true ]] || [[ ${MAGE_DISTRIBUTION} = testing ]]
1730   then   then
1731   case ${STATE} in   case ${STATE} in
1732   testing|stable) return 0 ;;   testing|stable) return 0 ;;
# Line 1231  check_stable_package() Line 1735  check_stable_package()
1735   fi   fi
1736    
1737   # state unstable   # state unstable
1738   if [[ ${USE_UNSTABLE} = true ]]   if [[ ${USE_UNSTABLE} = true ]] || [[ ${MAGE_DISTRIBUTION} = unstable ]]
1739   then   then
1740   case ${STATE} in   case ${STATE} in
1741   unstable|testing|stable) return 0 ;;   unstable|testing|stable) return 0 ;;
# Line 1257  get_highest_magefile() Line 1761  get_highest_magefile()
1761   local PNAME="$2"   local PNAME="$2"
1762   local magefile   local magefile
1763    
1764   for magefile in $(ls --format=single-column -v ${MAGEDIR}/${PCAT}/${PNAME}/*)   # do not list the content of a directory, only the name (-d)
1765     for magefile in $(ls --format=single-column -v -d ${MAGEDIR}/${PCAT}/${PNAME}/* 2> /dev/null)
1766   do   do
1767     [[ -z ${magefile} ]] && continue
1768   # we exclude subdirs (for stuff like a md5sum dir)   # we exclude subdirs (for stuff like a md5sum dir)
1769   [ -d ${magefile} ] && continue   [[ -d ${magefile} ]] && continue
1770   if check_stable_package ${magefile}   if check_stable_package ${magefile}
1771   then   then
1772   HIGHEST_MAGEFILE=${magefile}   HIGHEST_MAGEFILE=${magefile}
1773   #for debug only   #for debug only
1774   [[ ${MAGEDEBUG} = on ]] && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"   mqueryfeature "debug" && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
1775   fi   fi
1776   done   done
1777    
  # stop here if HIGHEST_MAGEFILE is zero  
  # this package must be unstable or old  
  if [ -z "${HIGHEST_MAGEFILE}" ]  
  then  
  echo  
  echo -n "All packages named "  
  echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}  
  echo -n " are marked "  
  echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}  
  echo "."  
  echo "You need to declare USE_UNSTABLE=true to install this."  
  echo  
  echo "Example:"  
  echo "         USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"  
  echo  
  echo "Be warned that these packages are not stable and may cause serious problems."  
  echo "You should know what you are doing, so don't complain about any damage."  
  echo  
  return 1  
  fi  
   
1778   echo "${HIGHEST_MAGEFILE}"   echo "${HIGHEST_MAGEFILE}"
1779   return 0   return 0
1780  }  }
# Line 1304  get_highest_magefile() Line 1789  get_highest_magefile()
1789  #        1 - error                                #  #        1 - error                                #
1790  #        2 - protected                            #  #        2 - protected                            #
1791  #        3 - protected but masked                 #  #        3 - protected but masked                 #
1792    #        4 - protected but ignored                #
1793  #                                                 #  #                                                 #
1794  ###################################################  ###################################################
1795  is_config_protected()  is_config_protected()
# Line 1312  is_config_protected() Line 1798  is_config_protected()
1798   local TEST   local TEST
1799   local PROTECTED   local PROTECTED
1800   local IFS   local IFS
1801     local i
1802     local x
1803    
1804   EXPFILE="${MROOT}$1"   EXPFILE="${MROOT}$1"
1805    
1806   # file does not exist; it can be written   # file does not exist; it can be written
1807   [ ! -e ${EXPFILE} ] && return 0   [[ ! -e ${EXPFILE} ]] && return 0
1808    
1809   # to be safe; it may be '§'   # to be safe; it may be '§'
1810   IFS=' '   IFS=' '
1811    
1812   # check ob in config protect   # check if config protected
1813   for i in ${CONFIG_PROTECT}   for i in ${CONFIG_PROTECT}
1814   do   do
1815   # ersetzen von $i nur wenn am anfang der variable   # only replace $i in the beginning of the variable
1816   TEST="${EXPFILE/#${MROOT}${i}/Protected}"   TEST="${EXPFILE/#${MROOT}${i}/Protected}"
1817   if [ "${TEST}" != "${EXPFILE}" ]   if [[ ${TEST} != ${EXPFILE} ]]
1818   then   then
1819   # setzen das es protected ist   # file is config proteced
1820   PROTECTED=TRUE   PROTECTED=TRUE
1821    
1822   # check ob nicht doch maskiert   # check if not masked
1823   for x in ${CONFIG_PROTECT_MASK}   for x in ${CONFIG_PROTECT_MASK}
1824   do   do
1825   TEST="${EXPFILE/#${MROOT}${x}/Protect_Masked}"   TEST="${EXPFILE/#${MROOT}${x}/Protect_Masked}"
1826   if [ "${TEST}" != "${EXPFILE}" ]   if [[ ${TEST} != ${EXPFILE} ]]
1827   then   then
1828   PROTECTED=MASKED   PROTECTED=MASKED
1829   fi   fi
1830   done   done
1831    
1832     # check if not ignored
1833     for x in ${CONFIG_PROTECT_IGNORE}
1834     do
1835     TEST="${EXPFILE/#${MROOT}${x}/Protect_Ignored}"
1836     if [[ ${TEST} != ${EXPFILE} ]]
1837     then
1838     PROTECTED=IGNORED
1839     fi
1840     done
1841   fi   fi
1842   done   done
1843    
# Line 1354  is_config_protected() Line 1852  is_config_protected()
1852   #echo "I'm protected, but masked - delete me"   #echo "I'm protected, but masked - delete me"
1853   return 3   return 3
1854   ;;   ;;
1855     IGNORED)
1856     #echo "I'm protected, but ignored - keep me, del update"
1857     return 4
1858     ;;
1859   *)   *)
1860   #echo "delete me"   #echo "delete me"
1861   return 0   return 0
# Line 1371  is_config_protected() Line 1873  is_config_protected()
1873  ###################################################  ###################################################
1874  count_protected_files()  count_protected_files()
1875  {  {
1876   ${MLIBDIR}/writeprotected "$1"   local file="$1"
1877     local dirname="${file%/*}"
1878     local filename="${file##*/}"
1879     local count
1880     local output
1881     local oldprotected
1882     local i
1883     local x
1884    
1885     # hack; do not honor a global set IFS like '§'
1886     local IFS
1887    
1888     count=0
1889    
1890     # check if there are already protected files
1891     for oldprotected in $(find ${dirname} -iname "._cfg????_${filename}" |
1892     sed -e "s:\(^.*/\)\(._cfg*_\)\(/.*$\):\1\2\3\%\2\%\3:" |
1893     sort -t'%' -k3 -k2 | cut -f1 -d'%')
1894     do
1895     count="$(echo ${oldprotected} | sed 's:.*\/._cfg\(.*\)_.*:\1:')"
1896     done
1897    
1898     # convert 0001 -> 1; 0120 -> 120 etc
1899     # use bash internal base functions to this task
1900     x="$((10#${count}))"
1901     for (( i=0; i<x; i++ ))
1902     do
1903     if [[ ${count:${i}:1} != 0 ]]
1904     then
1905     count="${count:${i}}"
1906     break
1907     fi
1908     done
1909    
1910     count="$(( ${count}+1 ))"
1911    
1912     # fill output up with zeros
1913     for (( i=${#count}; i < 4; i++ )); do output="${output}0"; done
1914     output="${output}${count}"
1915    
1916     echo "${output}"
1917  }  }
1918    
1919  # call with  # call with
# Line 1388  get_uninstall_candidates() Line 1930  get_uninstall_candidates()
1930   local list   local list
1931   local pcatdir   local pcatdir
1932   local protected   local protected
1933     local i
1934    
1935   # very basic getops   # very basic getops
1936   for i in $*   for i in $*
# Line 1400  get_uninstall_candidates() Line 1943  get_uninstall_candidates()
1943   shift   shift
1944   done   done
1945    
1946   # sanity checks; abort if not given  # it's not good to complain here about empty pnames; better to continue later anyway
1947   [ -z "${search_pname}" ] && die "get_uninstall_candidates() \$search_pname not given."  # # sanity checks; abort if not given
1948    # [ -z "${search_pname}" ] && die "get_uninstall_candidates() \$search_pname not given."
1949    
1950    
1951   # check needed global vars   # check needed global vars
1952   [ -z "${INSTALLDB}" ] && die "get_uninstall_candidates() \$INSTALLDB not set."   [ -z "${INSTALLDB}" ] && die "get_uninstall_candidates() \$INSTALLDB not set."
1953    
1954   # set pcatdir to '*' if empty   # set pcatdir to '*' if empty
1955   [ -z "${pcatdir}" ] && pcatdir=*   [ -z "${pcatdir}" ] && pcatdir='*'
1956    
1957   for pkg in ${MROOT}${INSTALLDB}/${pcatdir}/*   for pkg in ${MROOT}${INSTALLDB}/${pcatdir}/*
1958   do   do
# Line 1493  virtuals_add() Line 2037  virtuals_add()
2037   local oldline   local oldline
2038   local line i   local line i
2039   local installed_file   local installed_file
2040     local OLDIFS
2041    
2042   if virtuals_read ${virtualname}   if virtuals_read ${virtualname}
2043   then   then
2044   # make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already   # make sure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
2045   for i in $(virtuals_read ${virtualname} showpkgs)   for i in $(virtuals_read ${virtualname} showpkgs)
2046   do   do
2047   if [[ ${i} = ${pkgname} ]]   if [[ ${i} = ${pkgname} ]]
# Line 1515  virtuals_add() Line 2060  virtuals_add()
2060   # make a backup   # make a backup
2061   mv ${MROOT}${VIRTUALDB_FILE} ${MROOT}${VIRTUALDB_FILE}.old   mv ${MROOT}${VIRTUALDB_FILE} ${MROOT}${VIRTUALDB_FILE}.old
2062    
2063     OLDIFS="${IFS}"
2064   IFS=$'\n'   IFS=$'\n'
2065   for line in $(< ${MROOT}${VIRTUALDB_FILE}.old)   for line in $(< ${MROOT}${VIRTUALDB_FILE}.old)
2066   do   do
# Line 1526  virtuals_add() Line 2072  virtuals_add()
2072   echo "${line}" >> ${MROOT}${VIRTUALDB_FILE}   echo "${line}" >> ${MROOT}${VIRTUALDB_FILE}
2073   fi   fi
2074   done   done
2075     # unset IFS
2076   #unset IFS   IFS="${OLDIFS}"
2077   else   else
2078   echo -ne "${COLBLUE} *** ${COLDEFAULT}"   echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
2079   echo "register ${pkgname} as ${virtualname} ..."   echo "register ${pkgname} as ${virtualname} ..."
2080   echo "${virtualname} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}   echo "${virtualname} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
2081   fi   fi
# Line 1539  virtuals_add() Line 2085  virtuals_add()
2085    
2086  #deletes pakages from virtual database  #deletes pakages from virtual database
2087  #$1 virtualname; $2 pkgname  #$1 virtualname; $2 pkgname
2088  virtuals_del() {  virtuals_del()
2089    {
2090    
2091   local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED   local virtualname="$1"
2092     local pkgname="$2"
2093   VIRTUAL_NAME=$1   local oldline
2094   PKG_NAME=$2   local method
2095     local line i x
2096   #first check if exists   local pkg_installed
2097   if virtuals_read ${VIRTUAL_NAME}   local OLDIFS
2098    
2099     # first check if exists
2100     if virtuals_read ${virtualname}
2101   then   then
2102   #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}   # get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
2103   declare -i x=0   declare -i x=0
2104   for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)   for i in $(virtuals_read ${virtualname} showpkgs)
2105   do   do
2106   if [ "${i}" == "${PKG_NAME}" ]   if [[ ${i} = ${pkgname} ]]
2107   then   then
2108   PKG_INSTALLED=true   pkg_installed=true
2109   fi   fi
2110   ((x++))   ((x++))
2111   done   done
2112    
2113   #abort if not installed   # abort if not installed
2114   if [ "${PKG_INSTALLED}" != "true" ]   if [[ ${pkg_installed} != true ]]
2115   then   then
2116   echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}."   echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2117     echo "${pkgname} does not exists in ${virtualname}."
2118   return 0   return 0
2119   fi   fi
2120    
2121   if [ ${x} -ge 2 ]   if [ ${x} -ge 2 ]
2122   then   then
2123   METHOD=update   method=update
2124   else   else
2125   METHOD=delall   method=delall
2126   fi   fi
2127    
2128   #get the complete line   # get the complete line
2129   OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"   oldline="$(virtuals_read ${virtualname} showline)"
2130    
2131   #make a backup   # make a backup of the db
2132   mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old   mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
2133    
2134   #parse virtualdb   # parse virtualdb
2135     OLDIFS="${IFS}"
2136   IFS=$'\n'   IFS=$'\n'
2137   for line in $(< ${VIRTUALDB_FILE}.old)   for line in $(< ${VIRTUALDB_FILE}.old)
2138   do   do
2139   if [ "${line}" == "${OLD_LINE}" ]   if [[ ${line} = ${oldline} ]]
2140   then   then
2141   #delall or update?   #delall or update?
2142   case ${METHOD} in   case ${method} in
2143   update)   update)
2144   echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..."   echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2145   #del PKG_NAME from line   echo "Unlinking ${pkgname} from ${virtualname} in virtual database ..."
2146   echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE}   # del PKG_NAME from line
2147     echo "${line/ ${pkgname}/}" >> ${VIRTUALDB_FILE}
2148   ;;   ;;
2149   delall)   delall)
2150   echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..."   echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
2151   #continue; do not write anything   echo "Deleting ${virtualname} in virtual database ..."
2152     # continue; do not write anything
2153   continue   continue
2154   ;;   ;;
2155   esac   esac
# Line 1603  virtuals_del() { Line 2157  virtuals_del() {
2157   echo "${line}" >> ${VIRTUALDB_FILE}   echo "${line}" >> ${VIRTUALDB_FILE}
2158   fi   fi
2159   done   done
2160   unset IFS   # unset IFS
2161     IFS="${OLDIFS}"
2162   else   else
2163   echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database."   echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2164     echo "${virtualname} does not exists in virtual database."
2165   fi   fi
2166  }  }
2167    
# Line 1637  minclude() Line 2193  minclude()
2193  {  {
2194   local i   local i
2195    
2196   if [ -n "$@" ]   if [[ -n $* ]]
2197   then   then
2198   for i in $@   for i in $*
2199   do   do
2200   [[ ${MAGEDEBUG} = on ]] && \   mqueryfeature "debug" && \
2201   echo "--- Including ${MAGEDIR}/include/${i}.minc"   echo "--- Including ${MAGEDIR}/include/${i}.minc"
2202   source ${MAGEDIR}/include/${i}.minc   source ${MAGEDIR}/include/${i}.minc
2203   done   done
2204   [[ ${MAGEDEBUG} = on ]] && echo   mqueryfeature "debug" && echo
2205   fi   fi
2206  }  }
2207    
# Line 1653  sminclude() Line 2209  sminclude()
2209  {  {
2210   local i   local i
2211    
2212   if [ -n "$@" ]   if [[ -n $* ]]
2213   then   then
2214   for i in $@   for i in $*
2215   do   do
2216   echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"   echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
2217   source ${SMAGESCRIPTSDIR}/include/${i}.sminc   source ${SMAGESCRIPTSDIR}/include/${i}.sminc
# Line 1670  is_newer_mage_version_available() Line 2226  is_newer_mage_version_available()
2226   local newest_mage   local newest_mage
2227   local installed_mage   local installed_mage
2228    
2229   newest_mage="$( CATEGORIE=app-mage MAGENAME=mage get_highest_magefile;echo $(basename ${MAGEFILE} .mage) )"   newest_mage="$(basename $(get_highest_magefile app-mage mage) .mage)"
2230   installed_mage="$(magequery -n mage | cut -d' ' -f5)"   installed_mage="$(magequery -n mage | cut -d' ' -f5)"
2231    
2232   if [[ ${newest_mage} > ${installed_mage} ]]   if [[ ${newest_mage} > ${installed_mage} ]]
# Line 1679  is_newer_mage_version_available() Line 2235  is_newer_mage_version_available()
2235   echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}   echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
2236   echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}   echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
2237   echo "It is recommened to install this newer version"   echo "It is recommened to install this newer version"
2238   echo "or your current system installation may brake."   echo "or your current system installation may break."
2239   echo   echo
2240   echo -en "Please update mage by running "   echo -en "Please update mage by running "
2241   echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}   echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
# Line 1951  get_value_from_magefile() Line 2507  get_value_from_magefile()
2507   local magefile="$2"   local magefile="$2"
2508   local value   local value
2509    
2510     [[ -z ${var} ]] && return 1
2511     [[ -z ${magefile} ]] && return 1
2512    
2513   # local all possible vars of a mage file   # local all possible vars of a mage file
2514   # to prevent bad issues   # to prevent bad issues
2515   local PKGNAME   local PKGNAME
# Line 1961  get_value_from_magefile() Line 2520  get_value_from_magefile()
2520   local SDEPEND   local SDEPEND
2521   local PROVIDE   local PROVIDE
2522   local PKGTYPE   local PKGTYPE
2523     local MAGE_TARGETS
2524     local SPLIT_PACKAGE_BASE
2525   local preinstall   local preinstall
2526   local postinstall   local postinstall
2527     local preremove
2528     local postremove
2529    
2530   # sanity checks   # sanity checks
2531   [ -f ${magefile} ] && source ${magefile} || \   [ -f ${magefile} ] && source ${magefile} || \
# Line 1972  get_value_from_magefile() Line 2535  get_value_from_magefile()
2535   source ${magefile}   source ${magefile}
2536   eval value=\$$(echo ${var})   eval value=\$$(echo ${var})
2537   echo "${value}"   echo "${value}"
2538    
2539     # unset these functions
2540     unset -f preinstall
2541     unset -f postinstall
2542     unset -f preremove
2543     unset -f postremove
2544  }  }
2545    
2546  mage_install()  mage_install()
# Line 1988  mage_install() Line 2557  mage_install()
2557   local PKGTYPE   local PKGTYPE
2558   local preinstall   local preinstall
2559   local postinstall   local postinstall
2560     local preremove
2561     local postremove
2562    
2563   local pcat   local pcat
2564   local pname   local pname
# Line 1997  mage_install() Line 2568  mage_install()
2568   local count_current   local count_current
2569   local magefile   local magefile
2570   local src_install   local src_install
2571     local i
2572    
2573   # very basic getops   # very basic getops
2574   for i in $*   for i in $*
# Line 2070  mage_install() Line 2642  mage_install()
2642   echo B:${pbuild}   echo B:${pbuild}
2643   fi   fi
2644    
2645   smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2   if [[ -n ${MAGE_TARGETS} ]]
2646     then
2647     # basic svn compat
2648     if [[ -d ${SMAGESCRIPTSDIR}/.svn ]]
2649     then
2650     for i in ${SMAGESCRIPTSDIR}/*/${pname/${MAGE_TARGETS}/}/${pname/${MAGE_TARGETS}/}-${pver}-${pbuild}.smage2
2651     do
2652     smage2file="${i}"
2653     done
2654     else
2655     smage2file=${SMAGESCRIPTSDIR}/${pname/${MAGE_TARGETS}/}/${pname/${MAGE_TARGETS}/}-${pver}-${pbuild}.smage2
2656     fi
2657    
2658     elif [[ -n ${SPLIT_PACKAGE_BASE} ]]
2659     then
2660     # basic svn compat
2661     if [[ -d ${SMAGESCRIPTSDIR}/.svn ]]
2662     then
2663     for i in ${SMAGESCRIPTSDIR}/*/${SPLIT_PACKAGE_BASE}/${SPLIT_PACKAGE_BASE}-${pver}-${pbuild}.smage2
2664     do
2665     smage2file="${i}"
2666     done
2667     else
2668     smage2file=${SMAGESCRIPTSDIR}/${SPLIT_PACKAGE_BASE}/${SPLIT_PACKAGE_BASE}-${pver}-${pbuild}.smage2
2669     fi
2670    
2671     else
2672     # basic svn compat
2673     if [[ -d ${SMAGESCRIPTSDIR}/.svn ]]
2674     then
2675     for i in ${SMAGESCRIPTSDIR}/*/${pname}/${pname}-${pver}-${pbuild}.smage2
2676     do
2677     smage2file="${i}"
2678     done
2679     else
2680     smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2
2681     fi
2682     fi
2683    
2684   if [ -f "${smage2file}" ]   if [ -f "${smage2file}" ]
2685   then   then
2686     echo -e " ${COLBLUE}***${COLDEFAULT} building package from source ... "
2687   smage2 ${smage2file} || die "compile failed"   smage2 ${smage2file} || die "compile failed"
2688   else   else
2689   echo   echo
# Line 2086  mage_install() Line 2697  mage_install()
2697   if [[ ${PKGTYPE} != virtual ]] && \   if [[ ${PKGTYPE} != virtual ]] && \
2698   [[ ${PKGTYPE} != sources ]]   [[ ${PKGTYPE} != sources ]]
2699   then   then
2700   # show a verbose message on src-install   unpack_package "${magefile}"
2701   if [[ ${src_install} = true ]]   echo -e " ${COLBLUE}***${COLDEFAULT} merging files into system ... "
  then  
  echo -ne "${COLBLUE} *** ${COLDEFAULT}"  
  echo -ne "merging files: "  
  echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"  
  echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"  
  fi  
2702   build_doinstall ${PKGNAME}   build_doinstall ${PKGNAME}
2703   fi   fi
2704    
# Line 2149  mage_install() Line 2754  mage_install()
2754  # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"  # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2755  # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "  # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2756   echo "successfully installed."   echo "successfully installed."
2757    
2758     # unset these functions
2759     unset -f preinstall
2760     unset -f postinstall
2761     unset -f preremove
2762     unset -f postremove
2763  }  }
2764    
2765  md5sum_packages()  md5sum_packages()
# Line 2201  md5sum_packages() Line 2812  md5sum_packages()
2812   then   then
2813   echo -ne "${COLBLUE} *** ${COLDEFAULT}"   echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2814   echo -ne "checking md5sum (${count_current}/${count_total}): "   echo -ne "checking md5sum (${count_current}/${count_total}): "
2815   ( cd ${PKGDIR}; md5sum --check ${md5file}) || die "md5 for ${pkgfile} failed"   mchecksum --rundir "${PKGDIR}" --file "${md5file}" --method md5 || die "md5 for ${pkgfile} failed"
2816   else   else
2817   echo -ne "${COLBLUE} --- ${COLDEFAULT}"   echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2818   echo -e "!! no md5sum file found for ${pkgfile} :("   echo -e "!! no md5sum file found for ${pkgfile} :("
# Line 2253  uninstall_packages() Line 2864  uninstall_packages()
2864   echo -ne "${COLBLUE} --- ${COLDEFAULT}"   echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2865   echo "following candidate(s) will be removed:"   echo "following candidate(s) will be removed:"
2866   echo -ne "${COLBLUE} --- ${COLDEFAULT}"   echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2867   echo -ne "\033[1m${can_pcat}/${can_pname}:${COLDEFAULT}"   echo -ne "${COLBOLD}${can_pcat}/${can_pname}:${COLDEFAULT}"
2868   echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}"   echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}"
2869   echo   echo
2870   echo -ne "${COLBLUE} --- ${COLDEFAULT}"   if [ ${MAGE_UNINSTALL_TIMEOUT} -gt 0 ]
2871   echo "( Press [CTRL+C] to abort )"   then
2872   echo -ne "${COLBLUE} --- ${COLDEFAULT}"   echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2873   echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..."   echo "( Press [CTRL+C] to abort )"
2874   for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--))   echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2875   do   echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..."
2876   echo -ne "${COLRED} ${i}${COLDEFAULT}"   for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--))
2877   sleep 1   do
2878   done   echo -ne "${COLRED} ${i}${COLDEFAULT}"
2879   echo   sleep 1
2880   echo   done
2881     echo
2882     echo
2883     fi
2884    
2885   for pkg in ${list}   for pkg in ${list}
2886   do   do
# Line 2304  mage_uninstall() Line 2918  mage_uninstall()
2918   local PKGTYPE   local PKGTYPE
2919   local preinstall   local preinstall
2920   local postinstall   local postinstall
2921     local preremove
2922     local postremove
2923    
2924   local pcat   local pcat
2925   local pname   local pname
# Line 2339  mage_uninstall() Line 2955  mage_uninstall()
2955   echo -ne "${COLBLUE} <<< ${COLDEFAULT}"   echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
2956   echo -n "removing: "   echo -n "removing: "
2957   echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"   echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2958   echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"   echo -e "${COLRED}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2959    
2960   magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"   magefile="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
2961   source ${magefile}   source ${magefile}
2962    
2963   ## preremove scripts   ## preremove scripts
# Line 2401  mage_uninstall() Line 3017  mage_uninstall()
3017  # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"  # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
3018  # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "  # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
3019   echo "successfully removed."   echo "successfully removed."
3020    
3021     # unset these functions
3022     unset -f preinstall
3023     unset -f postinstall
3024     unset -f preremove
3025     unset -f postremove
3026  }  }
3027    
3028  show_etc_update_mesg() {  show_etc_update_mesg()
3029    {
3030   [ ${MAGE_PROTECT_COUNTER} -eq 0 ] && return 0   [ ${MAGE_PROTECT_COUNTER} -eq 0 ] && return 0
3031    
3032   echo   echo
# Line 2415  show_etc_update_mesg() { Line 3038  show_etc_update_mesg() {
3038   echo "Please run 'etc-update' to update your configuration files."   echo "Please run 'etc-update' to update your configuration files."
3039   echo   echo
3040  }  }
3041    
3042    pkgsearch()
3043    {
3044     local string="$1"
3045     local result
3046     local pkg
3047     local pcat
3048     local pname
3049     local magefile
3050     local pver
3051     local pbuild
3052     local state
3053     local descriptiom
3054     local homepage
3055     local license
3056     local i
3057     local all_installed
3058     local ipver
3059     local ipbuild
3060     local latest_available
3061     local depsfull
3062     local sdepsfull
3063     local deps
3064     local sdeps
3065     local dep
3066     local sign
3067    
3068     # only names no versions
3069     result="$(find ${MAGEDIR} -mindepth 2 -maxdepth 2 -type d -name '*'${string}'*'| sed '/profiles/d' | sed '/includes/d')"
3070     #result="$(find ${MAGEDIR} -type f -name '*'${string}'*'.mage | sort)"
3071    
3072     # nothing found
3073     [[ -z ${result} ]] && die "No package found containing '${string}' in the name."
3074    
3075     for pkg in ${result}
3076     do
3077     # dirty, but does the job
3078     pcat="$(magename2pcat ${pkg}/foo)"
3079     pname="$(magename2pname ${pkg}-foo-foo)"
3080    
3081     # get highest version available
3082     magefile=$(get_highest_magefile ${pcat} ${pname})
3083    
3084     if [[ ! -z ${magefile} ]]
3085     then
3086     # now get all needed infos to print a nice output
3087     pver="$(magename2pver ${magefile})"
3088     pbuild="$(magename2pbuild ${magefile})"
3089     state="$(get_value_from_magefile STATE ${magefile})"
3090     description="$(get_value_from_magefile DESCRIPTION ${magefile})"
3091     homepage="$(get_value_from_magefile HOMEPAGE ${magefile})"
3092     license="$(get_value_from_magefile LICENSE ${magefile})"
3093    
3094     # all installed
3095     for i in $(get_uninstall_candidates --pname ${pname} --pcat ${pcat})
3096     do
3097     ipver="$(magename2pver ${i})"
3098     ipbuild="$(magename2pbuild ${i})"
3099    
3100     if [[ -z ${all_installed} ]]
3101     then
3102     all_installed="${ipver}-${ipbuild}"
3103     else
3104     all_installed="${all_installed} ${ipver}-${ipbuild}"
3105     fi
3106     done
3107     [[ -z ${all_installed} ]] && all_installed="none"
3108    
3109     case ${state} in
3110     stable) state=${COLGREEN}"[s] ";;
3111     testing) state=${COLYELLOW}"[t] ";;
3112     unstable) state=${COLRED}"[u] ";;
3113     old) state=${COLGRAY}"[o] ";;
3114     esac
3115    
3116     latest_available="${pver}-${pbuild}"
3117     else
3118     # package is masked
3119     state="${COLRED}[m] "
3120     latest_available="${COLRED}masked for this distribution.${COLDEFAULT}"
3121     fi
3122    
3123     depsfull="$(get_value_from_magefile DEPEND ${magefile})"
3124     sdepsfull="$(get_value_from_magefile SDEPEND ${magefile})"
3125    
3126     while read sign dep
3127     do
3128     case ${dep} in
3129     "") continue;;
3130     esac
3131    
3132     if [[ -z ${deps} ]]
3133     then
3134     deps="$(basename ${dep%-*})"
3135     else
3136     deps="${deps} $(basename ${dep%-*})"
3137     fi
3138     done << EOF
3139    ${depsfull}
3140    EOF
3141    
3142     while read sign dep
3143     do
3144     case ${dep} in
3145     "") continue;;
3146     esac
3147    
3148     if [[ -z ${sdeps} ]]
3149     then
3150     sdeps="$(basename ${dep%-*})"
3151     else
3152     sdeps="${sdeps} $(basename ${dep%-*})"
3153     fi
3154     done << EOF
3155    ${sdepsfull}
3156    EOF
3157    
3158     echo -e "${state}${pcat}/${pname}"${COLDEFAULT}
3159     echo -e "      Latest available:   ${latest_available}"
3160     echo "      Installed versions: ${all_installed}"
3161     echo "      Description: ${description}"
3162     echo "      Homepage: ${homepage}"
3163     if [[ ! -z ${license} ]]
3164     then
3165     echo "      License:  ${license}"
3166     fi
3167     echo "      Depends:  ${deps}"
3168     echo "      SDepends: ${sdeps}"
3169     echo
3170    
3171     unset pcat
3172     unset pname
3173     unset magefile
3174     unset pver
3175     unset pbuild
3176     unset state
3177     unset descriptiom
3178     unset homepage
3179     unset all_installed
3180     unset ipver
3181     unset ipbuild
3182     unset depsfull
3183     unset sdepsfull
3184     unset deps
3185     unset sdeps
3186     unset dep
3187     unset sign
3188     done
3189    }
3190    
3191    export_inherits()
3192    {
3193     local include="$1"
3194     shift
3195    
3196     while [ "$1" ]
3197     do
3198     local functions="$1"
3199    
3200     # sanity checks
3201     [ -z "${include}" ] && die "export_inherits(): \$include not given."
3202     [ -z "${functions}" ] && die "export_inherits(): \$functions not given."
3203    
3204     eval "${functions}() { ${include}_${functions} ; }"
3205    
3206     # debug
3207     mqueryfeature "debug" && typeset -f "${functions}"
3208    
3209     shift
3210     done
3211    }
3212    
3213    mlibdir()
3214    {
3215     local libdir=lib
3216     [[ ${ARCH} = x86_64 ]] && libdir=lib64
3217    
3218     echo "${libdir}"
3219    }
3220    
3221    ## blacklisted ${magefile}
3222    blacklisted()
3223    {
3224     [[ -z ${MAGE_DISTRIBUTION} ]] && local MAGE_DISTRIBUTION=stable
3225    
3226     # compat
3227     [[ ${USE_UNSTABLE} = true ]] && local MAGE_DISTRIBUTION=unstable
3228     [[ ${USE_TESTING} = true ]] && local MAGE_DISTRIBUTION=testing
3229    
3230     # support both types for the moment
3231     if [[ -f /etc/mage-profile/package.blacklist-${ARCH}-${MAGE_DISTRIBUTION} ]]
3232     then
3233     local EXCLUDED="/etc/mage-profile/package.blacklist-${ARCH}-${MAGE_DISTRIBUTION}"
3234     else
3235     local EXCLUDED="/etc/mage-profile/package.blacklist-${ARCH}"
3236     fi
3237    
3238     # return 0 if the list not exist; nothin is masked
3239     [[ ! -f ${EXCLUDED} ]] && return 0
3240    
3241     local MAGEFILE="$1"
3242    
3243     local PCAT="$(magename2pcat ${MAGEFILE})"
3244     local PNAME="$(magename2pname ${MAGEFILE})"
3245     local PVER="$(magename2pver ${MAGEFILE})"
3246     local PBUILD="$(magename2pbuild ${MAGEFILE})"
3247    
3248     local EXPCAT EXPNAME EXPVER EXPBUILD
3249     while read EXPCAT EXPNAME EXPVER EXPBUILD
3250     do
3251     # ignore spaces and comments
3252             case "${EXPCAT}" in
3253                     \#*|"") continue ;;
3254             esac
3255    
3256     # exclude full pver
3257     if [[ -n ${PCAT} ]] && [[ -n ${PNAME} ]] &&
3258     [[ -n ${EXPCAT} ]] && [[ -n ${EXPNAME} ]] &&
3259     [[ -n ${PVER} ]] && [[ -n ${PBUILD} ]] &&
3260     [[ -n ${EXPVER} ]] && [[ -n ${EXPBUILD} ]]
3261     then
3262     [[ ${EXPCAT}/${EXPNAME}-${EXPVER}-${EXPBUILD} = ${PCAT}/${PNAME}-${PVER}-${PBUILD} ]] && return 1
3263     fi
3264    
3265     # exclude pcat/pname only
3266     if [[ -n ${PCAT} ]] && [[ -n ${PNAME} ]] &&
3267     [[ -n ${EXPCAT} ]] && [[ -n ${EXPNAME} ]] &&
3268     [[ -z ${EXPVER} ]] && [[ -z ${EXPBUILD} ]]
3269     then
3270     [[ ${EXPCAT}/${EXPNAME} = ${PCAT}/${PNAME} ]] && return 1
3271     fi
3272     done << EOF
3273    $( cat ${EXCLUDED}; echo)
3274    EOF
3275    
3276     return 0
3277    }
3278    
3279    # need_busybox_support ${cmd}
3280    # return 0 (no error = needs busybox support) or return 1 (error = no busybox support required)
3281    need_busybox_support()
3282    {
3283     local cmd
3284     local busybox
3285     cmd="$1"
3286    
3287     for busybox in {,/usr}/bin/busybox
3288     do
3289     if [[ -x ${busybox} ]]
3290     then
3291     if [[ $(readlink $(which ${cmd})) = ${busybox} ]]
3292     then
3293     # needs busybox support
3294     return 0
3295     fi
3296     fi
3297     done
3298    
3299     # no busybox
3300     return 1
3301    }
3302    
3303    # busybox_filter_wget_options ${wget_opts}
3304    busybox_filter_wget_options()
3305    {
3306     local opts="$@"
3307     local i
3308     local fixed_opts
3309    
3310     if need_busybox_support wget
3311     then
3312     for i in ${opts}
3313     do
3314     # show only the allowed ones
3315     case ${i} in
3316     -c|--continue) fixed_opts+=" -c" ;;
3317     -s|--spider) fixed_opts+=" -s" ;;
3318     -q|--quiet) fixed_opts+=" -q" ;;
3319     -O|--output-document) shift; fixed_opts+=" -O $1" ;;
3320     --header) shift; fixed_opts+=" --header $1" ;;
3321     -Y|--proxy) shift; fixed_opts+=" -Y $1" ;;
3322     -P) shift; fixed_opts+=" -P $1" ;;
3323     --no-check-certificate) fixed_opts+=" --no-check-certificate ${i}" ;;
3324     -U|--user-agent) shift; fixed_opts+=" -U ${i}" ;;
3325     # simply drop all other opts
3326     *) continue ;;
3327     esac
3328     done
3329    
3330     echo "${fixed_opts}"
3331     else
3332     echo "${opts}"
3333     fi
3334    }
3335    
3336    have_root_privileges()
3337    {
3338     local retval
3339    
3340     if [[ $(id -u) = 0 ]]
3341     then
3342     retval=0
3343     else
3344     retval=1
3345     fi
3346    
3347     return ${retval}
3348    }
3349    
3350    known_mage_feature()
3351    {
3352     local feature="$1"
3353     local retval
3354    
3355     case "${feature}" in
3356     autosvc|!autosvc) retval=0 ;;
3357     buildlog|!buildlog) retval=0 ;;
3358     ccache|!ccache) retval=0 ;;
3359     check|!check) retval=0 ;;
3360     compressdoc|!compressdoc) retval=0 ;;
3361     debug|!debug) retval=0 ;;
3362     distcc|!distcc) retval=0 ;;
3363     kernelsrcunpack|!kernelsrcunpack) retval=0 ;;
3364     libtool|!libtool) retval=0 ;;
3365     linuxsymlink|!linuxsymlink) retval=0 ;;
3366     pkgbuild|!pkgbuild) retval=0 ;;
3367     pkgdistrotag|!pkgdistrotag) retval=0 ;;
3368     purge|!purge) retval=0 ;;
3369     qalint|!qalint) retval=0 ;;
3370     regentree|!regentree) retval=0 ;;
3371     resume|!resume) retval=0 ;;
3372     srcpkgbuild|!srcpkgbuild) retval=0 ;;
3373     srcpkgtarball|!srcpkgtarball) retval=0 ;;
3374     static|!static) retval=0 ;;
3375     stepbystep|!stepbystep) retval=0 ;;
3376     strip|!strip) retval=0 ;;
3377     verbose|!verbose) retval=0 ;;
3378     *) retval=1 ;;
3379     esac
3380    
3381     return "${retval}"
3382    }
3383    
3384    load_mage_features()
3385    {
3386     for i in ${MAGE_FEATURES_GLOBAL[*]} ${MAGE_FEATURES[*]}
3387     do
3388     FVERBOSE=off msetfeature ${i}
3389     done
3390    }
3391    
3392    msetfeature()
3393    {
3394     local feature
3395     local count
3396     local i
3397     local found
3398    
3399     for feature in $@
3400     do
3401     found=0
3402     count="${#MAGE_FEATURES_CURRENT[*]}"
3403    
3404     if ! known_mage_feature "${feature}"
3405     then
3406     [[ ${FVERBOSE} = off ]] || echo -e "${COLRED}Unknown feature '${feature}', ignoring it${COLDEFAULT}"
3407     return 3
3408     fi
3409    
3410     for ((i=0; i<count; i++))
3411     do
3412     if [[ ${MAGE_FEATURES_CURRENT[${i}]} = ${feature} ]]
3413     then
3414     [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature}' already enabled${COLDEFAULT}"
3415     MAGE_FEATURES_CURRENT[${i}]="${feature}"
3416     found=1
3417     elif [[ ${MAGE_FEATURES_CURRENT[${i}]} = !${feature} ]]
3418     then
3419     [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature}' currently disabled, enabling it!${COLDEFAULT}"
3420     MAGE_FEATURES_CURRENT[${i}]="${feature}"
3421     found=1
3422     elif [[ ${MAGE_FEATURES_CURRENT[${i}]} = ${feature//!} ]]
3423     then
3424     [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature//!}' currently enabled, disabling it!${COLDEFAULT}"
3425     MAGE_FEATURES_CURRENT[${i}]="${feature}"
3426     found=1
3427     fi
3428     done
3429    
3430     # if the feature was not found after proccessing the whole array
3431     # it was not declared. in this case enable it
3432     if [[ ${found} = 0 ]]
3433     then
3434     [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature}' was not declared, enabling it!${COLDEFAULT}"
3435     MAGE_FEATURES_CURRENT=( ${MAGE_FEATURES_CURRENT[*]} "${feature}" )
3436     fi
3437    
3438     export MAGE_FEATURE_CURRENT
3439     done
3440    }
3441    
3442    mqueryfeature()
3443    {
3444     local feature="$1"
3445     local retval=1
3446     local i
3447    
3448     if known_mage_feature "${feature}"
3449     then
3450     for i in ${MAGE_FEATURES_CURRENT[*]}
3451     do
3452     if [[ ${i} = ${feature} ]]
3453     then
3454     retval=0
3455     break # found break here
3456     fi
3457     done
3458     else
3459     [[ ${FVERBOSE} = off ]] || echo -e "${COLRED}Unknown feature '${feature}', ignoring it${COLDEFAULT}"
3460     retval=3
3461     fi
3462    
3463     return ${retval}
3464    }
3465    
3466    mprintfeatures()
3467    {
3468     echo -e "${COLRED}Global features:${COLDEFAULT} ${MAGE_FEATURES_GLOBAL[*]}"
3469     echo -e "${COLYELLOW}Local features:${COLDEFAULT} ${MAGE_FEATURES[*]}"
3470     echo -e "${COLGREEN}Current features:${COLDEFAULT} ${MAGE_FEATURES_CURRENT[*]}"
3471    }

Legend:
Removed from v.226  
changed lines
  Added in v.2156