#!/bin/bash
# 2003-2007 (c) Etersoft www.etersoft.ru
# Author: Vitaly Lipatov <lav@etersoft.ru>
# Public domain
# $Id: rpmbph,v 1.78 2007/12/07 09:36:36 lav Exp $
#
# BPH - backport; use hasher
# 06.09.2005, 12.09.2005, 07.11.2005, 16.02.2006, 02.07.2007, 08.09.2007
# Makes backport package to any target platfrom (RPM, DEB, TGZ)
#       .    alt4
#    alt0.M24.4
# TODO: use RPMBUILDARG

. /etc/rpm/etersoft-build-functions

#VENDORVERSION=`distr_vendor -e`
DISTRVERSION=`distr_vendor -v`

# Get replacement rule for ALT package to local in $1
tolocal_anyrepl()
{
	local i
	local GREP=$1
	shift
	for i in $@ ; do
		REPLRULE=`grep -v "^#" "$i" 2>/dev/null | grep "^$GREP|" | sed -e "$WARULES" | head -n1`
		# For broken rule
		echo $REPLRULE | grep "|" >/dev/null || REPLRULE=""
		#REPLRULE=`echo $REPLRULE | sed -r -e 's,|,!,g'`
		REPLRULE1=`echo $REPLRULE | cut -d"|" -f1`
		REPLRULE2=`echo $REPLRULE | cut -d"|" -f2`
		test -n "$REPLRULE" && return 0
	done
	return 1
}

alt_tolocal()
{
local SPECNAME
SPECNAME=$1

# Set buildreq
BASERELEASE=$(get_release $SPECNAME | sed -e "s/alt//" | sed -e "s/%{_vendor}//" | sed -e "s/eter//" | sed -e "s/%_vendor//")
if [ "$VENDOR" = "alt" ] ; then
	BUILDREQ="BuildRequires: rpm-build-compat >= 0.95"
	[ -z "$BUILDCOMMAND" ] && BUILDCOMMAND=rpmbsh
	# Change release according to alt policy
	set_release $SPECNAME alt0.$MDISTR.$BASERELEASE
	ADDDEF=""
	CLEANTEXT=""
else
	BUILDREQ="BuildRequires: rpm-build-altlinux-compat >= 0.95"
	[ -z "$BUILDCOMMAND" ] && BUILDCOMMAND=rpmbb
	set_release $SPECNAME eter$BASERELEASE$VENDOR
	ADDDEF="%defattr(-, root, root)"
	CLEANTEXT=""
fi

# Do not add BuildReq if already exist
cat $SPECNAME | grep rpm-build-compat &>/dev/null && BUILDREQ=""

# fix mktemp using for MCBC
if [ "$VENDOR" = "mcbc" ] ; then
	FIXMKTEMP="%__subst "s|mktemp -dt|mktemp -d|g" configure"
else
	FIXMKTEMP=""
fi

# Too old problem
TOCHANGELOG=
if [ "$MDISTR" = "M23" ] ; then
	if grep "%configure" $SPECNAME >/dev/null && ! grep "^autoreconf" $i >/dev/null && ! grep "^%__autoreconf" $i >/dev/null ; then
		RECONFT="%__autoreconf"
		TOCHANGELOG="add __autoreconf macros in build section for fix so name problem (by script)"
	fi
fi

LISTBUILDDEP=`eval_spec $SPECNAME | grep BuildReq | sed -e "s|^.*:||g"`
LISTREQDEP=`eval_spec $SPECNAME | grep Requires | sed -e "s|^.*:||g"`
LISTDEP=`echo $LISTBUILDDEP $LISTREQDEP | xargs -n1 echo | sort -u`
LISTGROUP=`eval_spec $SPECNAME | grep Group | sed -e "s|^.*:||g"  | xargs -n1 echo | sort -u`

# TODO: fix space removing
WARULES="s/^ //g 
	s/ \$//g 
	s/ |/|/g 
	s/| /|/g"


# FIXME: replace only in req lines
# Package names
LIST="$PKGREPLBASE/pkgrepl.$VENDOR.$DISTRVERSION $PKGREPLBASE/pkgrepl.$VENDOR"
[ "$VENDOR" != "alt" ] && LIST="$LIST  $PKGREPLBASE/pkgrepl.$TARGET"
#echo LIST: $LIST
# Build replacement rules for spec
ALLREPLRULES=""
[ -n "$VERBOSE" ] && echo "Checking req names for $LISTDEP"

for i in $LISTDEP ; do
	tolocal_anyrepl $i $LIST || continue
	NRL="s!$REPLRULE1( |,|\$)!$REPLRULE2\1!g"
	[ -n "$VERBOSE" ] && echo "Use req rule $NRL"
	ALLREPLRULES="$ALLREPLRULES
		$NRL"
done

# RPM Group names
LIST="$PKGREPLBASE/../grprepl/grprepl.$VENDOR.$DISTRVERSION $PKGREPLBASE/../grprepl/greprepl.$VENDOR"
[ "$VENDOR" != "alt" ] && LIST="$LIST $PKGREPLBASE/../grprepl/grprepl.$TARGET"
# Build replacement rules for spec
[ -n "$VERBOSE" ] && echo "Checking group names for $LISTGROUP"
ALLGRPREPLRULES=""
for i in $LISTGROUP ; do
	tolocal_anyrepl $i $LIST || continue
	NRL="s!$REPLRULE1( |,|\$)!$REPLRULE2\1!g"
	[ -n "$VERBOSE" ] && echo "Use group name rule $NRL"
	ALLGRPREPLRULES="$ALLGRPREPLRULES
		$NRL"
done
#echo GRP: $LISTGROUP, ALLGRPREPLRULES: $ALLGRPREPLRULES

# Replace all packages names in source spec and add %defattr to files sections
# FIXME:    

function awk_e1()
{
	[ -n "$ADDDEF" ] &&	awk 'BEGIN{desk=0}{print;if(/^%files/){printf("%s\n", text)}}' text="$ADDDEF" || cat
}

# add clean before %files
function awk_e2()
{
	[ -n "$CLEANTEXT" ] && awk 'BEGIN{desk=0}{if(/^%files/&&desk==0){printf("%s\n\n", text);desk++};print}' text="$CLEANTEXT" || cat
}

# add rpm-build-compat buildreq
function awk_e3()
{
	[ -n "$BUILDREQ" ] && awk 'BEGIN{desk=0}{if(/^%description/&&desk==0){printf("%s\n\n", text);desk++};print}' text="$BUILDREQ" || cat
}

# add reconf for M23 after %build
function awk_e4()
{
	[ -n "$RECONFT" ] && awk 'BEGIN{desk=0}{print;if(/^%build/&&desk==0){printf("%s\n", text);desk++}}' text="$RECONFT" || cat
}

# fix mktemp param for MCBC after %build
function awk_e5()
{
	[ -n "$FIXMKTEMP" ] && awk 'BEGIN{desk=0}{print;if(/^%build/&&desk==0){printf("%s\n", text);desk++}}' text="$FIXMKTEMP" || cat
}

#echo ALL: "$ALLREPLRULES"
#echo GRP: "$ALLGRPREPLRULES"

mv $SPECNAME $SPECNAME.old &&
	cat $SPECNAME.old | \
		sed -r -e "$ALLREPLRULES" | sed -r -e "$ALLGRPREPLRULES" | \
			awk_e1 | awk_e2 | awk_e3 | awk_e4 | awk_e5 | \
		sed -e "s|^BuildRequires: *\$||g" | \
		sed -e "s|^BuildPreReq: *\$||g" | \
		sed -e "s|^Requires: *\$||g" | \
		sed -e "s|^Conflicts: *\$||g" | \
		sed -e "s|^Provides: *\$||g" | \
		sed -e "s|^Obsoletes: *\$||g" | \
		cat > $SPECNAME
#TODO:
#%if %{undefined buildroot}
#BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot
#%endif
rm -f $SPECNAME.old
if [ "$VENDOR" = "alt" ] ; then
	subst "1i# This spec is backported to `distr_vendor -d` $DISTRVERSION automatically by rpmbh script. Do not edit it." $SPECNAME
else
	subst "1i# This spec is autoported from ALT Linux Sisyphus to `distr_vendor -d` $DISTRVERSION automatically by rpmbh script. Do not edit it." $SPECNAME
fi

ENTRY="- backport to `distr_vendor -d` $DISTRVERSION (by rpmbph script)"
test -n "$TOCHANGELOG" && ENTRY=`echo -e "$ENTRY\n- $TOCHANGELOG"`
add_changelog $SPECNAME -e "$ENTRY"

# FIXME
if [ "$VENDOR" = "alt" ] ; then
	DISTRARG="-$MDISTR"
else
	DISTRARG=""
fi

$BUILDCOMMAND $LISTRPMARGS $REMOTEBUILD $DISTRARG $SPECNAME || fatal "Can't build"

}


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

Usage="Usage: $name [-r -u -U -n -i -m -v] spec..."
function mygetopts()
{
name=${0##*/}
Descr="$name - backports spec and rebuild it"

phelp()
{
	echog "$Descr"
	echog "$Usage"
	echog "Options:"
	echog " -r - remote build"
#	echog " -m - send result via e-mail"
	echog " -u/-U - sign and upload after build"
	echog " -n - do not build in hasher"
	echog " -i - install built packages in test hasher"
	echog " -v - more verbose"
}


while getopts :hniv opt; do
    case $opt in
    h) phelp; exit 0;;
    n) BUILDCOMMAND="rpmbs";;
    v) VERBOSE=1;;
    +?) echog "$name: options should not be preceded by a '+'." 1>&2; exit 2;;
#    ?)  echog "$name: $OPTARG: bad option.  Use -h for help." 1>&2 ; exit 2;;
	?) OPTIND=$((OPTIND-1)); break;
    esac
done

# remove args that were options
if [ $# -gt 0 ]; then 
	shift $((OPTIND - 1))
fi

# pass other options to RPM:
LISTRPMARGS=$@
}

parse_cmd_pre "$@"
mygetopts $LISTARGS

test -z "$LISTNAMES" && fatal "Error: no such file"

if [ "$VENDOR" = "alt" ] ; then
	MDISTR=$MENV
	test -z "$MDISTR" && fatal "missed backport version (f.i. run with -M24 param for Master 2.4)"
	DISTRVERSION=`echo $MDISTR | sed -e "s|M24|2\.4|g" | sed -e "s|M23|2\.3|g" | sed -e "s|M30|3\.0|g" | sed -e "s|M40|4\.0|g"	| sed -e "s|SS|Sisyphus|g"`
else
	MDISTR=LOCAL
fi

unset MENV MENVARG

mkdir -p $RPMDIR/SPECS/$MDISTR

for i in $LISTNAMES ; do
	DEST=`basename $i`
	cp $i $RPMDIR/SPECS/$MDISTR/$DEST || fatal "Can't copy spec"
	cd $RPMDIR/SPECS/$MDISTR || fatal "Error"
	alt_tolocal $DEST
	cd -
done

