Magellan Linux

Diff of /branches/mage-next/src/depwalker.in

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

trunk/mage/usr/lib/mage/depwalker.sh revision 235 by niro, Sat Sep 10 13:34:56 2005 UTC branches/mage-next/src/depwalker.in revision 2628 by niro, Wed Mar 5 08:19:29 2014 UTC
# Line 1  Line 1 
1  #!/bin/bash  #!/bin/bash
2    # $Id$
3    # dependeny walker
4    
5  #depwalker  # set default variables
6  # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/depwalker.sh,v 1.3 2005-09-10 13:34:56 niro Exp $  : ${MAGERC="@@SYSCONFDIR@@/mage.rc"}
7    : ${MLIBDIR="@@MAGELIBDIR@@"}
8    
9    # first of all include common functions
10    source ${MLIBDIR}/common.functions.sh || exit 1
11    source @@SYSCONFDIR@@/mage.rc.global || die "@@SYSCONFDIR@@/mage.rc.global missing"
12    source ${MAGERC} || die "Your ${MAGERC} is missing. Aborting."
13    source ${MLIBDIR}/mage4.functions.sh || die "mage functions missing"
14    source ${MLIBDIR}/smage2.functions.sh || die "smage functions missing"
15    
16  # default die function  decho()
 die()  
17  {  {
18   echo ${COLRED}"$@"${COLDEFAULT}   if [[ ${DEBUG} = 1 ]]
19   exit 1   then
20     echo "DEBUG: $@" >&2
21     fi
22  }  }
23    
 # 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  
   
24  usage()  usage()
25  {  {
26   echo   echo
27   echo "Usage: $(basename $0) [command] [arg] ..."   echo "Usage: $(basename $0) [command] [arg] ..."
28   echo   echo
29   echo "  -h     --help          shows this help"   echo "  -h     --help          shows this help"
30   echo "  -c     --pcat          categorie of the package"   echo "  -c     --pcat          category of the package"
31   echo "  -n     --pname         name of the package"   echo "  -n     --pname         name of the package"
32   echo "  -v     --pver          version number of the package"   echo "  -v     --pver          version number of the package"
33   echo "  -b     --pbuild        build number of the package"   echo "  -b     --pbuild        build number of the package"
34   echo "  -m     --method        which calc method should be used:"   echo "  -m     --method        which calc method should be used:"
35   echo "                         install, srcinstall, depend, srcdepend"   echo "                         install, srcinstall, pretend, srcpretend"
36   echo "                         upgrade, srcupgrade"   echo "                         upgrade, srcupgrade,"
37     echo "                         install-build-prerequisites,"
38     echo "                         pretend-build-prerequisites"
39     echo "  -d     --debug         enable debug mode"
40     echo "  -s     --smage         use a smage to calculate dependencies"
41   echo   echo
42   echo "method,name, version and build must be given !"   echo "method, category, name, version and build must be given !"
43   echo   echo
44   exit 1   exit 1
45  }  }
46    
47    # always default debug=0
48    DEBUG=0
49    
50  # very basic getops  # very basic getops
51  for i in $*  for i in $*
52  do  do
# Line 71  do Line 56  do
56   --pver|-v) shift; PVER="$1" ;;   --pver|-v) shift; PVER="$1" ;;
57   --pbuild|-b) shift; PBUILD="$1" ;;   --pbuild|-b) shift; PBUILD="$1" ;;
58   --method|-m) shift; METHOD="$1" ;;   --method|-m) shift; METHOD="$1" ;;
59     --debug|-d) shift; DEBUG=1 ;;
60     --smage|-s) shift; SMAGEFILE="$1"; SILENT=1; FVERBOSE=off ;;
61   --help|-h) usage ;;   --help|-h) usage ;;
62   esac   esac
63   shift   shift
64  done  done
65    
66  # sanity checks; abort if not given  # sanity checks; abort if not given
67  [ -z "${PCAT}" ] && usage  if [[ -z ${SMAGEFILE} ]]
68  [ -z "${PNAME}" ] && usage  then
69  [ -z "${PVER}" ] && usage   [ -z "${PCAT}" ] && usage
70  [ -z "${PBUILD}" ] && usage   [ -z "${PNAME}" ] && usage
71     [ -z "${PVER}" ] && usage
72     [ -z "${PBUILD}" ] && usage
73    fi
74  [ -z "${METHOD}" ] && usage  [ -z "${METHOD}" ] && usage
75    
76  # check needed global vars  # check needed global vars
# Line 90  done Line 80  done
80    
81  # other needed vars  # other needed vars
82  ALLDEPS=""  ALLDEPS=""
83    if [[ -n ${SMAGEFILE} ]]
84    then
85     if [[ -e ${SMAGEFILE} ]]
86     then
87     smagesource "${SMAGEFILE}"
88     else
89     die "Smage file '${SMAGEFILE}' does not exist!"
90     fi
91    fi
92  MAGEFILE="${MAGEDIR}/${PCAT}/${PNAME}/${PNAME}-${PVER}-${PBUILD}.mage"  MAGEFILE="${MAGEDIR}/${PCAT}/${PNAME}/${PNAME}-${PVER}-${PBUILD}.mage"
93    
94    # much faster than fgrep
95    checklist_alldeps()
96    {
97     local i
98     local item="$1"
99    
100     for i in ${ALLDEPS}
101     do
102     [[ ${i} = ${item} ]] && return 1
103     done
104    
105     return 0
106    }
107    
108    checklist_processeddeps()
109    {
110     local i
111     local item="$1"
112    
113     for i in ${PROCESSEDDEPS}
114     do
115     [[ ${i} = ${item} ]] && return 1
116     done
117    
118     return 0
119    }
120    
121  #####################  #####################
122  ##  rumwandern /path/to/mage/file/.mage  ##  depwalking /path/to/mage/file/.mage
123  rumwandern()  depwalking()
124  {  {
125   unset DEPEND   unset DEPEND
126   unset SDEPEND   unset SDEPEND
# Line 110  rumwandern() Line 136  rumwandern()
136   local INSTALL_VIRTUAL   local INSTALL_VIRTUAL
137   local PNAME   local PNAME
138   local PCAT   local PCAT
139     local PVER
140     local PBUILD
141    
142   DFILE="$1"   DFILE="$1"
143    
144     # debug info
145     decho "depwalking magefile '${DFILE}'"
146     decho
147    
148   source ${DFILE}   source ${DFILE}
149    
150     # forced nodeps
151     if [[ ${NODEPS} = true ]]
152     then
153     DEPEND=""
154     SDEPEND=""
155     fi
156    
157   MY_DEPEND="${DEPEND}"   MY_DEPEND="${DEPEND}"
158    
159   # for srcinstall & srcdepend only; SDEPEND also needed   # for srcinstall & srcdepend only; SDEPEND also needed
160   if [[ ${METHOD} = srcinstall ]] || \   if [[ ${METHOD} = srcinstall ]] ||
161   [[ ${METHOD} = srcpretend ]] || \   [[ ${METHOD} = srcpretend ]] ||
162   [[ ${METHOD} = srcupgrade ]] || \   [[ ${METHOD} = srcupgrade ]] ||
163   [[ ${METHOD} = srcuppretend ]]   [[ ${METHOD} = srcuppretend ]] ||
164     [[ ${METHOD} = install-build-prerequisites ]] ||
165     [[ ${METHOD} = pretend-build-prerequisites ]]
166   then   then
167   # only if SDEPEND is not zero   # only if SDEPEND is not zero
168   if [ -n "${SDEPEND}" ]   if [ -n "${SDEPEND}" ]
# Line 141  rumwandern() Line 183  rumwandern()
183    
184   if [ -z "${MY_DEPEND}" ]   if [ -z "${MY_DEPEND}" ]
185   then   then
186     decho "MY_DEPEND is empty; deps of '${DFILE}' ignored"
187   return 1   return 1
188   fi   fi
189    
190   while read SYM DEPNAME   while read SYM DEPNAME
191   do   do
192     # debug info
193     decho "DEPNAME='${DEPNAME}'"
194    
195     # exclude empty depnames
196     [[ -z ${DEPNAME} ]] && continue
197    
198     # exclude all already processed deps -without version
199     if ! checklist_processeddeps "${DEPNAME%-*}"
200     then
201     continue
202     fi
203    
204     # mark depfile as processed to prevent double runs -without version
205     # but do not add any virtuals to PROCESSEDDEPS or their resolved
206     # pkgnames will be ignored and they are missing on the dependecy-list
207     if [[ ${DEPNAME/virtual\//} = ${DEPNAME} ]]
208     then
209     PROCESSEDDEPS="${PROCESSEDDEPS} ${DEPNAME%-*}"
210     fi
211    
212   HIGHEST_DEPFILE=$(dep2highest_magefile "${DEPNAME}")   HIGHEST_DEPFILE=$(dep2highest_magefile "${DEPNAME}")
213     if [[ -z ${HIGHEST_DEPFILE} ]]
214     then
215     INVALID_DEPS+=" ${DEPNAME}:${DFILE}"
216     continue
217     fi
218    
219   PCAT="$(magename2pcat ${HIGHEST_DEPFILE})"   PCAT="$(magename2pcat ${HIGHEST_DEPFILE})"
220   PNAME="$(magename2pname ${HIGHEST_DEPFILE})"   PNAME="$(magename2pname ${HIGHEST_DEPFILE})"
221   PVER="$(magename2pver ${HIGHEST_DEPFILE})"   PVER="$(magename2pver ${HIGHEST_DEPFILE})"
222   PBUILD="$(magename2pbuild ${HIGHEST_DEPFILE})"   PBUILD="$(magename2pbuild ${HIGHEST_DEPFILE})"
223    
224   ## check ob schon in ALLDEPS enthalten dann mach weiter   ## dep already in ALLDEPS? then going on
225   if [ -z "$(echo ${ALLDEPS} | fgrep "${HIGHEST_DEPFILE}")" ]  
226     # usage of fgrep is extremly slow and consumes a lot of cpu power
227     #if [ -z "$(echo ${ALLDEPS} | fgrep "${HIGHEST_DEPFILE}")" ]
228     if checklist_alldeps "${HIGHEST_DEPFILE}"
229   then   then
230   ### check ob DFILE schon installiert ist ###   ### check if the dependency is already installed ###
231   if [ ! -d ${MROOT}${INSTALLDB}/${PCAT}/${PNAME}-${PVER}-${PBUILD} ]   if [ ! -d ${MROOT}${INSTALLDB}/${PCAT}/${PNAME}-${PVER}-${PBUILD} ]
232   then   then
233   rumwandern ${HIGHEST_DEPFILE}   depwalking ${HIGHEST_DEPFILE}
234   ALLDEPS="${ALLDEPS} ${HIGHEST_DEPFILE}"   ALLDEPS="${ALLDEPS} ${HIGHEST_DEPFILE}"
235     decho "added '${HIGHEST_DEPFILE}' to ALLDEPS"
236   fi   fi
237   fi   fi
238   done << EOF   done << EOF
# Line 169  EOF Line 241  EOF
241   return 0   return 0
242  }  }
243    
   
 ### abort if this package is already installed (retval 3)  
 # maybe later ?  
 #[ -d ${INSTALLDB}/${PCAT}/${PNAME}-${PVER}-${PBUILD} ] && exit 3  
   
244  [[ ${METHOD} = pretend ]] || \  [[ ${METHOD} = pretend ]] || \
245   [[ ${METHOD} = srcpretend ]] || \   [[ ${METHOD} = srcpretend ]] || \
246   [[ ${METHOD} = uppretend ]] || \   [[ ${METHOD} = uppretend ]] || \
247   [[ ${METHOD} = srcuppretend ]] && \   [[ ${METHOD} = srcuppretend ]] || \
248     [[ ${METHOD} = pretend-build-prerequisites ]] && \
249   echo -n "Calculating dependencies ... "   echo -n "Calculating dependencies ... "
250    
251    
# Line 191  then Line 259  then
259   do   do
260   PCAT="$(magename2pcat ${dep} installdb)"   PCAT="$(magename2pcat ${dep} installdb)"
261   PNAME="$(magename2pname ${dep})"   PNAME="$(magename2pname ${dep})"
  PVER="$(magename2pver ${dep})"  
  PBUILD="$(magename2pbuild ${dep})"  
262    
263   # fake a mage file   # get the highest mage file from mage-db
264   MAGEFILE="${MAGEDIR}/${PCAT}/${PNAME}/${PNAME}-${PVER}-${PBUILD}.mage"   MAGEFILE="$(get_highest_magefile ${PCAT} ${PNAME})"
265    
266     # debug info
267     decho "dep='${dep}'"
268     decho "PCAT='${PCAT}'"
269     decho "PNAME='${PNAME}'"
270     decho "MAGEFILE='${MAGEFILE}'"
271    
272     # if no install candidate was found, record this
273     # and process with the next one
274     if [[ -z ${MAGEFILE} ]]
275     then
276     NO_UPGRADE_CANDIDATE="${NO_UPGRADE_CANDIDATE} ${PCAT}/${PNAME}"
277     decho "added to NO_UPGRADE_CANDIDATE"
278     continue
279     fi
280    
281   rumwandern ${MAGEFILE}   # now get the pver&pbuild from the new file
282     PVER="$(magename2pver ${MAGEFILE})"
283     PBUILD="$(magename2pbuild ${MAGEFILE})"
284    
285     # debug info
286     decho "PVER='${PVER}'"
287     decho "PBUILD='${PBUILD}'"
288    
289     # do not walk files which are installed
290     if [ ! -d ${INSTALLDB}/${PCAT}/${PNAME}-${PVER}-${PBUILD} ]
291     then
292     # get dependencies the package
293     depwalking ${MAGEFILE}
294    
295     # now add the package itself to the dependencies
296     # (if not exists already)
297     if checklist_alldeps "${MAGEFILE}"
298     then
299     decho "added '${MAGEFILE}' to ALLDEPS"
300     ALLDEPS="${ALLDEPS} ${MAGEFILE}"
301     fi
302     else
303     # debug info
304     decho "ignored package"
305     decho
306     fi
307   done   done
308  else  else
309   # get dependencies the package   # get all dependencies of the package
310   rumwandern ${MAGEFILE}   if [[ -n ${SMAGEFILE} ]]
311     then
312     depwalking "${SMAGEFILE}"
313     else
314     depwalking "${MAGEFILE}"
315     fi
316    fi
317    
318    if [[ ${METHOD} != install-build-prerequisites ]] &&
319     [[ ${METHOD} != pretend-build-prerequisites ]] &&
320     [[ ${METHOD} != upgrade ]] &&
321     [[ ${METHOD} != uppretend ]] &&
322     [[ ${METHOD} != srcupgrade ]] &&
323     [[ ${METHOD} != srcuppretend ]]
324    then
325   # now add the package itself to the dependencies   # now add the package itself to the dependencies
326   ALLDEPS="${ALLDEPS} ${MAGEFILE}"   # (if not exists already)
327     if checklist_alldeps "${MAGEFILE}"
328     then
329     decho "added '${MAGEFILE}' to ALLDEPS"
330     ALLDEPS="${ALLDEPS} ${MAGEFILE}"
331     fi
332  fi  fi
333    
334  [[ ${METHOD} = pretend ]] || \  [[ ${METHOD} = pretend ]] || \
335   [[ ${METHOD} = srcpretend ]] || \   [[ ${METHOD} = srcpretend ]] || \
336   [[ ${METHOD} = uppretend ]] || \   [[ ${METHOD} = uppretend ]] || \
337   [[ ${METHOD} = srcuppretend ]] && \   [[ ${METHOD} = srcuppretend ]] || \
338     [[ ${METHOD} = pretend-build-prerequisites ]] && \
339   echo "done"   echo "done"
340    
341    
# Line 218  fi Line 343  fi
343  if [[ ${METHOD} = pretend ]] || \  if [[ ${METHOD} = pretend ]] || \
344   [[ ${METHOD} = srcpretend ]] || \   [[ ${METHOD} = srcpretend ]] || \
345   [[ ${METHOD} = uppretend ]] || \   [[ ${METHOD} = uppretend ]] || \
346   [[ ${METHOD} = srcuppretend ]]   [[ ${METHOD} = srcuppretend ]] || \
347     [[ ${METHOD} = pretend-build-prerequisites ]]
348  then  then
349   # this is a little bit faster   # this is a little bit faster
350   declare -i x=0   declare -i x=0
# Line 235  then Line 361  then
361   PBUILD="$(magename2pbuild ${i})"   PBUILD="$(magename2pbuild ${i})"
362   if [ -z "${list}" ]   if [ -z "${list}" ]
363   then   then
364   list="\t${COLBLUE}[${k}] ${COLGREEN}${PCAT}/${PNAME}-${PVER}-${PBUILD}${COLDEFAULT}"   list="\t${COLBLUE}[${k}] ${COLGREEN}${PCAT}/${PNAME}-${PVER}-${PBUILD}${COLDEFAULT}"
365   else   else
366   list="${list}   list="${list}
367  \t${COLBLUE}[${k}] ${COLGREEN}${PCAT}/${PNAME}-${PVER}-${PBUILD}${COLDEFAULT}"  \t${COLBLUE}[${k}] ${COLGREEN}${PCAT}/${PNAME}-${PVER}-${PBUILD}${COLDEFAULT}"
# Line 245  then Line 371  then
371   echo "done"   echo "done"
372   echo -e "${list}"   echo -e "${list}"
373   echo   echo
374    
375     if [[ ! -z ${INVALID_DEPS} ]]
376     then
377     echo -e "${COLRED}Invalid dependencies found:${COLDEFAULT}"
378     for i in ${INVALID_DEPS}
379     do
380     _dep="${i%%:*}"
381     _mage="${i##*:}"
382     echo -e "${COLRED} '${_dep}' -> '${_mage}'${COLDEFAULT}"
383     done
384     echo
385     fi
386    
387     if [[ ! -z ${NO_UPGRADE_CANDIDATE} ]]
388     then
389     echo -e "${COLRED}Currently no candidates found for:${COLDEFAULT}"
390     for i in ${NO_UPGRADE_CANDIDATE}
391     do
392     echo -e "${COLRED}    ${i}${COLDEFAULT}"
393     done
394     echo
395     echo -e "${COLRED}Please consider to uninstall all of them first,${COLDEFAULT}"
396     echo -e "${COLRED}because these packages does not exist in this distribution${COLDEFAULT}"
397     echo -e "${COLRED}anymore and there will be no further support for them.${COLDEFAULT}"
398     echo
399     fi
400  fi  fi
401    
402  ## return output from src/install deps  ## return output from src/install deps
403  [[ ${METHOD} = install ]] || \  [[ ${METHOD} = install ]] || \
404   [[ ${METHOD} = srcinstall ]] || \   [[ ${METHOD} = srcinstall ]] || \
405   [[ ${METHOD} = upgrade ]] || \   [[ ${METHOD} = upgrade ]] || \
406   [[ ${METHOD} = srcupgrade ]] && \   [[ ${METHOD} = srcupgrade ]] || \
407     [[ ${METHOD} = install-build-prerequisites ]] && \
408   echo "${ALLDEPS}"   echo "${ALLDEPS}"
   
 # delete ${BUILDDIR}/virtuals if exists as not needed anymore  
 #[ -d ${BUILDDIR}/virtuals ] && rm -rf ${BUILDDIR}/virtuals  

Legend:
Removed from v.235  
changed lines
  Added in v.2628