217 lines
5.7 KiB
Plaintext
217 lines
5.7 KiB
Plaintext
|
#!/bin/bash
|
||
|
#
|
||
|
# Distrowatch packages update checker
|
||
|
# Copyright (c) 2004-2009 by Silvan Calarco <silvan.calarco@mambasoft.it>
|
||
|
#
|
||
|
|
||
|
. /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="<font color=red>$ver</font>"
|
||
|
[ ${vercmp} = 1 ] && veradd="$ver"
|
||
|
# [ "${ver/-/}" != "$pkgver" ] && veradd="<font color=red>$ver</font>" || unset veradd
|
||
|
[ "$veradd" -o "$nameadd" ] && {
|
||
|
[ "$veradd" -a "$nameadd" ] && \
|
||
|
verappend="($nameadd;$veradd)" ||
|
||
|
verappend="(${nameadd}${veradd})"
|
||
|
} || unset verappend
|
||
|
echo "<a href=\"${DISTROMATIC_PREFIX}tag=${DISTROMATIC_REPOSITORY}&pkg=${JOB_PKGS[0]}.source\">${JOB_PKGS[0]} $pkgver</a> $verappend<br>"
|
||
|
[ $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
|