#!/bin/sh # pkglist Make Vector Linux PKGLIST.TXT # And optionally moving the old packages # Call this on the packages directory # pkglist > /path_to/PKGLIST.TXT usage() { cat<< EOF pkglist [-u | --update] Create Vector Linux PKGLIST.TXT and PKGLIST.TXT.bz2 If ../upgraded or ../upkg directory exists, move old packages to there. You may specify upgraded directory by exporting UPKG_BASE. EOF exit 0 } pkgname() { name=${1%%-*} ver_rest=${1#$name-} while [ 0 ]; do if echo $ver_rest | grep -qe "^[0-9]*\."; then break fi if echo $ver_rest | grep -qe "^[0-9]*-"; then break fi if echo $ver_rest | grep -qe "^[0-9]*_"; then break fi case `echo $ver_rest | cut -f1 -d-` in noarch|i386|i486|i586|i686|i786|i886|i986) break ;; esac extra=${ver_rest%%-*} ver_rest=${ver_rest#$extra-} if [ "$ver_rest" = "$extra" ]; then break fi name="${name}-${extra}" done echo $name } pkgversion() { name=`pkgname $1` ver_rest=${1#$name-} ver=${ver_rest%%-*} ver_rest=${ver_rest#$ver-} while [ "$ver_rest" ]; do case `echo $ver_rest | cut -f1 -d-` in noarch|i386|i486|i586|i686|i786|i886|i986) break ;; esac extra=${ver_rest%%-*} ver_rest=${ver_rest#$extra-} if [ "$ver_rest" = "$extra" ]; then break fi ver="${ver}-${extra}" done echo $ver } # return 0 = same # return -1 = older # return 1 = newer vercompare() { VER1=$1 VER2=$2 if [ "$VER1" == "$VER2" ]; then return 0 fi while [ 0 ]; do VVER1=${VER1%%.*} VVER2=${VER2%%.*} if [ ${#VVER1} -gt ${#VVER2} ]; then return 1 fi if [ ${#VVER1} -lt ${#VVER2} ]; then return -1 fi if [ "$VVER1" \> "$VVER2" ]; then return 1 fi if [ "$VVER2" \> "$VVER1" ]; then return -1 fi if [ "$VER1" == "$VVER1" ]; then return 1 fi if [ "$VER2" == "$VVER2" ]; then return -1 fi VER1=${VER1#*.} VER2=${VER2#*.} done } ## check if this is the newest package on the dir is_it_newest() { PNAME=`pkgname $BNAME` for PKG2 in $DNAME/$PNAME-*.tgz; do BNAME2=`basename $PKG2 tgz` [ $BNAME == $BNAME2 ] && continue PNAME2=`pkgname $BNAME2` [ $PNAME != $PNAME2 ] && continue PVER1=`pkgversion $BNAME` PVER2=`pkgversion $BNAME2` vercompare $PVER2 $PVER1 if [ $? = 1 ]; then return 1 fi done return 0 } move_pkg() { if [ "$UPKG_BASE" ] ; then [ ! -d $UPKG_BASE ] && return 0 elif [ -d ../upgraded ]; then UPKG_BASE="../upgraded" elif [ -d ../upkg ]; then UPKG_BASE="../upkg" else return 0 fi echo moving $BNAME to $UPKG_BASE/$DNAME >&2 if [ "$UPDATE_LIST" ]; then mkdir -p $UPKG_BASE/$DNAME > /dev/null mv $DNAME/$BNAME.* $UPKG_BASE/$DNAME > /dev/null fi } print_list() { PDESC="" if [ -f $DNAME/$BNAME.txt ]; then PDESC=`grep -e ".*:" $DNAME/$BNAME.txt | head -n1 | cut -f2- -d ':'` PDESC=`echo $PDESC` if [ "$PDESC" ]; then PDESC1=`echo $PDESC | cut -f2- -d '(' | cut -f1 -d ')'` if [ "$PDESC1" ]; then PDESC=`echo $PDESC1` fi fi fi if [ -z "$PDESC" ]; then PDESC=$BNAME fi ## Take out apposthrope PDESC=$(echo $PDESC | sed "s/'/\`/g") ## Name without leading ./ PLONG=`echo $DNAME/$BNAME.tgz | sed 's^./^^'` PSIZE=`stat -t $PLONG` PSIZE=`echo $PSIZE | cut -f2 -d ' '` printf "%-68s %10s :%s\n" "$PLONG" "$PSIZE" "$PDESC" } case "$1" in "--list") BNAME=`basename $2 .tgz` DNAME=`dirname $2` if is_it_newest; then print_list else move_pkg fi exit 0 ;; "--list-all") find . -name *.tgz -exec $0 --list {} \; exit 0 ;; "-u"|"--update") export UPDATE_LIST="1" $0 > PKGLIST.TXT $0 | bzip2 > PKGLIST.TXT.bz2 exit 0 ;; "-h"|"--help") usage ;; *) ## Default echo "## Vector Linux Package List" echo "## Generated by pkglist on `date`" $0 --list-all | sort ;; esac