#!/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=$DEFAULTARCH
	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"

	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=$DEFAULTARCH
	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
}

spec_by_srpm()
{
	local PKG=$1
	local PKGNAME
	PKGNAME=$(querypackage $PKG NAME)
	[ -n "$PKGNAME" ] && echo $PKGNAME.spec
}

# pkg-source-1.0.src.rpm -> pkg-source
get_pkgname_from_filename()
{
	echo ${1/-[0-9]*/}
}

# 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"
}


# build binary package list (1st - repo dir, 2st - pkgname)
# algorithm: list all files in PKGDIR, print packages with our source pkg name
get_binpkg_list()
{
	local PKGDIR=$1
	local PKGNAME=$(basename $2)
	find "$PKGDIR" ! -name '*\.src\.rpm' -name '*\.rpm' -execdir \
		rpmquery -p --qf='%{sourcerpm}\t%{name}-%{version}-%{release}.%{arch}.rpm\n' "{}" \; \
		| grep "^$PKGNAME[[:space:]].*" | cut -f2 | xargs -n1 -I "{}" echo "$PKGDIR/{} "
}

drop_pkg_extensions()
{
	for i in $@ ; do
		echo -n "$(basename $i) " | sed -e "s|\.[a-z_0-9]*\.rpm||g"
	done | filter_strip_spaces
}

# TODO: add get_update_repo_command
# TODO: migrate to file using (as repos)
# args: distr_vendor [interactive]
get_install_package_command()
{
	local DISTRVENDOR=$1
	local INAC=$2
	local CMD
	local RET=0
	case $DISTRVENDOR in
		"ALTLinux"|"Ubuntu"|"Debian"|"PCLinux")
			[ -n "$INAC" ] && CMD="apt-get install" || CMD="apt-get -y --force-yes install"
			;;
		"LinuxXP"|"Fedora"|"ASPLinux"|"CentOS"|"RHEL"|"Scientific")
			[ -n "$INAC" ] && CMD="yum install" || CMD="yum -y install"
			;;
		"Mandriva")
			[ -n "$INAC" ] && CMD="urpmi --no-verify-rpm" || CMD="urpmi --auto --no-verify-rpm"
			;;
		"SUSE")
			[ -n "$INAC" ] && CMD="zypper --non-interactive install" || CMD="yes | zypper --non-interactive install"
			;;
		*)
			RET=1
			CMD="echo \"Do not known install command for DISTRVENDOR $DISTRVENDOR\""
			;;
	esac
	echo $CMD
	return $RET
}
