--- trunk/mage/usr/lib/mage/depwalker.sh 2005/09/10 13:34:56 235 +++ branches/mage-next/src/depwalker.in 2014/08/12 15:23:54 2736 @@ -1,67 +1,52 @@ #!/bin/bash +# $Id$ +# dependeny walker -#depwalker -# $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/depwalker.sh,v 1.3 2005-09-10 13:34:56 niro Exp $ +# set default variables +: ${MAGERC="@@SYSCONFDIR@@/mage.rc"} +: ${MLIBDIR="@@MAGELIBDIR@@"} + +# first of all include common functions +source ${MLIBDIR}/common.functions.sh || exit 1 +source @@SYSCONFDIR@@/mage.rc.global || die "@@SYSCONFDIR@@/mage.rc.global missing" +source ${MAGERC} || die "Your ${MAGERC} is missing. Aborting." +source ${MLIBDIR}/mage4.functions.sh || die "mage functions missing" +source ${MLIBDIR}/smage2.functions.sh || die "smage functions missing" -# default die function -die() +decho() { - echo ${COLRED}"$@"${COLDEFAULT} - exit 1 + if [[ ${DEBUG} = 1 ]] + then + echo "DEBUG: $@" >&2 + fi } -# include all needed files -[ -f /etc/mage.rc.global ] && \ - source /etc/mage.rc.global || \ - die "/etc/mage.rc.global missing" - -[ -f /etc/mage.rc ] && source /etc/mage.rc || \ - die "Your /etc/mage.rc is missing. Aborting." - -[ -f ${MLIBDIR}/mage4.functions.sh ] && \ - source ${MLIBDIR}/mage4.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 -# MLIBDIR=/home/tjoke/alx-cvs/magellan-src/mage/usr/lib/mage - -# not serious if missing, only needed 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 - usage() { echo echo "Usage: $(basename $0) [command] [arg] ..." echo echo " -h --help shows this help" - echo " -c --pcat categorie of the package" + echo " -c --pcat category of the package" echo " -n --pname name of the package" 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 " upgrade, srcupgrade" + echo " install, srcinstall, pretend, srcpretend" + echo " upgrade, srcupgrade," + echo " install-build-prerequisites," + echo " pretend-build-prerequisites" + echo " -d --debug enable debug mode" + echo " -s --smage use a smage to calculate dependencies" echo - echo "method,name, version and build must be given !" + echo "method, category, name, version and build must be given !" echo exit 1 } +# always default debug=0 +DEBUG=0 + # very basic getops for i in $* do @@ -71,16 +56,21 @@ --pver|-v) shift; PVER="$1" ;; --pbuild|-b) shift; PBUILD="$1" ;; --method|-m) shift; METHOD="$1" ;; + --debug|-d) shift; DEBUG=1 ;; + --smage|-s) shift; SMAGEFILE="$1"; SILENT=1; FVERBOSE=off ;; --help|-h) usage ;; esac shift done # sanity checks; abort if not given -[ -z "${PCAT}" ] && usage -[ -z "${PNAME}" ] && usage -[ -z "${PVER}" ] && usage -[ -z "${PBUILD}" ] && usage +if [[ -z ${SMAGEFILE} ]] +then + [ -z "${PCAT}" ] && usage + [ -z "${PNAME}" ] && usage + [ -z "${PVER}" ] && usage + [ -z "${PBUILD}" ] && usage +fi [ -z "${METHOD}" ] && usage # check needed global vars @@ -90,11 +80,47 @@ # other needed vars ALLDEPS="" +if [[ -n ${SMAGEFILE} ]] +then + if [[ -e ${SMAGEFILE} ]] + then + smagesource "${SMAGEFILE}" + else + die "Smage file '${SMAGEFILE}' does not exist!" + fi +fi 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 @@ -110,17 +136,33 @@ local INSTALL_VIRTUAL local PNAME local PCAT + local PVER + local PBUILD DFILE="$1" + # debug info + decho "depwalking magefile '${DFILE}'" + decho + 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 ]] || \ - [[ ${METHOD} = srcupgrade ]] || \ - [[ ${METHOD} = srcuppretend ]] + if [[ ${METHOD} = srcinstall ]] || + [[ ${METHOD} = srcpretend ]] || + [[ ${METHOD} = srcupgrade ]] || + [[ ${METHOD} = srcuppretend ]] || + [[ ${METHOD} = install-build-prerequisites ]] || + [[ ${METHOD} = pretend-build-prerequisites ]] then # only if SDEPEND is not zero if [ -n "${SDEPEND}" ] @@ -141,26 +183,56 @@ if [ -z "${MY_DEPEND}" ] then + decho "MY_DEPEND is empty; deps of '${DFILE}' ignored" return 1 fi while read SYM DEPNAME do + # debug info + decho "DEPNAME='${DEPNAME}'" + + # 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}") + if [[ -z ${HIGHEST_DEPFILE} ]] + then + INVALID_DEPS+=" ${DEPNAME}:${DFILE}" + continue + fi PCAT="$(magename2pcat ${HIGHEST_DEPFILE})" PNAME="$(magename2pname ${HIGHEST_DEPFILE})" 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 ### + ### check if the dependency is already installed ### if [ ! -d ${MROOT}${INSTALLDB}/${PCAT}/${PNAME}-${PVER}-${PBUILD} ] then - rumwandern ${HIGHEST_DEPFILE} ALLDEPS="${ALLDEPS} ${HIGHEST_DEPFILE}" + decho "added '${HIGHEST_DEPFILE}' to ALLDEPS" + depwalking ${HIGHEST_DEPFILE} fi fi done << EOF @@ -169,15 +241,11 @@ return 0 } - -### abort if this package is already installed (retval 3) -# maybe later ? -#[ -d ${INSTALLDB}/${PCAT}/${PNAME}-${PVER}-${PBUILD} ] && exit 3 - [[ ${METHOD} = pretend ]] || \ [[ ${METHOD} = srcpretend ]] || \ [[ ${METHOD} = uppretend ]] || \ - [[ ${METHOD} = srcuppretend ]] && \ + [[ ${METHOD} = srcuppretend ]] || \ + [[ ${METHOD} = pretend-build-prerequisites ]] && \ echo -n "Calculating dependencies ... " @@ -191,26 +259,83 @@ do PCAT="$(magename2pcat ${dep} installdb)" PNAME="$(magename2pname ${dep})" - PVER="$(magename2pver ${dep})" - PBUILD="$(magename2pbuild ${dep})" - # fake a mage file - MAGEFILE="${MAGEDIR}/${PCAT}/${PNAME}/${PNAME}-${PVER}-${PBUILD}.mage" + # get the highest mage file from mage-db + MAGEFILE="$(get_highest_magefile ${PCAT} ${PNAME})" + + # debug info + decho "dep='${dep}'" + decho "PCAT='${PCAT}'" + decho "PNAME='${PNAME}'" + decho "MAGEFILE='${MAGEFILE}'" + + # 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}" + decho "added to NO_UPGRADE_CANDIDATE" + continue + fi - rumwandern ${MAGEFILE} + # now get the pver&pbuild from the new file + PVER="$(magename2pver ${MAGEFILE})" + PBUILD="$(magename2pbuild ${MAGEFILE})" + + # debug info + decho "PVER='${PVER}'" + decho "PBUILD='${PBUILD}'" + + # 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 checklist_alldeps "${MAGEFILE}" + then + decho "added '${MAGEFILE}' to ALLDEPS" + ALLDEPS="${ALLDEPS} ${MAGEFILE}" + fi + else + # debug info + decho "ignored package" + decho + fi done else - # get dependencies the package - rumwandern ${MAGEFILE} + # get all dependencies of the package + if [[ -n ${SMAGEFILE} ]] + then + depwalking "${SMAGEFILE}" + else + depwalking "${MAGEFILE}" + fi +fi +if [[ ${METHOD} != install-build-prerequisites ]] && + [[ ${METHOD} != pretend-build-prerequisites ]] && + [[ ${METHOD} != upgrade ]] && + [[ ${METHOD} != uppretend ]] && + [[ ${METHOD} != srcupgrade ]] && + [[ ${METHOD} != srcuppretend ]] +then # now add the package itself to the dependencies - ALLDEPS="${ALLDEPS} ${MAGEFILE}" + # (if not exists already) + if checklist_alldeps "${MAGEFILE}" + then + decho "added '${MAGEFILE}' to ALLDEPS" + ALLDEPS="${ALLDEPS} ${MAGEFILE}" + fi fi [[ ${METHOD} = pretend ]] || \ [[ ${METHOD} = srcpretend ]] || \ [[ ${METHOD} = uppretend ]] || \ - [[ ${METHOD} = srcuppretend ]] && \ + [[ ${METHOD} = srcuppretend ]] || \ + [[ ${METHOD} = pretend-build-prerequisites ]] && \ echo "done" @@ -218,7 +343,8 @@ if [[ ${METHOD} = pretend ]] || \ [[ ${METHOD} = srcpretend ]] || \ [[ ${METHOD} = uppretend ]] || \ - [[ ${METHOD} = srcuppretend ]] + [[ ${METHOD} = srcuppretend ]] || \ + [[ ${METHOD} = pretend-build-prerequisites ]] then # this is a little bit faster declare -i x=0 @@ -235,7 +361,7 @@ PBUILD="$(magename2pbuild ${i})" if [ -z "${list}" ] then - list="\t${COLBLUE}[${k}] ${COLGREEN}${PCAT}/${PNAME}-${PVER}-${PBUILD}${COLDEFAULT}" + list="\t${COLBLUE}[${k}] ${COLGREEN}${PCAT}/${PNAME}-${PVER}-${PBUILD}${COLDEFAULT}" else list="${list} \t${COLBLUE}[${k}] ${COLGREEN}${PCAT}/${PNAME}-${PVER}-${PBUILD}${COLDEFAULT}" @@ -245,14 +371,38 @@ echo "done" echo -e "${list}" echo + + if [[ ! -z ${INVALID_DEPS} ]] + then + echo -e "${COLRED}Invalid dependencies found:${COLDEFAULT}" + for i in ${INVALID_DEPS} + do + _dep="${i%%:*}" + _mage="${i##*:}" + echo -e "${COLRED} '${_dep}' -> '${_mage}'${COLDEFAULT}" + done + echo + fi + + 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 ]] || \ [[ ${METHOD} = upgrade ]] || \ - [[ ${METHOD} = srcupgrade ]] && \ + [[ ${METHOD} = srcupgrade ]] || \ + [[ ${METHOD} = install-build-prerequisites ]] && \ echo "${ALLDEPS}" - -# delete ${BUILDDIR}/virtuals if exists as not needed anymore -#[ -d ${BUILDDIR}/virtuals ] && rm -rf ${BUILDDIR}/virtuals