# This is for inclusion from other files
#
# TODO: everything except for bundle target needs to be reviewed
#

function info() {
	echo -e "\e[00m\e[01;32m$0: $*\e[00m" 1>&2
}


function error() {
	echo -e "\e[00m\e[01;31m$0: $*\e[00m" 1>&2
        exit 1
}

function checkdef() {
	var=\$$1

        value=$(eval echo $var)
        if test -z $value; then
                error "$1 is not defined"
	fi
}


function guess_platform() {
	str=$(cat /.distro)
	if test -z $str; then
		error "/.distro file not found, unknown environment"
	fi
	case $str in
	suse93-*) echo .suse93 ;;
	rhel4-*) echo .rhel4 ;;
	fc4-*) echo "" ;;
	*) error "Unknown distro $str" ;;
	esac
}


function detect_version() {
	grep AC_INIT $1/configure.in|sed -e 's/^AC_INIT([^,]*,\s*\([^)]*\).*/\1/'
}


function options_for_product() {
	echo ""
}

function detect_arch() {
	case $(arch) in
	i?86) echo "i386" ;;
	*) error "Unknown arch" ;;
	esac
}


############################################################################


function export_branch() {
	treedir=$1
        dstdir=$2

        if [ -f $dstdir ]; then
        	info "Erasing old contents from $dstdir"
		rm -fr $dstdir
	fi
        info "Checking out $treedir to $dstdir..."
        (cd $treedir; svn export . $dstdir)
        if [ $? -ne 0 ]; then
        	error "Error checking out $treedir."
	fi
}

function export_branch_bzr() {
	treedir=$1
        dstdir=$2

        if [ -f $dstdir ]; then
        	info "Erasing old contents from $dstdir"
		rm -fr $dstdir
	fi
        info "Checking out $treedir to $dstdir..."
        (cd $treedir; bzr export $dstdir)
        if [ $? -ne 0 ]; then
        	error "Error checking out $treedir."
	fi
}


function prepare_sources() {
	srcdir=$1
	options=$2

	info "Preparing sources in $srcdir"

        pushd $srcdir
        
	info "Running autogen $options"
	env am_opt=--copy sh autogen.sh $options -q
        if [ $? -ne 0 ]; then
        	error "Error running autogen"
	fi
        info "Cleaning up tree"
        make distclean
        rm -fr tags autom4te.cache config.log

        popd
        
}


function update_svn() {
	tree=$1
	rev=$2
	info "Updating svn tree for $tree"

	pushd $svnbasedir/$tree
	if test "$rev" = ""; then
        	svn up
	else
		svn up -r $rev
	fi
        if [ $? -ne 0 ]; then
        	error "Error updating svn tree"
	fi
        info "svn updated"
        popd
}


function update_bzr() {
	tree=$1
	rev=$2
	info "Updating bzr tree for $tree"

	pushd $bzrbasedir/$tree
	if test "$rev" = ""; then
        	bzr pull
	else
		bzr pull -r $rev
	fi
        if [ $? -ne 0 ]; then
        	error "Error updating bzr tree"
	fi
        info "bzr updated"
        popd
}



function make_source_tar() {
	product=$1
        branch=$2
        guicbranch=$3
        guicoptions=$4
	productoptions=$5

	version=$(detect_version $svnbasedir/$product/$branch)

	info "Will create tarball for $product-$version"
	echo "Press Enter to continue..."
	read

	rm -fr $workdir/$product-$version
	mkdir -p $workdir/$product-$version

	export_branch $svnbasedir/mysql-gui-common/$guicbranch $workdir/$product-$version/mysql-gui-common
	prepare_sources $workdir/$product-$version/mysql-gui-common $guicoptions

	export_branch $svnbasedir/$product/$branch $workdir/$product-$version/$product
	prepare_sources $workdir/$product-$version/$product $productoptions
	
	cp -a $docsdir/$product-docs/* $workdir/$product-$version/$product/

	(cd $workdir; tar czf $outputdir/$product-$version.tar.gz $product-$version)
	rm -fr $workdir/$product-$version

	cp $outputdir/$product-$version.tar.gz $inputdir/

	info "$inputdir/$product-$version.tar.gz written"
}

function make_bundle_source_tar() {
	product=$1
	version=$2

	info "Will create tarball for $product""r$version"

	rm -fr "$workdir/$product"r$version
	mkdir -p "$workdir/$product"r$version

	rep=mysql-gui-common
	export_branch $svnbasedir/$rep "$workdir/$product"r$version/$rep
        prepare_sources "$workdir/$product"r$version/$rep "$GUIC_OPTIONS"
	
	rep=mysql-administrator
	export_branch $svnbasedir/$rep "$workdir/$product"r$version/$rep
        prepare_sources "$workdir/$product"r$version/$rep "$MA_OPTIONS"

	rep=mysql-query-browser
	export_branch $svnbasedir/$rep "$workdir/$product"r$version/$rep
        prepare_sources "$workdir/$product"r$version/$rep "$QB_OPTIONS"

        rep=mysql-workbench
        export_branch $svnbasedir/$rep "$workdir/$product"r$version/$rep
        prepare_sources "$workdir/$product"r$version/$rep "$WB_OPTIONS"

        rep=mysql-migration-tool
        export_branch $svnbasedir/$rep "$workdir/$product"r$version/$rep
        #prepare_sources "$workdir/$product"r$version/$rep "$MT_OPTIONS"


	rm -f "$outputdir/$product"r$version.tar.gz
	(cd $workdir; tar czf "$outputdir/$product"r$version.tar.gz "$product"r$version)
        rm -fr "$workdir/$product"r$version

        info "$outputdir/$product""r$version.tar.gz written"
}


#############################################################################

function build_rpm() {
	product=$1
	branch=$2
	plat=$3

	case $plat in
		.suse*) rpmdir=/usr/src/packages ;;
		.rhel*) rpmdir=/usr/src/redhat ;;
		.fc*) rpmdir=/usr/src/redhat ;;
		*) rpmdir=/usr/src/redhat plat=%nil ;;
	esac
	info "Updating build info and spec"
        version=$(detect_version $svnbasedir/$product/$branch)
	file=$product-$version.tar.gz
	sed -e  "s/%targos.*/%targos $plat/" ~/.rpmmacros > rpmm
	rm -f ~/.rpmmacros
	mv -f rpmm ~/.rpmmacros

	sudo cp $outputdir/$file $rpmdir/SOURCES
	sed -e "s/^%define version.*/%define version $version/" $inputdir/$product.spec > tmpspec
	sudo mv -f tmpspec $rpmdir/SPECS/$product.spec
	info "Starting build..."
	sudo rpmbuild -ba $rpmdir/SPECS/$product.spec
	if [ $? -ne 0 ]; then
		error "RPM build failed"
	fi
	cp $rpmdir/RPMS/*/$product-$version*rpm $outputdir
	cp $rpmdir/SRPMS/$product-$version*rpm $outputdir
	rm $outputdir/*debuginfo*
}


function copy_bundle_stuff() {
	product=$1

        mkdir -p $product/lib/gdk-pixbuf/loaders
        mkdir -p $product/lib/gtk-engines
        mkdir -p $product/lib/pango

	for f in $PIXBUF_LOADERS; do
        	cp $PIXBUF_LOADER_PATH/$f $product/lib/gdk-pixbuf/loaders
        done
        for f in $PANGO_MODULES; do
        	cp $PANGO_MODULE_PATH/$f $product/lib/pango
        done
        cp $GTK_ENGINE_PATH $product/lib/gtk-engines
        
        cat<<EOF > $product/lib/pangorc
[Pango]
ModuleFiles = /opt/$product/lib/pango.modules
EOF

	cat<<EOF > $product/lib/pango.modules
/opt/$product/lib/pango/pango-basic-fc.so BasicScriptEngineFc PangoEngineShape PangoRenderFc armenian:* bopomofo:* cherokee:* coptic:* cyrillic:* deseret:* ethiopic:* georgian:* gothic:* greek:* han:* hiragana:* katakana:* latin:* ogham:* old-italic:* runic:* canadian-aboriginal:* yi:* braille:* cypriot:* limbu:* osmanya:* shavian:* linear-b:* ugaritic:* common:
/opt/$product/lib/pango/pango-basic-x.so BasicScriptEngineX PangoEngineShape PangoRenderX common:
EOF

	cat<<EOF > $product/lib/gdk-pixbuf.loaders
# GdkPixbuf Image Loader Modules file
# Automatically generated file, do not edit
# Created by gdk-pixbuf-query-loaders from gtk+-2.6.10
#
#LoaderDir = lib/gdk-pixbuf/loaders
#
"/opt/$product/lib/gdk-pixbuf/loaders/libpixbufloader-xpm.so"
"xpm" 4 "gtk20" "The XPM image format"
"image/x-xpixmap" ""
"xpm" ""
"/* XPM */" "" 100

"/opt/$product/lib/gdk-pixbuf/loaders/libpixbufloader-gif.so"
"gif" 4 "gtk20" "The GIF image format"
"image/gif" ""
"gif" ""
"GIF8" "" 100

"/opt/$product/lib/gdk-pixbuf/loaders/libpixbufloader-png.so"
"png" 5 "gtk20" "The PNG image format"
"image/png" ""
"png" ""
"\211PNG\r\n\032\n" "" 100

"/opt/$product/lib/gdk-pixbuf/loaders/libpixbufloader-jpeg.so"
"jpeg" 5 "gtk20" "The JPEG image format"
"image/jpeg" ""
"jpeg" "jpe" "jpg" ""
"\377\330" "" 100
EOF
}


function build_bintar_component() {
	product=$1
	component=$2
	options=$3

	info "Building $component with options $options"
	pushd $component
	./configure --prefix=/opt/$product $options
	make
	if [ $? -ne 0 ]; then
		error "Error building $component"
	fi

	if test $component != mysql-gui-common; then
		if [ ! -f source/linux/$component ]; then
			error "Error building $component (binary wasnt created)"
		fi
	fi

	popd
}


function build_bintar_mt() {
	product=$1
	component=$2
	options=$3

	info "Building $component with options $options"
	pushd $component
	
        ./build_mt_script.sh
        
	if [ $? -ne 0 ]; then
		error "Error building $component"
	fi

        path=$component*

        tar czf $path.tar.gz $path

	popd
}


function install_bintar_component() {
	component=$1

	pushd $component
	make DESTDIR=$workdir/out install >> $workdir/logs
	popd
}


function build_bintar() {
        product=$1
        branch=$2
        plat=$3
     	guicopts=$4
	prodopts=$5
	bundlepkg=$6

	info "Building binary tarball of $product"
	version=$(detect_version $svnbasedir/$product/$branch)
	file=$product-$version.tar.gz

	basedir=`pwd`	

	rm -fr $workdir/build/$product-$version
	mkdir -p $workdir/build
	tar xzf $outputdir/$file -C $workdir/build/
	pushd $workdir/build/$product-$version

	build_bintar_component $product mysql-gui-common $guicopts
	
	build_bintar_component $product $product $prodopts

	if test "$bundlepkg" != "1"; then
		if [ -f $basedir/$product-static ]; then
			info "Making static binary with $basedir/$product-static"
			pushd source/linux
			rm -f $product-bin
			$basedir/$product-static
			popd
		else
			sh source/linux/static_make
		fi
	fi
	if ! [ -f source/linux/$product-bin ]; then
		error "Error building $product"
	fi
	popd
	rm -fr $workdir/out
	mkdir -p $workdir/out
	info "make install"
	pushd mysql-gui-common
	make DESTDIR=$workdir/out install >> $workdir/logs
	popd
	pushd $product
	make DESTDIR=$workdir/out install >> $workdir/logs
	popd
	pushd $workdir/out/opt

	if test "$bundlepkg" = "1"; then
		info "Bundling binary and shared libraries"
		mv $product $product-orig
		mkdir $product
		# copy data and binaries from $product-orig
		cp -a $product-orig/share $product/
		cp $product-orig/bin/* $product/
		mv $product/share/applications/*.desktop $product/
		rmdir $product/share/applications
		# copy linked shared libraries
		copy_shared_libs $product/$product-bin $product/
                
		copy_bundle_stuff $product
	fi

	

	tar czf $outputdir/$product-$version-linux-$(detect_arch).tar.gz $product
	info "Wrote file"
}


function copy_linked_libs() {
	binpath=$1
	destfolder=$2

	liblist=`ldd $binpath-bin | sed 's/\t[^\ ]*[\ ]*=>\?[\ ]*\([^\ ]*\).*/\1/' | sed s/^[^\/].*// | grep -v '^$'`
	/bin/cp $liblist $destfolder
	pushd $destfolder
	/bin/rm -f $EXCLUDED_SHARED_LIBS
	popd
}


function move_around_bundle_files() {
	path=$1

	info "Moving around bundle contents"
	mv $path/bin/* $path/
	rmdir $path/bin
	mv $path/share/applications/* $path/
	rmdir $path/share/applications
}


function build_bundle_bintar() {
        product=$1
	release=$2
        pkgplat=$3
	

	info "Building binary tarball for $product bundle"
	srcfile="$product"r$release.tar.gz

	basedir=`pwd`

	# unpack
	rm -fr "$workdir/build/$product"r$release
	mkdir -p $workdir/build
	tar xzf $outputdir/$srcfile -C $workdir/build/
	pushd "$workdir/build/$product"r$release

	build_bintar_component $product mysql-gui-common "$GUIC_OPTIONS"

	build_bintar_component $product mysql-administrator "$MA_OPTIONS"
	build_bintar_component $product mysql-query-browser "$QB_OPTIONS"
#	build_bintar_component $product mysql-workbench "$WB_OPTIONS"
	build_bintar_mt $product mysql-migration-tool "$MT_OPTIONS"

	rm -fr $workdir/out
	mkdir -p $workdir/out
	info "make install"
	install_bintar_component mysql-gui-common
	install_bintar_component mysql-administrator
	install_bintar_component mysql-query-browser
#	install_bintar_component mysql-workbench


	pushd $workdir/out/opt


        info "Copying MT"
        mkdir -p $product/migration-tool-script
        cp -a "$workdir/build/$product"r$release/mysql-migration-tool/mysql-migration-toolkit-script*/* $product/migration-tool-script/


	info "Copying linked external libraries and data files"
	mkdir -p $product/lib
	copy_linked_libs $product/bin/mysql-administrator $product/lib
	copy_linked_libs $product/bin/mysql-query-browser $product/lib
#	copy_linked_libs $product/bin/mysql-workbench $product/lib

	copy_bundle_stuff $product

	move_around_bundle_files $product

	info "Moving around installed files"
	pushd $workdir/out/opt/$product
	for i in *.desktop; do
		sed -e s#/opt/$product/bin#/opt/$product#g $i > $i.
		mv -f $i. $i
	done
	popd

        info "Copying documentation"
        mkdir -p $product/share/mysql-gui/administrator/manual
        cp -a $workdir/docs/ma-chapter/* $product/share/mysql-gui/administrator/manual/

        mkdir -p $product/share/mysql-gui/query-browser/manual
        cp -a $workdir/docs/qb-chapter/* $product/share/mysql-gui/query-browser/manual/
        

	tar czf "$outputdir/$product"r$release-$pkgplat.tar.gz $product
	popd

	info "Wrote file $outputdir/$product"r$release-$pkgplat.tar.gz
}


#############################################################################

function copy_shared_libs {
	progname=$1
	destfolder=$2

	liblist=`ldd $progname | sed 's/\t[^\ ]*[\ ]*=>\?[\ ]*\([^\ ]*\).*/\1/' | sed s/^[^\/].*// | grep -v '^$'`
	cp $liblist $2
	cd $2
	rm -rf $EXCLUDED_SHARED_LIBS
	cd $OLDPWD
}

#############################################################################

function state_dir_for_file() {
	f=$1
	case $f in
		mysql-administrator*) echo $admin_stage ;;
		mysql-query-browser*) echo $admin_stage ;;
		mysql-workbench*) echo $devel_stage ;;
		mysql-migration-tool*) echo $devel_stage ;;
		*) error "Dont know what is $f" ;;
	esac
}


function upload_privftp() {
	true
}


function upload_stage() {
	rm -fr $workdir/checksums
	mkdir $workdir/checksums
	
	for f in $*; do
		ln -s `pwd`/$f $workdir/checksums
		pushd $workdir/checksums
		md5sum $f > $f.md5
		popd
	done

	for f in $*; do
		dir=$(stage_dir_for_file $f)
		scp $workdir/checksums/{$f,$f.md5} $dir
	done
}




