# -*-eselect-*-  vim: ft=eselect
# Copyright (c) 2005-2009 Gentoo Foundation
# $Id: package-manager.bash.in 673 2009-09-20 20:16:45Z ulm $
# This file is part of the 'eselect' tools framework.
#
# eselect is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 2 of the License, or (at your option) any later
# version.
#
# eselect is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# eselect.  If not, see <http://www.gnu.org/licenses/>.

# package_manager PRIVATE
# Return the package manager we're going to use.
package_manager() {
	local pm
	case ${PACKAGE_MANAGER:-portage} in
		portage)
			pm=portage ;;
		paludis)
			set -- ${PALUDIS_COMMAND:-paludis}
			type "$1" &>/dev/null && pm=paludis ;;
	esac
	echo "${pm:-portage}"
}

# portageq
# Run portageq with safe filename as set by configure. Redirect stderr
portageq() {
	/usr/lib/portage/bin/ebuild-helpers/portageq "$@" 2>/dev/null
}

# run_paludis PRIVATE
# Run PALUDIS_COMMAND (defaults to "paludis"). Redirect stderr
run_paludis() {
	${PALUDIS_COMMAND:-paludis} "$@" 2>/dev/null
}

# arch
# Return the architecture we're running on...
arch() {
	local ret=$(envvar sys-devel/gcc ARCH) suffix

	# $arch will be null if there's no current make.profile symlink
	# we cannot get a list of valid profiles without it.
	if [[ -z ${ret} ]] ; then

		if [[ -n ${ROOT} && ${ROOT} != "/" ]] ; then
			write_warning_msg "Failed to determine \${ARCH}. Is your make.profile symlink valid?"
			return 1
		fi

		ret=$(uname -m)
		case ${ret} in
			alpha|ia64|m68k|ppc|ppc64) ;;
			arm*) ret=arm ;;
			i?86) ret=x86 ;;
			mips*) ret=mips ;;
			parisc*) ret=hppa ;;
			"Power Macintosh") ret=ppc ;;
			s390*) ret=s390 ;;
			sh*) ret=sh ;;
			sparc*) ret=sparc ;;
			x86_64) ret=amd64 ;;
			*) write_warning_msg \
				"Unknown architecture. Please submit a bug including the output of 'uname -m'"
				return 1
				;;
		esac

		case $(uname -s) in
			Linux) ;;
			FreeBSD) suffix="-fbsd" ;;
			NetBSD) suffix="-nbsd" ;;
			OpenBSD) suffix="-obsd" ;;
			DragonFly) suffix="-dfly" ;;
			Darwin) suffix="-macos" ;;
			*) write_warning_msg \
				"Unknown OS. Please submit a bug including the output of 'uname -s'"
				return 1
				;;
		esac
	fi

	echo ${ret}${suffix}
}

# envvar
# Return the contents of environment variable $2 as seen by package manager
# for package $1.
envvar() {
	[[ $# -eq 2 ]] || die "envvar expects exactly 2 arguments"
	local manager=$(package_manager)
	case ${manager} in
		# portage does not support per-package envvar lookup
		portage) portageq envvar "$2" ;;
		paludis) run_paludis --environment-variable "$1" "$2" ;;
		*) die "Unknown package manager: \"${manager}\"" ;;
	esac
}

# best_version
# Return true if package $1 is available in ${ROOT}
best_version() {
	[[ $# -eq 1 ]] || die "best_version expects exactly one argument"
	local manager=$(package_manager)
	case ${manager} in
		portage) portageq best_version "${ROOT:-/}" "$1" ;;
		paludis) run_paludis --best-version "$1" ;;
		*) die "Unknown package manager: \"${manager}\"" ;;
	esac
}

# has_version
# Return true if package $1 is available in ${ROOT}
has_version() {
	[[ $# -eq 1 ]] || die "has_version expects exactly one argument"
	local manager=$(package_manager)
	case ${manager} in
		portage) portageq has_version "${ROOT:-/}" "$1" ;;
		paludis) run_paludis --has-version "$1" ;;
		*) die "Unknown package manager: \"${manager}\"" ;;
	esac
}

# get_repositories
# return list of repositories known to the package manager
get_repositories() {
	local manager=$(package_manager)
	case ${manager} in
		portage) portageq get_repos "${ROOT:-/}" ;;
		paludis) run_paludis --list-repositories | cut -d' ' -f 2 ;;
		*) die "Unknown package manager: \"${manager}\"" ;;
	esac
}

# get_repo_news_dir
# return the directory where to find GLEP 42 news items for repository $1
get_repo_news_dir() {
	[[ $# -eq 1 ]] || die "get_repo_news_dir expects exactly one argument"
	local repo=$1
	local manager=$(package_manager)
	case ${manager} in
		portage)
			echo "$(portageq get_repo_path \
				"${ROOT:-/}" "${repo}")/metadata/news" ;;
		paludis) run_paludis --configuration-variable ${repo} newsdir ;;
		*) die "Unknown package manager: \"${manager}\"" ;;
	esac
}
