# -*-eselect-*-  vim: ft=eselect
# Copyright 2005-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2 or later

inherit config multilib

DESCRIPTION="Manage the LuaJIT symlink"
MAINTAINER="mva@gentoo.org"
VERSION="1"

# sort function for luajit versions, to be used in a pipe
sort_luajit_versions() {
	local vsort="sort --version-sort"
	${vsort} </dev/null &>/dev/null || vsort=sort
	sed -e 's/^\(luajit-\)\?\([[:digit:].]\+\)[-_]beta/\2 0 &/' \
		-e 't;s/^\(luajit-\)\?\([[:digit:].]\+\)/\2 1 &/' \
		| LC_ALL=C ${vsort} | sed 's/.* //'
}

# find a list of luajit symlink targets
find_targets() {
	local f
	for f in $(find "${EROOT}"/usr/bin/ -type f -iname 'luajit-[[:digit:]]*'); do
		basename "${f}"
	done | sort_luajit_versions
}

get_libdirs() {
	local dir libdirs
	for dir in $(list_libdirs); do
		[[ -L ${EROOT}/usr/${dir} ]] && continue
		ls "${EROOT}"/usr/${dir}/libluajit*.* > /dev/null 2>&1 || continue

		libdirs+=' '/usr/${dir}
	done
	echo ${libdirs:-/usr/lib}
}


# remove the luajit symlink
remove_symlinks() {
	for dir in $(get_libdirs) ; do
		[[ -L "${dir}/libluajit-5.1.so" ]] && rm "${dir}/libluajit-5.1.so"
		[[ -L "${dir}/libluajit-5.1.a" ]] && rm "${dir}/libluajit-5.1.a"
		[[ -L "${dir}/pkgconfig/luajit.pc" ]] && rm "${dir}/pkgconfig/luajit.pc"
	done
	[[ -L "${EROOT}/usr/bin/luajit" ]] && rm "${EROOT}/usr/bin/luajit"
	rm -f "${EROOT}"/usr/share/man/man1/luajit.1{,.gz,.bz2,.lzma} &>/dev/null
}

# set the luajit symlink
set_symlinks() {
	local target=$1

	if is_number "${target}"; then
		local targets=( $(find_targets) )
		target=${targets[target-1]}
	fi

	if [[ -z ${target} ]]; then
		die -q "Target \"$1\" doesn't appear to be valid!"
	elif [[ -f ${EROOT}/usr/bin/${target} ]]; then
		ln -s "${target}" "${EROOT}/usr/bin/luajit"
		for dir in $(get_libdirs) ; do
			[[ -e "${dir}/lib${target}.so" ]] && ln -s "lib${target}.so" "${dir}/libluajit-5.1.so"
			[[ -e "${dir}/lib${target}.a" ]] && ln -s "lib${target}.a" "${dir}/libluajit-5.1.a"
			[[ -e "${dir}/pkgconfig/${target}.pc" ]] && ln -s "${target}.pc" "${dir}/pkgconfig/luajit.pc"
		done
		for orig in "${EROOT}"/usr/share/man/man1/$target.1* ; do
			ln -s "$(basename ${orig})" "${orig/$target/luajit}"
		done
	else
		die -q "Target \"$1\" doesn't appear to be valid!"
	fi
}

### show action ###

describe_show() {
	echo "Show the current luajit symlink"
}

do_show() {
	write_list_start "Current luajit symlink:"
	if [[ -L ${EROOT}/usr/bin/luajit ]]; then
		local SV=$(readlink "${EROOT}/usr/bin/luajit")
		write_kv_list_entry "${SV%/}"
	else
		write_kv_list_entry "(unset)"
	fi
}

### list action ###

describe_list() {
	echo "List available luajit symlink targets"
}

do_list() {
	local i targets=( $(find_targets) )

	write_list_start "Available luajit symlink targets:"
		local SV=$(readlink "${EROOT}/usr/bin/luajit")
	for (( i = 0; i < ${#targets[@]}; i++ )); do
		[[ ${targets[i]} = \
			$(basename "${SV}") ]] \
			&& targets[i]=$(highlight_marker "${targets[i]}")
	done
	write_numbered_list -m "(none found)" "${targets[@]}"
}

### set action ###

describe_set() {
	echo "Set a new luajit symlink target"
}

describe_set_parameters() {
	echo "<target>"
}

describe_set_options() {
	echo "target : Target name or number (from 'list' action)"
}

do_set() {
	[[ -z $1 ]] && die -q "You didn't tell me what to set the symlink to"
	[[ $# -gt 1 ]] && die -q "Too many parameters"

	if [[ -L ${EROOT}/usr/bin/luajit ]]; then
		# existing symlink
		remove_symlinks || die -q "Couldn't remove existing symlink"
		set_symlinks "$1" || die -q "Couldn't set a new symlink"
	elif [[ -e ${EROOT}/usr/bin/luajit ]]; then
		# we have something strange
		die -q "${EROOT}/usr/bin/luajit exists but is not a symlink"
	else
		set_symlinks "$1" || die -q "Couldn't set a new symlink"
	fi
}
