#!/bin/sh
##
#  Korinf project
#
#  Common rpm build packages in chrooted Linux system
#
#  Copyright (c) Etersoft <http://etersoft.ru> 2005, 2006, 2007, 2009
#  Copyright (c) Vitaly Lipatov <lav@etersoft.ru> 2009
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU Affero General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.

#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU Affero General Public License for more details.

#  You should have received a copy of the GNU Affero General Public License
#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
##

# We hope here BUILDERHOME is clean already

convert_rpm_to_target()
{
	local dist=$1

	# FIXME: when build to remote dist, we need generic src.rpm
	echo "Convert '$BUILDSRPM' for $dist distro"
	rm -f $BUILDERHOME/tmp/$BUILDNAME*
	if [ -n "$MAKESPKG" ] ; then
		ROOTDIR=$BUILDROOT $RPMBPH -v -n -z $BUILDSRPM
		BUILTRPM=~/$RPMSDIR
		return 0
	else
		ROOTDIR=$BUILDROOT ETERDESTSRPM=$BUILDERHOME/tmp $RPMBPH -v -n $BUILDSRPM
		BUILTRPM=$BUILDERHOME/$RPMSDIR
	fi

	# Get real src.rpm name
	TARGETSRPM=`basename $(echo $BUILDERHOME/tmp/$BUILDNAME*.src.rpm | head -n1)`
	[ -r "$BUILDERHOME/tmp/$TARGETSRPM" ] && [ -f "$BUILDERHOME/tmp/$TARGETSRPM" ] || { warning "Can't read target $TARGETSRPM src.rpm in $BUILDERHOME/tmp" ; return 1 ; }
	$SUDO chown $LOCUSER $BUILDERHOME/tmp/$TARGETSRPM

	return 0
}

set_target_var()
{
	TARGET=`ROOTDIR=$BUILDROOT /usr/bin/distr_vendor -p`
	TARGETPKGDISTRO=`ROOTDIR=$BUILDROOT /usr/bin/distr_vendor -s`

	[ -z "$TARGET" ] && { warning "TARGET is empty" ; return 1 ; }

	# HACK for Gentoo
	if [ -n "$BOOTSTRAP" ] ; then
		[ "$TARGET" = "tbz2" ] && TARGET=rpm
	else
		[ "$TARGET" = "tbz2" ] && TARGET=tar.bz2
	fi
	return 0
}

build_rpms()
{
	local dist=$1

	# create needed files in home directory
	init_home
	INTBUILT=/home/$INTUSER/$RPMSDIR

	echo "Build '$BUILDSRPM' for $dist distro"
	# FIXME: problem if system's rpm does not recognize our src.rpm (as Mandriva 2007.1/2008)
	RPMBUILDROOT="/home/$INTUSER/tmp/$BUILDNAME-buildroot"
	RPMBUILDNODEPS=""
	# Skip buildreqs checking on non RPM systems
	[ "$TARGET" != "rpm" ] && RPMBUILDNODEPS="--nodeps"
	CMDBUILD="rpmbuild -v --rebuild $RPMBUILDNODEPS --buildroot $RPMBUILDROOT /home/$INTUSER/tmp/$TARGETSRPM --target $BUILDARCH"
	CMDAFTERBUILD="cat ~/tmp/rpm-tmp.* ; cat ~/$RPMSDIR/../BUILD/${BUILDNAME}*/config.log; cat ~/$RPMSDIR/../BUILD/${BUILDNAME}*/config.h ; cat ~/$RPMSDIR/../BUILD/${BUILDNAME}*/include/config.h"

	# Control file for check build result
        LOGFAILFILE="$BUILDERHOME/RPM/log/$BUILDNAME.log.failed"
	rm -f "$LOGFAILFILE" "$LOGFAILFILE.clog"

	echo "Chrooting as $INTUSER and run $CMDBUILD command in $BUILDARCH system"
	$NICE setarch $BUILDARCH $SUDO chroot $BUILDROOT \
		su - $INTUSER -c "export LANG=C ; export LC_MESSAGES=C ;  umask 002 ; mkdir -p ~/RPM/log ; rm -f ~/tmp/rpm-tmp.* ; $CMDBUILD || touch ~/RPM/log/$BUILDNAME.log.failed ; ( $CMDAFTERBUILD ) >~/RPM/log/$BUILDNAME.log.failed.clog "

	if [ -r "$LOGFAILFILE" ] ; then
		rm -f "$LOGFAILFILE" ; warning "build failed"
		[ -r "$LOGFAILFILE.clog" ] && mv "$LOGFAILFILE.clog" "${LOGFILE/.log/.conf.log}"
		return 1
	fi

	# Workaround again flow target dirs
	pushd $BUILTRPM || { warning "can't chdir to $BUILTRPM" ; return 1; }
	test -d i586 && mv -f i586/* ./
	test -d x86_64 && mv -f x86_64/* ./
	test -d noarch && mv -f noarch/* ./
	popd
	return 0
}


run_alien()
{
	BUILDARCH=$BUILDARCH CC=$KORINFDIR/korinf/helpers/gcc-stub-dumpmachine fakeroot setarch $BUILDARCH alien --keep-version --scripts --veryverbose $@ || return
	# don't remove due using rpm after converting (f.i. for Gentoo)
	# remove source rpm if converted successfully
	#shift
	#rm -f $@
}

convert_by_target()
{
	local RELPKG=$PACKAGERELEASE$TARGETPKGDISTRO
	local RES=0
	case $TARGET in
	"deb")
		# Debian/Ubuntu
		run_alien --to-$TARGET *${BUILDNAME}*.rpm || { warning "alien problem with deb"; RES=1 ; }
		;;
	"tgz")
		# Slackware
		run_alien --to-$TARGET *${BUILDNAME}*.rpm || { warning "alien problem with tgz"; RES=1 ; }
		for i in *${BUILDNAME}*.tgz ; do test -r "$i" && mv $i `basename $i .tgz`-$RELPKG.tgz ; done
		;;
	*)
		fatal "unknown $TARGET"
	esac
	return $RES
}

# Only with $TARGET
convert_rpm()
{
	local RELPKG=$PACKAGERELEASE$TARGETPKGDISTRO.$BUILDARCH
	local RES=0
	pushd $BUILTRPM
	ls -l
	echo "Make target packages for $TARGET ($TARGETPKGDISTRO)"

	case $TARGETPKGDISTRO in
		"gentoo")
			# Gentoo
			echo "Using alien now"
			run_alien --to-tgz *${BUILDNAME}*.rpm || { warning "alien problem with tbz2"; RES=11 ; }
			for i in *${BUILDNAME}*.tgz ; do
				local TARBNAME=`basename $i .tgz`
				cat "$i" | gunzip -c | bzip -c > "$TARBNAME-$RELPKG.tar.bz2" || { warning "can't repack files" ; RES=11 ; }
				rm -f "$i"
			done
			echo "Generate ebuild"
			gen_ebuild
			;;
		"archlinux")
			# ArchLinux
			convert_archlinux
			;;
		*)
			convert_by_target
			RES=$?
	esac


	popd
	return $RES
}

