--- trunk/mage/usr/lib/mage/depwalker.sh 2005/09/09 16:35:46 226 +++ trunk/mage/usr/lib/mage/depwalker.sh 2011/12/28 10:02:01 1563 @@ -1,7 +1,6 @@ #!/bin/bash - -#depwalker -# $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/depwalker.sh,v 1.1 2005-09-09 16:35:27 niro Exp $ +# $Id$ +# dependeny walker # default die function die() @@ -10,37 +9,17 @@ exit 1 } -# # include all needed files -# [ -f ${MLIBDIR}/conf/mage.rc.global ] && \ -# source ${MLIBDIR}/conf/mage.rc.global || \ -# die "${MLIBDIR}/conf/mage.rc.global missing" -# -# [ -f /etc/mage.rc ] && source /etc/mage.rc || \ -# die "Your /etc/mage.rc is missing. Aborting." -# -# [ -f ${MLIBDIR}/mage.functions.sh ] && \ -# source ${MLIBDIR}/mage.functions.sh || \ -# die "mage functions missing" - -# for tests only -source /home/tjoke/alx-cvs/magellan-src/mage/usr/lib/mage/mage.rc.global -source /etc/mage.rc -source /home/tjoke/alx-cvs/magellan-src/mage/usr/lib/mage/mage4.functions.sh - -# not serios if missing, only for colors -[ -f /etc/init.d/functions ] && source /etc/init.d/functions - -# disable colors if wanted -if [[ ${NOCOLORS} = true ]] -then - COLRED="" - COLGREEN="" - COLYELLOW="" - COLBLUE="" - COLMAGENTA="" - COLWHITE="" - COLDEFAULT="" -fi +# include all needed files +[ -f /etc/mage.rc.global ] && \ + source /etc/mage.rc.global || \ + die "/etc/mage.rc.global missing" + +[ -f ${MAGERC} ] && source ${MAGERC} || \ + die "Your ${MAGERC} is missing. Aborting." + +[ -f ${MLIBDIR}/mage4.functions.sh ] && \ + source ${MLIBDIR}/mage4.functions.sh || \ + die "mage functions missing" usage() { @@ -53,9 +32,10 @@ echo " -v --pver version number of the package" echo " -b --pbuild build number of the package" echo " -m --method which calc method should be used:" - echo " install srcinstall depend srcdepend" + echo " install, srcinstall, depend, srcdepend" + echo " upgrade, srcupgrade" echo - echo "method,name, version and build must be given !" + echo "method, name, version and build must be given !" echo exit 1 } @@ -90,9 +70,36 @@ ALLDEPS="" MAGEFILE="${MAGEDIR}/${PCAT}/${PNAME}/${PNAME}-${PVER}-${PBUILD}.mage" +# much faster than fgrep +checklist_alldeps() +{ + local i + local item="$1" + + for i in ${ALLDEPS} + do + [[ ${i} = ${item} ]] && return 1 + done + + return 0 +} + +checklist_processeddeps() +{ + local i + local item="$1" + + for i in ${PROCESSEDDEPS} + do + [[ ${i} = ${item} ]] && return 1 + done + + return 0 +} + ##################### -## rumwandern /path/to/mage/file/.mage -rumwandern() +## depwalking /path/to/mage/file/.mage +depwalking() { unset DEPEND unset SDEPEND @@ -108,14 +115,27 @@ local INSTALL_VIRTUAL local PNAME local PCAT + local PVER + local PBUILD DFILE="$1" source ${DFILE} + + # forced nodeps + if [[ ${NODEPS} = true ]] + then + DEPEND="" + SDEPEND="" + fi + MY_DEPEND="${DEPEND}" # for srcinstall & srcdepend only; SDEPEND also needed - if [[ ${METHOD} = srcinstall ]] || [[ ${METHOD} = srcpretend ]] + if [[ ${METHOD} = srcinstall ]] || \ + [[ ${METHOD} = srcpretend ]] || \ + [[ ${METHOD} = srcupgrade ]] || \ + [[ ${METHOD} = srcuppretend ]] then # only if SDEPEND is not zero if [ -n "${SDEPEND}" ] @@ -141,6 +161,23 @@ while read SYM DEPNAME do + # exclude empty depnames + [[ -z ${DEPNAME} ]] && continue + + # exclude all already processed deps -without version + if ! checklist_processeddeps "${DEPNAME%-*}" + then + continue + fi + + # mark depfile as processed to prevent double runs -without version + # but do not add any virtuals to PROCESSEDDEPS or their resolved + # pkgnames will be ignored and they are missing on the dependecy-list + if [[ ${DEPNAME/virtual\//} = ${DEPNAME} ]] + then + PROCESSEDDEPS="${PROCESSEDDEPS} ${DEPNAME%-*}" + fi + HIGHEST_DEPFILE=$(dep2highest_magefile "${DEPNAME}") PCAT="$(magename2pcat ${HIGHEST_DEPFILE})" @@ -148,13 +185,16 @@ PVER="$(magename2pver ${HIGHEST_DEPFILE})" PBUILD="$(magename2pbuild ${HIGHEST_DEPFILE})" - ## check ob schon in ALLDEPS enthalten dann mach weiter - if [ -z "$(echo ${ALLDEPS} | fgrep "${HIGHEST_DEPFILE}")" ] + ## dep already in ALLDEPS? then going on + + # usage of fgrep is extremly slow and consumes a lot of cpu power + #if [ -z "$(echo ${ALLDEPS} | fgrep "${HIGHEST_DEPFILE}")" ] + if checklist_alldeps "${HIGHEST_DEPFILE}" then ### check ob DFILE schon installiert ist ### if [ ! -d ${MROOT}${INSTALLDB}/${PCAT}/${PNAME}-${PVER}-${PBUILD} ] then - rumwandern ${HIGHEST_DEPFILE} + depwalking ${HIGHEST_DEPFILE} ALLDEPS="${ALLDEPS} ${HIGHEST_DEPFILE}" fi fi @@ -164,25 +204,74 @@ return 0 } +[[ ${METHOD} = pretend ]] || \ + [[ ${METHOD} = srcpretend ]] || \ + [[ ${METHOD} = uppretend ]] || \ + [[ ${METHOD} = srcuppretend ]] && \ + echo -n "Calculating dependencies ... " -### abort if this package is already installed (retval 3) -# maybe later ? -#[ -d ${INSTALLDB}/${PCAT}/${PNAME}-${PVER}-${PBUILD} ] && exit 3 -[[ ${METHOD} = pretend ]] || [[ ${METHOD} = srcpretend ]] && \ - echo -n "Calculating dependencies ... " +if [[ ${METHOD} = upgrade ]] || \ + [[ ${METHOD} = srcupgrade ]] || \ + [[ ${METHOD} = uppretend ]] || \ + [[ ${METHOD} = srcuppretend ]] +then + INSTDEPS="$(${MLIBDIR}/magequery.sh -i)" + for dep in ${INSTDEPS} + do + PCAT="$(magename2pcat ${dep} installdb)" + PNAME="$(magename2pname ${dep})" -# get dependencies the package -rumwandern ${MAGEFILE} + # get the highest mage file from mage-db + MAGEFILE="$(get_highest_magefile ${PCAT} ${PNAME})" -[[ ${METHOD} = pretend ]] || [[ ${METHOD} = srcpretend ]] && echo "done" + # if no install candidate was found, record this + # and process with the next one + if [[ -z ${MAGEFILE} ]] + then + NO_UPGRADE_CANDIDATE="${NO_UPGRADE_CANDIDATE} ${PCAT}/${PNAME}" + continue + fi + # now get the pver&pbuild from the new file + PVER="$(magename2pver ${MAGEFILE})" + PBUILD="$(magename2pbuild ${MAGEFILE})" + + # do not walk files which are installed + if [ ! -d ${INSTALLDB}/${PCAT}/${PNAME}-${PVER}-${PBUILD} ] + then + # get dependencies the package + depwalking ${MAGEFILE} + + # now add the package itself to the dependencies + # (if not exists already) + #if [ -z "$(echo ${ALLDEPS} | fgrep "${MAGEFILE}")" ] + if checklist_alldeps "${MAGEFILE}" + then + ALLDEPS="${ALLDEPS} ${MAGEFILE}" + fi + fi + done +else + # get all dependencies of the package + depwalking ${MAGEFILE} + + # now add the package itself to the dependencies + ALLDEPS="${ALLDEPS} ${MAGEFILE}" +fi + +[[ ${METHOD} = pretend ]] || \ + [[ ${METHOD} = srcpretend ]] || \ + [[ ${METHOD} = uppretend ]] || \ + [[ ${METHOD} = srcuppretend ]] && \ + echo "done" -# now add the package itself to the dependencies -ALLDEPS="${ALLDEPS} ${MAGEFILE}" ## show output of pretend -if [[ ${METHOD} = pretend ]] || [[ ${METHOD} = srcpretend ]] +if [[ ${METHOD} = pretend ]] || \ + [[ ${METHOD} = srcpretend ]] || \ + [[ ${METHOD} = uppretend ]] || \ + [[ ${METHOD} = srcuppretend ]] then # this is a little bit faster declare -i x=0 @@ -209,10 +298,25 @@ echo "done" echo -e "${list}" echo + + if [[ ! -z ${NO_UPGRADE_CANDIDATE} ]] + then + echo -e "${COLRED}Currently no candidates found for:${COLDEFAULT}" + for i in ${NO_UPGRADE_CANDIDATE} + do + echo -e "${COLRED} ${i}${COLDEFAULT}" + done + echo + echo -e "${COLRED}Please consider to uninstall all of them first,${COLDEFAULT}" + echo -e "${COLRED}because these packages does not exist in this distribution${COLDEFAULT}" + echo -e "${COLRED}anymore and there will be no further support for them.${COLDEFAULT}" + echo + fi fi ## return output from src/install deps -[[ ${METHOD} = install ]] || [[ ${METHOD} = srcinstall ]] && echo "${ALLDEPS}" - -# delete ${BUILDDIR}/virtuals if exists as not needed anymore -#[ -d ${BUILDDIR}/virtuals ] && rm -rf ${BUILDDIR}/virtuals +[[ ${METHOD} = install ]] || \ + [[ ${METHOD} = srcinstall ]] || \ + [[ ${METHOD} = upgrade ]] || \ + [[ ${METHOD} = srcupgrade ]] && \ + echo "${ALLDEPS}"