#!/bin/sh
# 2012 (c) Etersoft www.etersoft.ru
# Author: Vitaly Lipatov <lav@etersoft.ru>
# Public domain
#

VERBOSE=
# load common functions, compatible with local and installed script
. `dirname $0`/../share/eterbuild/functions/common

load_mod spec rpm


if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
	echo "rpmreqs [package(s) file(s)] - print out package requires"
	exit 0
fi

# moved from aptU
get_rpm_package_requires()
{
	(rpmquery --requires "$@" || return ) | cut -f1 -d" " | sed -e "s|\(^lib.*\)(.*[0-9])|\1|g" | grep -v "^rpmlib" | sort -u
}

filter_pkgname()
{
	sed -e "s/^i586-//g
		s/.*(64bit)$//g
		s/\.32bit$//g"
}

filter_multiple_provides()
{
	estrlist list - |
	sed -e "s|/usr/bin/lpstat|cups|g
		s|libldap_r-2.4.so.*|libldap|g
		s|liblber-2.4.so.*|libldap|g
		s|libudev.so.*|libudev1|g
		s|/usr/bin/wineboot||g
		s|/usr/bin/winepath||g
		s|/usr/bin/winetricks||g
		s|/usr/bin/wineserver||g
		s|/usr/bin/wine||g
		s|/usr/bin/jconsole|java-1.7.0-openjdk-devel|g
		s|/sbin/modprobe||g
		s|gcc-c++|gcc9-c++|g
		s|libltdl-devel|libltdl7-devel|g
		s|liblua5-devel|liblua5.3-devel|g
		s|clang-devel|clang10.0-devel|g
		s|libXcomp.so.3.*|nx-libs|g
		s|python3(samba.*||g
		s|libwine.so.1.*||g"
}

convert_pkgfile_to_pkgname()
{
	for ni in $@ ; do
		# drop internal reqs (already converted via apt)
		#echo $ni | grep -q "/" && continue
		#echo $ni | grep -q "\.so" && continue
		#echo $ni | grep -q "(OPENSSL_1)" && continue
		# extra words when run on x86_64
		ni=$(querypackage $ni NAME)
		echo $ni | filter_pkgname
	done | sort -u
}


# Translate requires from local rpm package to package names (on local ALT Linux Sisyphus)
# FIXME: do not support x86_64 issues, use only with 32 bit packages
# Use test from tests/test_cget_depends.sh
trans_rpmdeps_to_pkgname_ldv()
{
	# partially copied from aptU
	local ALREADYHANDLEDRPM="rpmlib.* rtld libgcc_s\..* libstdc\+\+.* libc\.so.* ld-linux\.so.* libpthread\.so.* librt\.so.*"

	local REQLIST="$@"
	REQLIST=$(estrlist reg_exclude "$ALREADYHANDLEDRPM" "$REQLIST")

	REALPKGNAMELIST=$(estrlist reg_exclude ". /*" "$REQLIST")
	REQCONVLIST=$(estrlist exclude "$REALPKGNAMELIST" "$REQLIST")

	set_hasherdir
	HASHERDIR=$HASHERDIR-pkgreqs
	mkdir -p $HASHERDIR
	PKGFILES=$(mkaptbox -f $HASHERDIR && $HASHERDIR/aptbox/apt-get install -qqqy -oRPM::PM=external -oDir::Bin::rpm=hsh-rpmi-print-files $REQCONVLIST)
	# partially copied from aptU
	#VIRTREQ=$(LANG=C apt-get install --print-uris $REQLIST 2>&1 | grep "is a virtual package provided by" | cut -f2 -d" " | sort -u)
	# FIXME: f.i., we got /usr/bin/lpstat in VIRTREQ (select cups or lprng package?). Skip now
	#REQLIST=$(regexp_exclude_list "VIRTREQ" "$REQLIST")

	#TRREALREQ=$(LANG=C apt-get install --print-uris $REQLIST 2>&1 | grep "^Selecting" | cut -f2 -d" " | sort -u)

	# remove basesystem packages
	ALREADYHANDLEDRPM="
bash sh filesystem alt-gpgkeys glibc-core glibc-locales glibc-preinstall
tcb-utils nss_tcb libtcb chkconfig service setup
shadow-utils shadow-convert module-init-tools kmod util-linux-control pam
alternatives
automake-common
glib2-locales
rpm-macros-alternatives
emacs-base
pam0-config
pam0_mktemp
pam0_passwdqc
pam0_tcb
pam0_userpass
pam-config
pam-config-control
sysvinit-utils
libpam0
control
libbeecrypt7
libX11-locales
glib2-locales
libtic
libpasswdqc
librpm
libshell
ca-certificates
common-licenses
librpmbuild
passwdqc-control"
	REQLIST=$(estrlist union $(convert_pkgfile_to_pkgname $PKGFILES) $REALPKGNAMELIST)
	REQLIST=$(estrlist reg_exclude "$ALREADYHANDLEDRPM" "$REQLIST" )
	estrlist union $REQLIST
}

# Translate requires from local rpm package to package names (on local ALT Linux Sisyphus)
# FIXME: do not support x86_64 issues, use only with 32 bit packages
# Use test from tests/test_cget_depends.sh
# TODO: use hasher (see func before)
# TODO: do not run apt-get install directly
trans_rpmdeps_to_pkgname_lav()
{
	# partially copied from aptU
	local ALREADYHANDLEDRPM="rpmlib.* rtld libgcc_s\..* libstdc\+\+.* libc\.so.* libm\.so.*  ld-linux\.so.* ld-linux-x86-64\.so.* libpthread\.so.* librt\.so.* libdl\.so.*"

	local REQLIST="$@"
	REQLIST=$(estrlist reg_exclude "$ALREADYHANDLEDRPM" "$REQLIST")

	# FIXME: strange regexp for drop libNAME.so.NUM and perl(Package) and /bin/sh
	REALPKGNAMELIST=$(estrlist reg_exclude ".*\.so\..* .*/.* .*(.*" "$REQLIST")
	# FIXME: external list? Set priorities/
	REQCONVLIST="$(estrlist exclude "$REALPKGNAMELIST" "$REQLIST" | filter_multiple_provides | sed -e "s|\([^)]\)(64bit)|\1.*(64bit)|g")"

	# partially copied from aptU
	#VIRTREQ=$(LANG=C apt-get install --print-uris $REQLIST 2>&1 | grep "is a virtual package provided by" | cut -f2 -d" " | sort -u)
	#FIXME: f.i., we got /usr/bin/lpstat in VIRTREQ (select cups or lprng package?). Skip now
	#REQLIST=$(estrlist reg_exclude "VIRTREQ" "$REQLIST")
	# TODO: we have store_output function
	TFILE=$(make_temp_file)
	PKGFILES=
	if [ -n "$REQCONVLIST" ] ; then
	PKGFILES=$(LANG=C apt-get install --print-uris $REQCONVLIST 2>$TFILE | grep -E "(^Selecting|.* is already the newest version.)" | sed -e "s|^Selecting ||g" | sed -e "s| is already the newest version.||g" | sed -e "s| .*||g" | sort -u | filter_pkgname) || warning "Error return code from apt-get install"
	if grep -q "is a virtual package provided by" $TFILE ; then
		local INSTALLMARK="\[Installed\]"
		if ! grep -q "$INSTALLMARK" $TFILE ; then
			fatal "multiple provides: $(cat $TFILE)"
		fi
		PKGINSTALLED="$(grep "$INSTALLMARK" $TFILE | estrlist filter_strip_spaces | sed -e "s| .*||g")"
		if [ -z "$PKGINSTALLED" ] ; then
			fatal "can't resolve multiple provides: $(cat $TFILE)"
		fi
		PKGFILES="$PKGFILES $PKGINSTALLED"
	fi
	fi

	if grep -q "Couldn't find package" $TFILE ; then
		fatal "$(cat $TFILE | grep "Couldn't find package")"
	fi
	#grep -q "^E:" $TFILE && fatal "Can't get correct result from apt: $(cat $TFILE)"
	rm -f $TFILE

	# remove ALT basesystem packages
	ALREADYHANDLEDRPM="
bash sh filesystem alt-gpgkeys glibc-core glibc-locales glibc-preinstall
rpm apt apt-repo apt-scripts update-kernel
tcb-utils nss_tcb libtcb chkconfig service setup
shadow-utils shadow-convert module-init-tools kmod util-linux-control pam
alternatives
automake-common
glib2-locales
altlinux-release
rpm-macros-alternatives
emacs-base
pam0-config
pam0_mktemp
pam0_passwdqc
pam0_tcb
pam0_userpass
pam-config
pam-config-control
sysvinit-utils
libpam0
control
libbeecrypt7
libX11-locales
gcc-c++
liblua5-devel
libltdl-devel
glib2-locales
libtic
libpasswdqc
librpm
libshell
ca-certificates
common-licenses
librpmbuild
passwdqc-control"
	REQLIST=$(estrlist union $PKGFILES $REALPKGNAMELIST)
	REQLIST=$(estrlist reg_exclude "$ALREADYHANDLEDRPM" "$REQLIST" )
	estrlist union $REQLIST | estrlist list -
}

if [ "$1" = "-p" ] ; then
    [ -s "$2" ] || fatal "Missed file $2"
fi
REQLIST=$(get_rpm_package_requires "$@") || fatal "can't get primary requires"
trans_rpmdeps_to_pkgname_lav $REQLIST