#!/bin/bash
# 2008 Etersoft www.etersoft.ru
# Author: Vitaly Lipatov <lav@etersoft.ru>
# Public domain

# FIXME: use build directly in build scripts
load_mod build

# get correct BUILDROOT, run build_rpms_name before!
build_buildroot()
{
	test -z "$BASENAME" && fatal "Use build_buildroot with BASENAME defined"
	# ALT Only?
	BUILDROOT=`rpm --eval %buildroot | subst_namever`
	test -z "$BUILDROOT" && fatal "Fix rpm's buildroot"
	if [ "$BUILDROOT" = "%buildroot" ] ; then
		BUILDROOT="$HOME/tmp/$BASENAME-buildroot"
		warning "Can't get buildroot from RPM, set to $BUILDROOT"
		return 1
	fi
	return 0
}

# Вынимаем информацию о пакете из спека.
# Внутренние макроопределения раскрываются!
# Пробельные символы после Name: могут быть различными
# TODO: в другом месте не NAMESPEC, а не SPECNAME

build_rpms_name()
{
	local tmprpm CATSPEC NAMESPEC PKGARCH
	#TODO change : to = and execute?
	NAMESPEC=$1
	shift
	test -f "$NAMESPEC" || fatal "Spec $NAMESPEC does not exist"

	tmprpm=`make_temp_file $NAME`
	# Optimization
	eval_spec $NAMESPEC $@ | grep ":"  >$tmprpm
	BASENAME=$(cat $tmprpm | get_var "Name")
	RELEASE=$(cat $tmprpm | get_var "Release")
	VERSION=$(cat $tmprpm | get_var "Version")
	TARBALLNAME=$(cat $tmprpm | get_var "Source.*")
	[ -n "$TARBALLNAME" ] && TARBALLNAME=$(basename $TARBALLNAME)

	PKGARCH=$(cat $tmprpm | get_var "BuildArch")
	if [ "$PKGARCH" != "noarch" ] ; then
		PKGARCH=$BUILDARCH
	fi
	NAMERPMIN=$BASENAME-$VERSION-$RELEASE.$PKGARCH.rpm
	NAMESRPMIN=$BASENAME-$VERSION-$RELEASE.src.rpm

	RPMSOURCEDIR=`rpm --eval %_sourcedir | subst_namever`
	[ -n "$RPMSOURCEDIR" ] || fatal "Can't detect RPM/SOURCES dir"

	# Lav 18.10.11 FIXME: need we this warning?
	#local BNS NSS
	#BNS="$BASENAME".spec
	#NSS=`basename $NAMESPEC`
	#test "$NSS" != "$BNS" && warning "Spec name ($NSS) is not equal to Name of package ($BNS)"
	rm -f $tmprpm

	build_buildroot
}

# Query variables from rpm package
querypackage()
{
	local FORMAT="%{$2}"
	local INSTALLED="-p"
	# if name empty, use third param as format string
	[ -n "$2" ] || FORMAT="$3"
	# if not file, drop -p for get from rpm base
	[ -e "$1" ] || INSTALLED=""
        rpmquery $INSTALLED --queryformat "$FORMAT" $1
}

build_rpms_name_by_srpm()
{
	local SRPM=$1
	BASENAME=$(querypackage $SRPM NAME)
	RELEASE=$(querypackage $SRPM RELEASE)
	VERSION=$(querypackage $SRPM VERSION)
	PKGARCH=$(querypackage $SRPM ARCH)
	# suggest target arch
	if [ "$PKGARCH" != "noarch" ] ; then
		PKGARCH=$BUILDARCH
	fi
	NAMERPMIN=$BASENAME-$VERSION-$RELEASE.$PKGARCH.rpm
	NAMESRPMIN=$BASENAME-$VERSION-$RELEASE.src.rpm
	if [ "$(basename "$SRPM")" != $NAMESRPMIN ] ; then
		warning "Generated srpm name $NAMESRPMIN is not equal to real file name $SRPM"
	fi
}

# FIXME: hack
spec_by_srpm()
{
	local PKG=$1
	#local PKGNAME
	#PKGNAME=$(querypackage $PKG NAME)
	#[ -n "$PKGNAME" ] && SPECNAME= $PKGNAME.spec
	# if spec have a different name, use pkg file list
	#[ -r "$PKGNAME.spec" ]
	# CHECKME: it is possible to have two or more specs in one package?
	rpm -qlp $PKG | grep "\.spec\$"
}


# FIXME: this is hack and needs to be removed from code!
# pkg-source-1.0.src.rpm -> pkg-source
# pkg-source_1.0.src.rpm -> pkg-source
# pkg-source[-_]1.0.src.rpm -> pkg-source
# pkg-source*.src.rpm -> pkg-source
# incorrect for
# pkg-source-1.0-2.0*.src.rpm -> pkg-source-1.0
# pkg-source-1.0_2.0*.src.rpm -> pkg-source-1.0
get_pkgname_from_filename()
{
	local FN=$(basename $1)
	#local SR=$(echo ${FN/[\\*]*/})
	local SR=$(echo $FN | sed -e "s|[\[\*].*||g")
	if [ "$SR" != "$FN" ] ; then
		echo $SR
		return
	fi

	# for RPM file
	#if echo $FN | grep -q "rpm$" && [ -e "$FN" ] ; then
	#	querypackage $FN NAME
	#	return
	#fi

	# for DEB
	if rhas "$FN" "deb$" ; then
		echo ${FN/_[0-9]*/}
		return
	fi

	# libpq5.2-9.0eter-9.0.4-alt14.i586.rpm
	local SR=$(echo $FN | sed -e "s|\(.*\)-[0-9][0-9a-zA-Z\.]*-[a-z]*[0-9][0-9\.a-zA-Z]*\.[a-z0-9_]*.*$|\1|g")
	if [ "$SR" != "$FN" ] ; then
		echo $SR
		return
	fi

	# libgnustep-opal-r37181-alt3.svn20131001
	local SR=$(echo $FN | sed -e "s|\(.*\)-[a-zA-Z][0-9][0-9][0-9a-zA-Z\.]*-[a-z]*[0-9][0-9\.a-zA-Z]*\.[a-z0-9_]*.*$|\1|g")
	if [ "$SR" != "$FN" ] ; then
		echo $SR
		return
	fi

	echo ${FN/[-_][0-9]*/}
}

# TODO: epm print srcname from filename
# return source package name by binary rpm package file
get_sourcepkg_name()
{
	local FILE="$1"
	local PKGVERSION=$(querypackage "$FILE" VERSION)
	querypackage "$FILE" sourcerpm | sed -e "s|-$PKGVERSION.*||g"
}


