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

get_var()
{
	grep -i "^$1:" | head -n 1 | sed -e "s/^[^:]*[ \t]*:[ \t]*//"

}

#         
eval_spec()
{
	# Hack: just print spec if -bE failed
	# TODO: use rpm -showrc instead -bE for get main variables?
	#if is_alt ; then
	#	$RPMBUILD -bE --target $DEFAULTARCH $RPMBUILDARG $@ || fatal "Check spec's fields"
	#else
		$RPMBUILD -bE --target $DEFAULTARCH $RPMBUILDARG $@ 2>/dev/null || cat $1
	#fi
}

get_release()
{
	eval_spec $1 | get_var "Release"
}

# get 11 from alt11, 12.1 from alt12.1t
get_numrelease()
{
	get_release "$1" | sed -e "s|\([a-zA-Z]*\)\([0-9\.]\)[^0-9\.]*|\2|" || echo "0"
}

# get alt from alt11
get_txtrelease()
{
	get_release "$1" | sed -e "s|\([a-zA-Z]*\)\([0-9\.]\).*|\1|" || echo "alt"
}

# Obsoleted: get current release number
get_release_number()
{
	warning "Obsoleted get_release_number, use get_numrelease instead"
	get_numrelease "$1"
}


set_var()
{
	subst "s|\($2:\).*\$|\1 $3|" $1
}

set_release()
{
	local RELEASE=$2
	if [ -z "$RELEASE" ] ; then
		RELEASE=alt1
	fi
	set_var $1 Release $RELEASE
}

# inc 2 release to 3
inc_release()
{
	local BASERELEASE=$(get_numrelease "$1")
	set_release "$1" $(get_txtrelease "$1")$(($BASERELEASE + 1 ))
}

# inc 2.x to 2.(x+1) or 2 to 2.1
inc_subrelease()
{
	local BASERELEASE=$(get_numrelease $1)
	local MAJOR=`echo "$BASERELEASE" | sed -e "s|\..*||"`
	local MINOR=`echo "$BASERELEASE" | sed -e "s|.*\.||"`
	[ "$MINOR" = "$BASERELEASE" ] && MINOR="0"
	set_release "$1" "$(get_txtrelease $1)${MAJOR}.$(($MINOR + 1 ))"
}

get_version()
{
	eval_spec $1 | get_var "Version"
}


# Set version for spec (args: spec version), f.i. test.spec 1.2.3)
# Supports %major and %ver_major macros in spec
#      2.6.1 (), 2.6 (major)  .1 (minor)
set_version()
{
	local SPEC=$1
	local VER=$2

	if [ -z "$SPEC" ] ; then
		return 1
	fi

	if [ -z "$VER" ] ; then
		return 2
	fi

	VERMAJOR=`echo $VER | sed -e "s|\([0-9]*\.[0-9]*\)\..*|\1|"`
	VERMINOR=`echo $VER | sed -e "s|^[0-9]*\.[0-9]*||;s|^\.||"`
	if [ -z ${VER/.*/} ] ; then
		VERMAJOR=
	fi

	MAJORMACROS=`grep "\%define[[:space:]]\(\|ver_\)major" $SPEC | sed -e "s|.*[[:space:]]\(.*major\).*|\1|"`
	if [ -n "${MAJORMACROS}" ] ; then
		# Change major define
		test -n "$VERMAJOR" && subst "s|\(\%define[[:space:]]$MAJORMACROS[[:space:]]\).*|\1$VERMAJOR|" $SPEC
		# Change version if VERMINOR is defined
		if [ -n "$VERMINOR" ] ; then
			set_var $SPEC Version %$MAJORMACROS.$VERMINOR || fatal "Error 1 with set version to spec"
		else
			set_var $SPEC Version %$MAJORMACROS || fatal "Error 2 with set version to spec"
		fi
	else
		set_var $SPEC Version $VER || fatal "Error 3 with set version to spec"
	fi
}

# decrement release with workaround about non textual release
decrement_release()
{
	local NUMPART=$(echo $1 | sed -e "s|[^0-9].*||g")
	[ -n "$NUMPART" ] || NUMPART=1
	echo $(($NUMPART - 1))
}

subst_namever()
{
	sed -e "s|%{name}|$BASENAME|g
			s|%{version}|$VERSION|g
			s|%name|$BASENAME/|g
			s|%version|$VERSION/|g"
}


add_changelog_helper()
{
	# don't work sometime?
	# TODO: fix with $@, single arg?
	local DESC SPEC
	if ! tty -s && [ -z "$DESC" ] ; then 
		echo "skip changelog fixing without tty"
		return 1
	fi
	add_changelog -e "$@"
	R=$?
	[ -z "$EDITOR" ] && { echo "skip changelog editing without EDITOR var"; return 1 ; }
	# If changelog sucessfully added
	if [ "$R" = "0" ]; then
		shift
		for SPEC in "$@" ; do
			N=`grep -n '^%changelog' $SPEC | head -n 1 | sed s!:.*!!g`
			# +1 -- comment with date and packager name
			# +2 -- place for edit comments
			# +N works for mcedit and vi
			${EDITOR} +$(($N + 2)) $SPEC
		done
	fi
	return $R
}

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