#!/bin/bash
#
# --- ROCK-COPYRIGHT-NOTE-BEGIN ---
# 
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
# Please add additional copyright information _after_ the line containing
# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by
# the ./scripts/Create-CopyPatch script. Do not edit this copyright text!
# 
# ROCK Linux: rock-src/scripts/Config
# ROCK Linux is Copyright (C) 1998 - 2003 Clifford Wolf
# 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. A copy of the GNU General Public
# License can be found at Documentation/COPYING.
# 
# Many people helped and are helping developing ROCK Linux. Please
# have a look at http://www.rocklinux.org/ and the Documentation/TEAM
# file for details.
# 
# --- ROCK-COPYRIGHT-NOTE-END ---

if [ -z "${lines:=$LINES}" -o -z "${columns:=$COLUMNS}" ] ; then
	if [ "$( type -p stty )" ] ; then
		lines="$(   stty size | cut -d' ' -f1 )"
		columns="$( stty size | cut -d' ' -f2  )"
	fi
	[ -z "$lines"   -o "$lines"   -le 0 ] 2> /dev/null && lines=24
	[ -z "$columns" -o "$columns" -le 0 ] 2> /dev/null && columns=80
fi

eval "$(egrep '^rockver=' scripts/parse-config)"

config=default
do_config_cycle=0
delete_mode=0
oldconfig=''

while [ "$1" ] ; do
        case "$1" in
	    -cycle)	do_config_cycle=1 ; shift ;;
	    -delete)	delete_mode=1     ; shift ;;
	    -oldconfig)	oldconfig='-oldconfig'    ; shift ;;
	    -cfg)	config="$2"       ; shift ; shift ;;

	    *)
		echo "Usage: $0 [ -delete | -oldconfig ] [ -cfg <config> ]"
		exit 1 ;;
        esac
done

if [ $delete_mode = 1 ] ; then
	rm -rv config/$config
	exit $?
fi

if [ $do_config_cycle = 0 ] ; then

	rm -f config.data config.dialog config.out config.help
	rm -f config.pcache.data config.pcache.cmd
	rm -f rockdialog.scrltmp # src/rockdialog.bin
	mkdir -p src

	if [ -z "$oldconfig" -a ! -f src/rockdialog.bin ] ; then
		echo "Creating rockdialog tool ..."
		command="gcc misc/rockdialog/*.c `
			`-Imisc/rockdialog -lncurses -o src/rockdialog.bin"
		echo "$command" ; eval "$command.$$"
		mv src/rockdialog.bin.$$ src/rockdialog.bin
	fi

	echo "Creating configuration script ..."
	cat << "EOT" > src/rockconfig.awk.$$
#!/usr/bin/awk -f

FNR == 1 {
        if ( lastfile ) {
                print "### END of " lastfile;
        }
        print "### BEGIN of " FILENAME;
        lastfile = FILENAME;
}

END {
        print "### END of " FILENAME;
}

$1 == "%include" {
        $1 = "awk -f src/rockconfig.awk";
        system($0);
        next;
}

$1 == "#" { next; }
{ print; }
EOT
	mv src/rockconfig.awk.$$ src/rockconfig.awk
	awk -f src/rockconfig.awk scripts/config.in > src/rockconfig.in.$$ 2> /dev/null
	mv src/rockconfig.in.$$ src/rockconfig.in

	echo "Running ROCK Linux $rockver configuration ..."
	while "$0" -cfg $config $oldconfig -cycle ; do : ; done

	exit 0
fi

set_help() {
	(echo -ne "$1 '$1:\n\n$2'" | sed 's,$,\\n,' |
		tr -d '\n' | sed 's,\\n$,,'; echo ) >> config.help
}

comment() {
	if [ $ROCKCFG_EXPERT -eq 1 -o $expert -eq 0 ] && \
	   [ $menu_current = $menu_this ] ; then
		commentnr=$(( $commentnr + 1 ))
		echo "COMMENT_$commentnr '$spacer$1'" >> config.dialog

		# Hi, esden here, very ill stuff here I save the help
		# strings here to a temporary file named config.help
		# this sed tr sandwitch formats the string so that
		# \n are masked and the Help strings are not killed some way
		if [ "$2" != "" ] ; then
			set_help "COMMENT_$commentnr" "$2"
		fi
	fi
}

comment_id() {
	if [ $ROCKCFG_EXPERT -eq 1 -o $expert -eq 0 ] &&
	   [ $menu_current = $menu_this ] ; then
		echo "$2 '$spacer$1'" >> config.dialog

		# If you do not know what mighty esden
		# is doing here see comment()
		if [ "$3" != "" ] ; then
			set_help "$2" "$3"
		fi
	fi
}

const() {
	eval "$1=\"\$2\""
	echo "export $1='$2'" >> config/$config/config
}

# Usage: set_data NAME DEFAULT
#
set_data() {
	set_name="ROCKCFGSET_${1#ROCKCFG_}"

	if eval "[ \"\$$set_name\" ]" ; then
		eval "data=\"\$$set_name\""
		eval "$1=\"\$data\""
		if [ $ROCKCFG_EXPERT -eq 1 -o $expert -eq 0 ]
		then menumode=2 ; else menumode=0 ; fi

	elif [ $ROCKCFG_EXPERT -eq 1 -o $expert -eq 0 ] ; then
		eval "data=\"\${$1:-$2}\""
		eval "$1=\"\$data\""
		menumode=1
	else
		data="$2" ; eval "$1=\"\$data\""
		menumode=0
	fi

	item="$1"
	echo "export $1='$data'" >> config/$config/config
}

choice() {

	# reset to default if current value is not in list
	#
	eval $(
		eval "value=\$$1" ; name=$1 ; shift ; shift
		while [ "$#" != 0 ] ; do
			[ "$value" = "$1" ] && name="" ; shift ; shift
		done
		[ "$name" ] && echo "unset $name"
	)

	set_data "$1" "$2"

	if [ "$menumode" -eq 1 -a $menu_current = $menu_this ] ; then
		{ echo -en "$item\tchoice_action '$1' '$data'" ; shift ; shift
		for x ; do echo -n " '$x'" ; done ; echo ; } >> config.data
	fi

	if [ "$menumode" -gt 0 -a $menu_current = $menu_this ] ; then
		if [ "$menumode" -eq 1 ] ; then xdata="($data)"
		else xdata="=$data=" ; fi

		while [ "$1" -a "$1" != "$data" ] ; do shift ; shift ; done
		printf "'$item' '$spacer%-${tabspace}s ${2//_/ }'\n" \
		       "$xdata" >> config.dialog
	fi
}

choice_action() {
	command="./src/rockdialog.bin --title 'Build Config' \
		--backtitle '$configtitle' \
		--radiolist 'Arrow keys navigate the menu.  Press <Enter> to activate menu items.  Highlighted letters are hotkeys.' \
		$(( $lines - 4 )) $(( $columns - 5 )) $(( $lines - 12 ))"
	default=$2 ; item=$1 ; shift ; shift
	while [ "$1" ] ; do
		if [ "$1" = "$default" ]
		then command="$command '$1' '${2//_/ }' ON"
		else command="$command '$1' '${2//_/ }' OFF" ; fi
		shift ; shift
	done
	eval "$command" 2> config.out

	case "$?" in
		0|6)
			eval "$item='`cat config.out`'"
			;;
		1|255) return 0 ;;
		2) echo "No help." ; sleep 1 ;;
		*) echo "unknown returncode: $?" ; exit 1 ;;
	esac
}

text() {
	set_data "$2" "$3"

	if [ "$menumode" -eq 1 -a $menu_current = $menu_this ] ; then
		echo -e "$2\ttext_action '$1' '$2' '$data'" >> config.data
	fi

	if [ "$menumode" -gt 0 -a $menu_current = $menu_this ] ; then
		xdata="$(echo $data | cut -c1-20)"
		if [ "$menumode" -eq 1 ] ; then xdata="($xdata)"
		else xdata="=$xdata=" ; fi

		printf "'$2' '$spacer%-${tabspace}s $1'\n" \
			"$xdata" >> config.dialog

		# If you do not know what mighty esden is doin here see comment()
		if [ "$4" != "" ] ; then
			set_help "$2" "$4"
		fi
	fi
}

text_action() {
	./src/rockdialog.bin --title 'Build Config' \
		--backtitle "$configtitle" \
		--inputbox "$1" 9 $(( $columns - 5 )) "$3" 2> config.out
	[ "$?" -eq 0 -o "$?" -eq 1 ] && eval "$2='`cat config.out`'"
}

bool() {
	local x
	set_data "$2" "$3"

	if [ "$menumode" -eq 1 -a $menu_current = $menu_this ] ; then
		echo -e "$2\tbool_action '$1' '$2' '$data'" >> config.data
	fi

	if [ "$menumode" -gt 0 -a $menu_current = $menu_this ] ; then
		if [ "$menumode" -eq 1 ] ; then
			if [ $data -eq 0 ] ; then x='[ ]' ; else x='[*]' ; fi
		else
			if [ $data -eq 0 ] ; then x='= =' ; else x='=*=' ; fi
		fi
		printf "$2 '$spacer%-${tabspace}s ${1//_/ }'\n" \
		       "$x" >> config.dialog

		# If you do not know what mighty esden is doin here see comment()
		if [ "$4" != "" ] ; then
			set_help "$2" "$4"
		fi
	fi
}

bool_action() {
	if [ $3 -eq 0 ] ; then eval "$2=1"
	else eval "$2=0" ; fi
}

editfile() {
    if [ $ROCKCFG_EXPERT -eq 1 -o $expert -eq 0 ] ; then
	local x="$spacer"
	comment ",----< $3 >----."
	block_begin 0 ; spacer="${spacer%??}| "

	touch "$2"
	line_nr=1
	while read line ; do
		if [ $menu_current = $menu_this ] ; then
			printf "$1:${editfilenr} '$spacer%-${tabspace}s %s'\n" \
			    `printf "%03d:" $line_nr` "$line" >> config.dialog

			echo -e "$1:${editfilenr}\teditfile_action $2" \
				"$line_nr '$3'" >> config.data
		fi

		editfilenr=$(( $editfilenr + 1 ))
		line_nr=$(( $line_nr + 1 ))
	done < "$2"

	if [ $menu_current = $menu_this ] ; then
		printf "$1:${editfilenr} '$spacer%-${tabspace}s %s'\n" \
		       `printf "%03d:" $line_nr` "<add new rule>" >> config.dialog

		echo -e "$1:${editfilenr}\teditfile_action $2" \
			"$line_nr '$3'" >> config.data
	fi

	editfilenr=$(( $editfilenr + 1 ))

	block_end
	comment "\`------${3//?/-}------'\''"
	spacer="$x"
    else
	rm -f "$2"
    fi
}

editfile_action() {
	line="`tail +$2 $1 | head -1`"

	./src/rockdialog.bin --title 'Build Config' \
		--backtitle "$configtitle" \
		--inputbox "$3 - Line $3"  \
		9 $(( $columns - 5 )) "$line" 2> config.out

	head -$(( $2 - 1 )) $1 > $1.new
	[ -s config.out ] && echo "`cat config.out`" >> $1.new
	tail +$(( $2 + 1 )) $1 >> $1.new

	mv $1.new $1
}

startprog() {
	if [ $ROCKCFG_EXPERT -eq 1 -o $expert -eq 0 ] &&
	   [ $menu_current = $menu_this ] ; then
		printf "$1 '$spacer%-${tabspace}s %s'\n" \
		       "-->" "$2" >> config.dialog
		echo -e "$1\t$3" >> config.data
	fi
}

block_begin() {
	if [ $menu_current = $menu_this ] ; then
		[ "$tabspace_list" ] && spacer="$spacer  "
		tabspace_list="$tabspace $tabspace_list"
		tabspace="$(( $tabspace + $1 - 2 ))"
	fi
}

block_end() {
	if [ $menu_current = $menu_this ] ; then
		spacer="`echo "$spacer" | sed 's,..$,,'`" ;
		tabspace="`echo $tabspace_list | cut -f1 -d' '`"
		tabspace_list="`echo $tabspace_list | cut -s -f2- -d' '`"
	fi
}

expert_begin() {
	expert=$(( $exprt + 1 ))
}

expert_end() {
	expert=$(( $exprt - 1 ))
}

menu_begin() {
	menu_counter=$(( $menu_counter + 1 ))

	if [ $ROCKCFG_EXPERT -eq 1 -o $expert -eq 0 ] &&
	   [ $menu_current = $menu_this ] ; then
		printf "$1 '$spacer%-${tabspace}s %s'\n" \
			"===>" "$2" >> config.dialog
		echo -e "$1\tmenu_current=$menu_counter" >> config.data
	fi
	if [ $ROCKCFG_EXPERT -eq 1 -o $expert -eq 0 ] &&
	   [ $menu_current = $menu_counter ] ; then
		echo "$1 '===> $2'" >> config.dialog
		echo -e "$1\tmenu_current=$menu_this" >> config.data
	fi

	if [ $menu_current = $menu_counter ] ; then
		menu_back=$menu_this
		menu_backpos=$1
	fi

	menu_stack="$menu_this $menu_stack"
	menu_this=$menu_counter

	block_begin 3
}

menu_end() {
	block_end
	menu_this="`echo $menu_stack | cut -f1 -d' '`"
	menu_stack="`echo $menu_stack | cut -s -f2- -d' '`"
}

get_help() {
	# Create standard help output ...
	default_text="
There is no help on '$1' available.

This is the ROCK Linux $rockver Configuration Tool.

Please read the build Documentation (Documentation/BUILD)
and the ROCK Linux Guide  (Documentation/Guide/GUIDE.txt)
before building ROCK Linux.

More information can be found on the ROCK Linux Homepage:

	       http://www.rocklinux.org/

Subscribe to the mailing list by sending an e-mail with the
subject 'subscribe rock-linux' to <minimalist@rocklinux.org>."
	
	# Ok let us find a help for the current item ...

	# First of all mask all special chars in the item name
	# Comment: this is sick. You can't get any \n this way !!!
	item_name=$( echo "$1" | sed 's/[][\/.^$*]/\\&/g' )
	# Now search *.hlp files
	hlp_text=$( sed -n "/^$item_name[ 	]*\$/,\${
			/^$item_name[ 	]*\$/c\\
$item_name:\\

			/^#/d
			/^[^ 	]/q
			s/^  //
			p
			}" scripts/config*.hlp package/*/*/subconfig-*.hlp package/*/*/config*.hlp target/*/config*.hlp misc/config/config*.hlp 2>/dev/null )
	
	# Get help strings out of the temporary file.
	tmp_text=$(grep "^$item_name" config.help | cut -f2- -d' ' | sed -e "s,^',," -e "s,'$,," )

	# Let us see what we have ...
	if [ "$hlp_text" -a "$tmp_text" ] ; then
		echo "
There are two help text's... one in one of the config.in files and one
in one of the config.hlp files. Please remove one of them to get rid of
this message here.

Here the one out of config.in:

$tmp_text

Here the one out of config.hlp:

$hlp_text"
	elif [ "$hlp_text" ] ; then
		echo "$hlp_text"
	elif [ "$tmp_text" ] ; then
		echo "$tmp_text"
	else
		echo "$default_text"
	fi
}

arch=none
if expr "`uname -m`" : "i.86"    > /dev/null ; then arch=x86     ; fi
if expr "`uname -m`" : "alpha"   > /dev/null ; then arch=alpha   ; fi
if expr "`uname -m`" : "ppc"     > /dev/null ; then arch=powerpc ; fi
if expr "`uname -m`" : "powerpc" > /dev/null ; then arch=powerpc ; fi
current="" ; export ROCKCFG_ARCH="$arch" ; export ROCKCFG_EXPERT=0
menu_this=0 ; menu_current=0 ; menu_counter=0
menu_stack=-1 ; menu_back=-1 ; menu_backpos=-1

mkdir -p config/$config
touch config/$config/config config/$config/packages

configtitle="$(printf ' %-50s %6s active packages ]' \
	"ROCK Linux $rockver Configuration - $config" \
	"[ $(echo `grep '^X' config/$config/packages | wc -l`)" )"

. ./config/$config/config

rm -f config.dialog config.data config.help
touch config.dialog config.data config.help
echo -e "#\n# ROCK Linux $rockver Config File\n#" > config/$config/config
spacer="" ; expert=0 ; tabspace="5" ; tabspace_list=""
commentnr=0 ; editfilenr=0

cmd="./scripts/Create-PkgList"
[ "$ROCKCFG_DISABLE_BROKEN" = 1 ] && cmd="$cmd -nobroken"
cmd="$cmd $ROCKCFG_ARCH"

if [ "$cmd" != "`cat config.pcache.cmd 2> /dev/null`" ] ; then
	eval "$cmd" | tee config.pcache.data > config/$config/packages
	echo "$cmd" > config.pcache.cmd
else
	cat config.pcache.data > config/$config/packages
fi

export ROCKCFG_ID="$rockver" ; . src/rockconfig.in
echo "export ROCKCFG_ID='$ROCKCFG_ID'" >> config/$config/config

cut -f1,2,4,5,8- -d' ' config/$config/packages | sed 's, [^ ]*$,,' | \
tr ' ' '\t' | expand -t2,15,35, > config/$config/packages.txt

configtitle="$(printf ' %-50s %6s active packages ]' \
	"ROCK Linux $rockver Configuration - $config" \
	"[ $(echo `grep '^X' config/$config/packages | wc -l`)" )"

if [ -z "$oldconfig" ] ; then
    eval "./src/rockdialog.bin --title 'Build Config' \
	--backtitle '$configtitle' \
	--menu 'Arrow keys navigate the menu.  Press <Enter> to activate menu items.  Highlighted letters are hotkeys.' \
	$(( $lines - 4 )) $(( $columns - 5 )) $(( $lines - 12 )) \
	'$current' `tr '\n' ' ' < config.dialog`" 2> config.out
    returncode=$? ; item="`cat config.out`"
else
    returncode=1
fi

[ "$returncode" = 1 -a "$menu_back" -ne -1 ] && returncode="menu-back"

case "$returncode" in
	0|6)
		command="`grep "^$item	" config.data | cut -f2-`"
		{ echo -e "\n# Remember menu position:\ncurrent='$item'"
		echo -e "\n# Remember sub-menu:\nmenu_current='$menu_current'"
		echo -e "\n# Execute this config command:\n$command"
		} >> config/$config/config
		;;
	menu-back)
		{ echo -e "\n# New menu position:\ncurrent='$menu_backpos'"
		echo -e "\n# New sub-menu:\nmenu_current='$menu_back'"
		} >> config/$config/config
		;;
	1|255)
		rm -f config.data config.dialog config.out config.help
		rm -f config.pcache.data config.pcache.cmd
		rm -f rockdialog.scrltmp # src/rockdialog.bin
		echo "New config written to config/$config/*."
		echo "Cleaning up. Configuration finished."
		exit 1 ;;
	2)
		tempitem=$item
		item=$(echo $item | cut -f1 -d' ')  # dialog(1) bug?
		{ echo -e "\n# Remember menu position:\ncurrent='$item'"
		echo -e "\n# Remember sub-menu:\nmenu_current='$menu_current'"
		} >> config/$config/config

		get_help $item > config.dialog

		./src/rockdialog.bin --title 'ROCK Linux Config - Help' \
			--backtitle "ROCK Linux $rockver Configuration" \
			--textbox config.dialog \
			$(( $lines - 4 )) $(( $columns - 5 ))
		;;
	*)
		echo "unknown returncode: $returncode"
		exit 1 ;;
esac

exit 0