#!/bin/bash # # Distrowatch packages update checker # Copyright (c) 2004-2009 by Silvan Calarco # . /etc/sysconfig/openmamba-central DISTROMATIC_PREFIX=/distribution/distromatic.html? DISTROMATIC_REPOSITORY=devel DISTDB=/etc/autodist/distdb DISTDBDIR=/etc/autodist/distdb.d [ -r $DISTDB ] && { . $DISTDB [ -d $DISTDBDIR ] && \ for f in `ls $DISTDBDIR/*.db`; do . $f done } [ -r $PKGLIST_FILE ] || { echo "Error: file $PKGLIST_FILE cannot be read; aborting." >&2 exit 1 } [ -r $ALIASES_DB ] || { echo "Error: file $ALIASES_DB cannot be read; aborting." >&2 exit 1 } function usage() { echo "openmamba-dw-checklist [-h|-m][-r repository]" echo echo " -h: generate distromatic HTML output" echo " -m: show missing packages only" echo " -r repository: specify the repository (default: devel)" echo " -o repository: specify the repository for output data (default: devel-autodist)" echo } echo "openmamba-dw-checklist - distrowatch packages update status file creator" >&2 get_job_vector() { local JNAME=$1 # resolve JOB_NAME from distdb # note: if JOB_NAME contains a "-" it can't be a distdb JOB, so skip it if [ "${JNAME/-/}" = "${JNAME}" ]; then local jobtmpfile=`tempfile` # hack to get an array variable named as $j assigned to the JOB array echo "echo \${$JNAME[*]}" > $jobtmpfile JOB=(`. $jobtmpfile`) rm -f $jobtmpfile else JOB=() fi if [ ${#JOB[*]} -eq 0 ]; then # create a default job with given JOB_NAME JOB=($JNAME "" "") elif [ ${#JOB[*]} -eq 1 ]; then # no variables defined, add an empty job JOB=(${JOB[*]} "" "") fi JOB_PKGS=(${JOB[0]//,/ }) JOB_VARNAMES=(${JOB[1]//,/ }) } function version_compare() { local A B A=$1 B=$2 if [ ${A/[a-zA-Z_]*} -gt ${B/[a-zA-Z_]*} ]; then return 1 elif [ ${A/[a-zA-Z_]*} -lt ${B/[a-zA-Z_]*} ]; then return 2 else if [[ "$A" > "$B" ]]; then return 1 elif [[ "$A" < "$B" ]]; then return 2 fi fi return 0 } function version_find_bigger() { local VER1 VER2 FPOS CUTVER1 CUTVER2 VER1=$1 VER2=$2 FPOS=1 while true; do CUTVER1=`echo $VER1. | cut -d. -f $FPOS` CUTVER2=`echo $VER2. | cut -d. -f $FPOS` if [ "$CUTVER1" -a ! "$CUTVER2" ]; then return 1 elif [ "$CUTVER2" -a ! "$CUTVER1" ]; then return 2 elif [ ! "$CUTVER1" -a "$CUTVER2" ]; then return 0 else version_compare $CUTVER1 $CUTVER2 case $? in 1) return 1 ;; 2) return 2 ;; esac fi FPOS=`expr $FPOS + 1` done return 0 } while [ "$1" ]; do case $1 in -h) distromatic_html=1 ;; -m) if [ "$distromatic_html" ]; then echo "Error: options -h and -m cannot be used together." usage exit 1 else missing_only=1 fi ;; -r) [ "$2" ] || { echo "Error: option -r requires repository name as parameter" usage exit 1 } DISTROMATIC_REPOSITORY=$2 shift ;; *) echo "Error: invalid option $1."; usage; exit 1 ;; esac shift done CACHE_DIR=${local_ftp}/$DISTROMATIC_REPOSITORY/autoupdate/ PKGLIST_FILE=${local_ftp}/$DISTROMATIC_REPOSITORY/srcpkglist BUILDLIST_FILE=$CACHE_DIR/distrowatch.in CONFIG_DIR=$CACHE_DIR DISTROWATCH_DB=$CACHE_DIR/distrowatch.db ALIASES_DB=$CACHE_DIR/aliases MANUALVER_DB=$CACHE_DIR/manualver > $DISTROWATCH_DB > $DISTROWATCH_DB.missing > $BUILDLIST_FILE lynx -width 300 -dump http://distrowatch.com/packages.php | while read line; do [ "`echo $line | grep "Package Version Note"`" ] && start_print=1 [ "`echo $line | grep "____________________"`" ] && unset start_print [ "$start_print" ] && { set -- $line pkg="${1/\[*\]/}" ver="${2/\[*\]/}" alias=`grep "^$pkg " $ALIASES_DB` echo "$pkg $ver ${alias/* /}" >> $DISTROWATCH_DB } done while read pkg ver alias; do unset pkgline unset found_manual unset found_alias pkgline=`grep "^$pkg " $MANUALVER_DB` && found_manual=1 if [ ! "$found_manual" ]; then if [ "$alias" ]; then get_job_vector $alias lastjob=${#JOB_PKGS[*]} pkgline=`grep "^${JOB_PKGS[$lastjob-1]} " $PKGLIST_FILE` && found_alias=1 else get_job_vector $pkg lastjob=${#JOB_PKGS[*]} pkgline=`grep "^${JOB_PKGS[$lastjob-1]} " $PKGLIST_FILE` fi fi if [ "$pkgline" ]; then set -- $pkgline pkgname=$1 pkgver=$2 version_find_bigger $pkgver ${ver/-/.} vercmp=$? [ "$found_manual" ] && pkgname=$3 if [ ! "$missing_only" ]; then if [ "$distromatic_html" = "1" ]; then [ "$found_alias" -o "$found_manual" ] && nameadd="$pkg" || unset nameadd unset veradd [ ${vercmp} = 2 ] && veradd="$ver" [ ${vercmp} = 1 ] && veradd="$ver" # [ "${ver/-/}" != "$pkgver" ] && veradd="$ver" || unset veradd [ "$veradd" -o "$nameadd" ] && { [ "$veradd" -a "$nameadd" ] && \ verappend="($nameadd;$veradd)" || verappend="(${nameadd}${veradd})" } || unset verappend echo "${JOB_PKGS[0]} $pkgver $verappend
" [ $vercmp = 2 ] && { if [ "$found_alias" ]; then echo "$alias +$ver 0" >> $BUILDLIST_FILE else echo "$pkg +$ver 0" >> $BUILDLIST_FILE fi } else echo "$pkg $pkgver ($ver)" fi fi else echo "$pkg ($ver)" >> $DISTROWATCH_DB.missing fi done < $DISTROWATCH_DB