#!/bin/sh
#
# Erstellt SELECTLIST, DATABASE und FULLINDEX aus Src-Baum
#

DATABASEFORMAT="DEPENDON:PACKAGE:SELECTION:UNCOMPBYTES:WHICHDISK:PKGSIZE:WHICHVERSION:EFFECTON"
callname=`basename $0`

: ${SRCPATH=/dos/install}
: ${TMPDIR=/tmp}
: ${DATABASE=$TMPDIR/database}
: ${FULLINDEX=$TMPDIR/fullindex}
: ${SELECTLIST=$TMPDIR/selectlist}
: ${VERBOSE=true}
: ${QUERY=}

PrintUsage()
{
	echo
	echo "mklstbase/mkfullindex/mkdatabase/mkselection	LST Preselct-Utility"
	echo "Version 0.2"
	echo "Last changed 01.05.94"
	echo "Copyright (c) Ralf Flaxa, Linux Support Team Erlangen,  1993, 1994"
	echo
	echo "Abhaengig vom Namen, unter dem es aufgerufen wird, kann es Dateien "
	echo "fuer die Vorauswahl generieren."
	echo
	echo "mkfullindex: aus einem src-Baum alle Beschreibungen aller Pakete sammeln"
	echo "             und in TMPDIR/fullindex schreiben"
	echo "mkdatabase:  aus einem src-Baum alle moeglichen Informationen in eine"
	echo "             Datenbank TMPDIR/database schreiben"
	echo "mkselection: aus einem src-Baum mit Nachfragen eine Selectlist erstellen"
	echo "             und diese nach TMPDIR/selectlist schreiben"
	echo "mklstbase:   aus einem src-Baum database, fullindex und selectlist bauen"
	echo
	echo "weitere Flags:"
	echo " -showformat             zeigt naehere Infos zum Format der Datenbank"
	echo " -silent                 nur die noetigsten Informationen ausgeben"
	echo " -query                  die ermittelten Selektionen bestaetigen lassen"
	echo " -append                 Datanbank erweitern, nicht neu initialisieren"
	echo "weitere Optionen:"
	echo ' -srcpath    SRCPATH     Quellverzeichnis (mit vollstaendigem Pfad)'
	echo " -usebase    USEBASE     benutzt USEBASE statt src-Baum zur Generierung"
	echo " -useindex   USEINDEX    benutzt USEINDEX statt src-Baum zur Generierung"
	echo " -useseries  USESERIES   erstellt die Selectliste nur fuer USESERIES"
	echo " -lstversion LSTVERSION  ordnet alle Pakete der LST Version LSTVERSION zu"
	echo " -destdir    TMPDIR      Verzeichnis anstelle von /tmp, in das die Dateien"
	echo "                         geschrieben werden"
	echo
	echo "Dieses Utility ist auf die LST Distribution abgestimmt."
	echo
}

PrintDatabaseformat()
{
	echo
	echo 'geplantes Datenbankformat (momentan noch BETA Version, kann sich aendern) :'
	echo
	echo "$DATABASEFORMAT"
	echo 
	echo "naehere Informationen"
	echo 'DEPENDON     Liste (durch Komma getrennt) von Paketnamen, von denen dieses'
	echo "             Paket abhaengt. Bsp.: xbase,xfonts "
	echo 'PACKAGE      Name des Paketes (ohne Endung !). Bsp. gcc258'
	echo 'SELECTION    Paket Vorauswahl ( j oder n )'
	echo "UNCOMPBYTES  ungefaehrer Platzbedarf des Paketes bei der Installation"
	echo "DISKNAME     Name der Diskette/Verzeichnis, wo das Paket zu finden ist"
	echo "PKGSIZE      Grosse des gepackten Paketes"
	echo "WHICHVERSION Paket gehoert zur LST Version WHICHVERSION"
	echo "EFFECTON     Liste der Pakete, die von diesem Paket abhaengen"
	echo
}

# parse loop
while [ 1 ]; do
	if [ "$#" = 0 ]; then
		break
	elif [ "$1" = "-h" -o "$1" = "-?" ]; then
		PrintUsage 
		exit 1
	elif [ "$1" = "-showformat" ]; then
		Printdatabaseformat
		exit 0
	elif [ "$1" = "-silent" ]; then
		VERBOSE=
		shift 1
	elif [ "$1" = "-query" ]; then
		QUERY=true
		shift 1
	elif [ "$1" = "-append" ]; then
		APPEND=true
		shift 1
	elif [ "$#" -gt 1 -a "$1" = "-srcpath" ]; then
		SRCPATH=$2
		shift 2
	elif [ "$#" -gt 1 -a "$1" = "-usebase" ]; then
		USEBASE=$2
		shift 2
	elif [ "$#" -gt 1 -a "$1" = "-useindex" ]; then
		USEINDEX=$2
		shift 2
	elif [ "$#" -gt 1 -a "$1" = "-useseries" ]; then
		USESERIES=$2
		shift 2
	elif [ "$#" -gt 1 -a "$1" = "-lstversion" ]; then
		LSTVERSION=$2
		shift 2
	elif [ "$#" -gt 1 -a "$1" = "-destdir" ]; then
		TMPDIR=$2
		shift 2
	else
		PrintUsage 
		exit 1
	fi
done

# Main
#

# Initialize Database
#
if [ "$APPEND" != "true" ]; then
	> $DATABASE
	> $FULLINDEX
	> $SELECTLIST
fi


cd $SRCPATH  

if [ "$VERBOSE" != "" ]; then
	echo "cd $SRCPATH"
	echo "We have there:"
	ls -l *
fi
for i in $SRCPATH/$DISKNAME/* ; do
	if [ -d $i ]; then
		DISKNAME=`basename $i `
		WHICHDISK=$DISKNAME
		if [ "$USESERIES" != "" ]; then
			echo "Testing $DISKNAME against $USESERIES "
			dummy=` echo "$DISKNAME" | sed "s/$USESERIES//" `
			# if [ ${#dummy} -gt 1 ]; then
			if [ "$dummy" -gt 0 -a "$dummy" -lt 10 ]; then
				echo "Skipping ..."
				continue
			fi
		fi
		if [ "$VERBOSE" != "" ]; then
			echo "cd $SRCPATH/$DISKNAME"
			cd $SRCPATH/$DISKNAME
			echo "We have there:"
			ls -l *
		fi
		if [ "$USEINDEX" != "" ]; then
			INDEX=$USEINDEX
		else
			INDEX=$DISKNAME.idx
		fi
		if [ ! -f $INDEX ]; then
			echo "keinen Index $INDEX in $SRCPATH/$DISKNAME gefunden ! "
		fi
		for j in $SRCPATH/$DISKNAME/* ; do
			FILENAME=`basename $j `
			INFO=
			DATA=
			DEPENDON=
			PACKAGE=
			SELECTION=
			UNCOMPBYTES=
			SHORTPRIO=
			WHICHVERSION=
			PKGSIZE=
			EFFECTON=
			PACKAGE=` basename $DISKNAME/$FILENAME .tgz `
			echo -n "Processing $DISKNAME/$FILENAME: "
			if [ "$DISKNAME.idx" = "$FILENAME" ]; then
				# Index
				echo " = Index $FILENAME "
				continue	
			elif [ "$PACKAGE.tgz" = "$FILENAME" ]; then
				# Paket
				# teste, ob Beschreibung vorhanden und welche Prioritaet 
				echo -n " = Paket $PACKAGE "
				if [ "$USEBASE" != "" ]; then
					# get Data from Database
					DATA=` cat $USEBASE | fgrep ":$PACKAGE:" `
					DEPENDON=` echo "$DATA" | cut -d':' -s -f 1 `
					SELECTION=` echo "$DATA" | cut -d':' -s -f 3 `
					SHORTPRIO=` echo "$DATA" | cut -d':' -s -f 4 `
					UNCOMPBYTES=` echo "$DATA" | cut -d':' -s -f 5`
					WHICHDISK=` echo "$DATA" | cut -d':' -s -f 6`
					PKGSIZE=` echo "$DATA" | cut -d':' -s -f 7 `
					WHICHVERSION=` echo "$DATA" | cut -d':' -s -f 8 `
					EFFECTON=` echo "$DATA" | cut -d':' -s -f 9 `
				else
					# get Data from INFO and other
					if [ "$USEINDEX" != "" ]; then
						INDEX=$USEINDEX
						INFO="` fgrep ":$PACKAGE:" $INDEX `"
					elif [ -f $INDEX ]; then
						INFO="`fgrep ":$PACKAGE:" $INDEX`"	
					else
						INFO=""
					fi
					if [ "$INFO" = "" ]; then
						echo "hat keine Beschreibung ! "
						continue
					elif echo $INFO | fgrep '[d]' > /dev/null 2>&1 ; then
						SHORTPRIO="D"
					elif echo $INFO | fgrep '[a]' > /dev/null 2>&1 ; then
						SHORTPRIO="A"
					elif echo $INFO | fgrep '[r]' > /dev/null 2>&1 ; then
						SHORTPRIO="R"
					elif echo $INFO | fgrep '[o]' > /dev/null 2>&1 ; then
						SHORTPRIO="O"
					else
						echo -n "unbekannte Prioritaet ! "
						SHORTPRIO="U"
					fi
					# Prioritaet bestimmen
					case $SHORTPRIO in
					D | R )
						SELECTION=j
						;;
					*)
						SELECTION=n
						;;
					esac
					# Groessen bestimmen
					PKGSIZE=` filesize $FILENAME `
					UNCOMPBYTES=` gzip -l $FILENAME | fgrep "$PACKAGE" | cut -c 10-19 | sed 's/ //g' `
				fi
			else
				# unbekannter File
				echo "unbekannte Datei ! Skipping ..."
				continue
			fi
			if [ "$LSTVERSION" != "" ]; then
				WHICHVERSION=$LSTVERSION
			fi

			echo

			# make the database entry
			DATA="$DEPENDON:$PACKAGE:$SELECTION:$SHORTPRIO:$UNCOMPBYTES:$WHICHDISK:$PKGSIZE:$WHICHVERSION:$EFFECTON"
			if [ "$QUERY" != "" ]; then
				echo "INFO is : "
				echo "$INFO"
				echo "DATA is : "
				echo "$DATA"
				while [ 1 ]; do
					echo -n "Selection (j/n) ? [$SELECTION] : "
					read ans
					if [ "$ans" = "" ]; then
						break
					elif [ "$ans" = "j" -o "$ans" = "n" ]; then
						SELECTION=$ans
						break
					else
						echo "ungueltige Eingabe !"
					fi
				done
			fi
			# make consistency checks
			OLDDATA=` fgrep ":$PACKAGE" $DATABASE ` 
			OLDINFO=` fgrep ":$PACKAGE:" $FULLINDEX `
			OLDSELECT=` ( sed 's/^/X/' | sed 's/$/Y/' ) < $SELECTLIST | fgrep "X${PACKAGE}Y" `

			if [ "$OLDDATA" != "" ] ; then
				echo
				echo "Fehler ! Folgender Eintrag bereits in der Datenbank vorhanden :"
				echo "$OLDDATA"
				while [ 1 ]; do
					echo
					echo -n "alten Eintrag loeschen ? (j/n) ? [j] : "
					read ans
					if [ "$ans" = "n" ]; then
						break
					fi
					if [ "$ans" = "j" -o "$ans" = "n" ]; then
						sed "/:$PACKAGE:/d" < $DATABASE > $DATABASE.tmp
						mv $DATABASE.tmp $DATABASE
						break
					fi
				done
			fi
			if [ "$OLDINFO" != "" ] ; then
				echo
				echo "Fehler ! Folgender Eintrag bereits im Gesamtindex vorhanden :"
				echo "$OLDINFO"
				while [ 1 ]; do
					echo
					echo -n "alten Eintrag loeschen ? (j/n) ? [j] : "
					read ans
					if [ "$ans" = "n" ]; then
						break
					fi
					if [ "$ans" = "j" -o "$ans" = "n" ]; then
						sed "/:$PACKAGE:/d" < $FULLINDEX > $FULLINDEX.tmp
						mv $FULLINDEX.tmp $FULLINDEX
						break
					fi
				done
			fi
			if [ "$OLDSELECT" != "" ] ; then
				echo
				echo "Fehler ! Paket war bereits in der SELECTLIST vorhanden :"
				while [ 1 ]; do
					echo
					echo -n "alten Eintrag loeschen ? (j/n) ? [j] : "
					read ans
					if [ "$ans" = "n" ]; then
						break
					fi
					if [ "$ans" = "j" -o "$ans" = "n" ]; then
						sed "/:$PACKAGE:/d" < $SELECTLIST > $SELECTLIST.tmp
						mv $SELECTLIST.tmp $SELECTLIST
						break
					fi
				done
			fi
				
			# append data to the database
			DATA="$DEPENDON:$PACKAGE:$SELECTION:$SHORTPRIO:$UNCOMPBYTES:$WHICHDISK:$PKGSIZE:$WHICHVERSION:$EFFECTON"
			if [ "$callname" = "mklstbase" ]; then
				echo "$DATA" >> $DATABASE
				echo "$INFO" >> $FULLINDEX
				if [ "$SELECTION" = "j" ]; then
					echo "$PACKAGE" >> $SELECTLIST
				fi
			else
				if [ "$callname" = "mkfullindex" ]; then
					# append info to fullindex 
					echo "$INFO" >> $FULLINDEX
				fi
				if [ "$callname" = "mkdatabase" ]; then
					echo "$DATA" >> $DATABASE
				fi
				if [ "$callname" = "selectlist" -a "$SELECTION" = "j" ]; then
					echo "$PACKAGE" >> $SELECTLIST
				fi
			fi

			if [ "$VERBOSE" != "" ]; then
				echo -n "Paket $PACKAGE "
				if [ "$SELECTION" = "j" ]; then
					echo "selekiert"
				else
					echo "nicht selektiert"
				fi
			fi
			if [ "$VERBOSE" != "" ]; then
				echo "INFO is : "
				echo "$INFO"
				echo "DATA is : "
				echo "$DATA"
			fi
		done
		cd ..
	else
		echo "$SRCPATH/$DISKNAME ist kein Verzeichnis ! "
	fi	
done

		

