#!/bin/bash VERSION=0.5 ADM_DIR=/var/lib/pkgtool rm -f all-packages.txt tier-1-packages.txt tier-2-packages.txt req-packages.txt OLD_IFS=$IFS SOLIB_PKGS=0 DEV_PKGS=0 I18N_PKGS=0 DOC_PKGS=0 ALL_PKGS=0 NOARCH_PKGS=0 REQ_PKGS=0 # start with a fresh list of all installed packages cat /dev/null > all-packages.txt for PKG in $(ls -1 $ADM_DIR/packages) ; do NAME=${PKG%*-*-*-*} case "$NAME" in *-devel) (( DEV_PKGS++ )) ; echo $NAME'§'${PKG} >> all-packages.txt ;; *-locale-*|*-i18n) (( I18N_PKGS++ )) ; echo $NAME'§'${PKG} >> all-packages.txt ;; *-solibs) (( SOLIB_PKGS++ )) ; echo $NAME'§'${PKG} >> all-packages.txt ;; *-docs) (( DOC_PKGS++ )) ; continue ;; *) case $PKG in *-noarch*) (( NOARCH_PKGS++ )) ;; esac echo $NAME'§'${PKG} >> all-packages.txt ;; esac (( ALL_PKGS++ )) done if [[ $DEBUG ]] ; then echo echo ALL_PKGS=$ALL_PKGS echo PKGS_TODO=$PKGS_TODO echo echo DEV_PKGS=$DEV_PKGS echo I18N_PKGS=$I18N_PKGS echo NOARCH_PKGS=$NOARCH_PKGS echo DOC_PKGS=$DOC_PKGS echo fi # tier-1 derives a list of packages which only need glibc # or don't have any requireds at all (don't have any required file) cat /dev/null > tier-1-packages.txt cat /dev/null > req-packages.txt COUNT=1 echo "PASS=$COUNT" TIER_ONE_TOTAL=0 while IFS='§' read NAME PKG ; do if [[ -f "$ADM_DIR"/required/$PKG ]] ; then case "$NAME" in *-docs) continue ;; *) (( REQ_PKGS++ )) echo $NAME'§'${PKG} >> req-packages.txt ;; esac else echo "${NAME}§${PKG}" >> tier-1-packages.txt (( TIER_ONE_TOTAL++ )) fi done < all-packages.txt echo "END PASS1" if [[ $DEBUG ]] ; then echo REQ_PKGS=$REQ_PKGS echo TIER-1=$TIER_ONE_TOTAL sleep 2 fi cat /dev/null > tier-2-packages.txt #echo "Starting tier-2" DONE=0 while [[ $DONE != 1 ]] ; do # increment the PASS count (( COUNT++ )) echo "PASS=$COUNT" echo "PASS=$COUNT" >> tier-2-packages.txt PROCESSED=0 while read LINE ; do NAME=${LINE%§*} #echo NAME = $NAME PKG=${LINE#*§} #echo PKG = $PKG NEEDS=0 FOUND=0 if [[ ! $(grep "^$NAME§" tier-2-packages.txt 2> /dev/null) ]] ; then [[ $DEBUG ]] && echo "HANDLING: $NAME" if [[ -f $ADM_DIR/required/$PKG ]] ; then for ONE_REQ in $(grep -v '^#' $ADM_DIR/required/$PKG) ; do # use this to prefer solib packages ONE_REQ=${ONE_REQ%% |*} # use this to prefer full packages #ONE_REQ=${ONE_REQ#| *} ONE_REQ=$(echo ${ONE_REQ%*-*-*-*}) [[ $DEBUG ]] && echo ONE_REQ=$ONE_REQ #&& sleep .5 case $ONE_REQ in '|'|' ') continue ;; *) if [[ $(grep "$ONE_REQ§" tier-1-packages.txt 2> /dev/null) ]] \ || [[ $(grep "$ONE_REQ§" tier-2-packages.txt 2> /dev/null) ]] ; then [[ $DEBUG ]] && echo " Already listed: $ONE_REQ" #true #continue FOUND=1 elif [[ $(grep "${ONE_REQ#| *}§" tier-1-packages.txt 2> /dev/null) ]] \ || [[ $(grep "${ONE_REQ#| *}§" tier-2-packages.txt 2> /dev/null) ]] ; then [[ $DEBUG ]] && echo " Already listed: $ONE_REQ" #true #continue FOUND=1 else NEEDS=1 fi if [[ $FOUND = 0 ]] && ! [[ $(grep "^$ONE_REQ§" all-packages.txt) ]] ; then echo "-----> Package required by '$NAME' not in database: $ONE_REQ" exit fi ;; esac [[ $FOUND = 1 ]] && break done if [[ "$NEEDS" = 0 ]] ; then if [[ $(grep "^$NAME§" tier-1-packages.txt) ]] ; then true echo "Skipping: $NAME" else [[ $DEBUG ]] && echo "-> Adding: $NAME" echo "-> Adding: $NAME" echo "$NAME§${PKG}" >> tier-2-packages.txt fi fi else echo "Unlisted requires: $NAME" >> unlisted.txt fi else echo " Already HANDLED: $NAME" true #(( PROCESSED++ )) fi done < req-packages.txt #echo "END PASS=$COUNT" #echo "END PASS=$COUNT" >> tier-2-packages.txt TIER_TWO_TOTAL=$(wc -l tier-2-packages.txt |cut -f1 -d' ') TOTAL=$(( $TIER_ONE_TOTAL + $TIER_TWO_TOTAL )) if [[ $DEBUG ]] ; then echo echo SOLIBS_PKGS=$SOLIBS_PKGS echo DEV_PKGS=$DEV_PKGS echo I18N_PKGS=$I18N_PKGS echo NOARCH_PKGS=$NOARCH_PKGS echo DOC_PKGS=$DOC_PKGS echo echo TIER-1=$TIER_ONE_TOTAL echo TIER-2=$TIER_TWO_TOTAL echo PROCESSED=$PROCESSED echo TOTAL=$TOTAL echo REQ_TOTAL=$REQ_TOTAL echo PKGS_TODO=$PKGS_TODO echo fi if [[ $(($TIER_ONE_TOTAL + $TIER_TWO_TOTAL )) -ge $(( $ALL_PKGS )) ]] ; then DONE=1 fi done echo "END PASS=$COUNT" echo "# GLIBC tier-1 packages" > Compile-Order.txt cat tier-1-packages.txt |cut -f1 -d'§' >> Compile-Order.txt echo "" >> Compile-Order.txt echo "# tier-2 packages" >> Compile-Order.txt cat tier-2-packages.txt |cut -f1 -d'§' >> Compile-Order.txt echo "" >> Compile-Order.txt #cat /dev/null > X-Compile-Order.txt #while IFS='§' read NAME PKG ; do # if [[ $(grep "^$NAME" X-file.list) ]] ; then # case "$NAME" in # #""|gcc) true ;; # *) echo "$NAME" >> X-Compile-Order.txt ;; # esac # fi #done < Compile-Order.txt