# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/vim-doc.eclass,v 1.15 2007/05/14 20:04:07 pioto Exp $
#
# This eclass is used by vim.eclass and vim-plugin.eclass to update
# the documentation tags.  This is necessary since vim doesn't look in
# /usr/share/vim/vimfiles/doc for documentation; it only uses the
# versioned directory, for example /usr/share/vim/vim62/doc
#
# We depend on vim being installed, which is satisfied by either the
# DEPEND in vim-plugin or by whatever version of vim is being
# installed by the eclass.


update_vim_helptags() {
	local vimfiles vim d s

	# This is where vim plugins are installed
	vimfiles="${ROOT}"/usr/share/vim/vimfiles

	if [[ $PN != vim-core ]]; then
		# Find a suitable vim binary for updating tags :helptags
		vim=$(type -P vim 2>/dev/null)
		[[ -z "$vim" ]] && vim=$(type -P gvim 2>/dev/null)
		[[ -z "$vim" ]] && vim=$(type -P kvim 2>/dev/null)
		if [[ -z "$vim" ]]; then
			ewarn "No suitable vim binary to rebuild documentation tags"
		fi
	fi

	# Make vim not try to connect to X. See :help gui-x11-start
	# in vim for how this evil trickery works.
	if [[ -n "${vim}" ]] ; then
		ln -s "${vim}" "${T}/tagvim"
		vim="${T}/tagvim"
	fi

	# Install the documentation symlinks into the versioned vim
	# directory and run :helptags
	for d in "${ROOT}"/usr/share/vim/vim[0-9]*; do
		[[ -d "$d/doc" ]] || continue	# catch a failed glob

		# Remove links, and possibly remove stale dirs
		find $d/doc -name \*.txt -type l | while read s; do
			[[ $(readlink "$s") = $vimfiles/* ]] && rm -f "$s"
		done
		if [[ -f "$d/doc/tags" && $(find "$d" | wc -l | tr -d ' ') = 3 ]]; then
			# /usr/share/vim/vim61
			# /usr/share/vim/vim61/doc
			# /usr/share/vim/vim61/doc/tags
			einfo "Removing $d"
			rm -r "$d"
			continue
		fi

		# Re-create / install new links
		if [[ -d $vimfiles/doc ]]; then
			ln -s $vimfiles/doc/*.txt $d/doc 2>/dev/null
		fi

		# Update tags; need a vim binary for this
		if [[ -n "$vim" ]]; then
			einfo "Updating documentation tags in $d"
			DISPLAY= $vim -u NONE -U NONE -T xterm -X -n -f \
				'+set nobackup nomore' \
				"+helptags $d/doc" \
				'+qa!' </dev/null &>/dev/null
		fi
	done

	[[ -n "${vim}" && -f "${vim}" ]] && rm "${vim}"
}
