aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Lecher <jlec@gentoo.org>2015-05-24 10:09:37 +0200
committerJustin Lecher <jlec@gentoo.org>2015-05-24 10:09:37 +0200
commit2074128c90645ffd391f98faa9296c596ae9c9e2 (patch)
tree6ed9c7b53208a24ab5ce434ecb173e149eff641e /app-admin
parentFix style (diff)
downloadsci-2074128c90645ffd391f98faa9296c596ae9c9e2.tar.gz
sci-2074128c90645ffd391f98faa9296c596ae9c9e2.tar.bz2
sci-2074128c90645ffd391f98faa9296c596ae9c9e2.zip
app-admin/eselect: Latest patch
Package-Manager: portage-2.2.20
Diffstat (limited to 'app-admin')
-rw-r--r--app-admin/eselect/ChangeLog6
-rw-r--r--app-admin/eselect/eselect-1.4.4-r101.ebuild72
-rw-r--r--app-admin/eselect/files/eselect-1.4.4-alternatives.patch1221
3 files changed, 1299 insertions, 0 deletions
diff --git a/app-admin/eselect/ChangeLog b/app-admin/eselect/ChangeLog
index cc795da90..47d1515ce 100644
--- a/app-admin/eselect/ChangeLog
+++ b/app-admin/eselect/ChangeLog
@@ -2,6 +2,12 @@
# Copyright 1999-2015 Gentoo Foundation; Distributed under the GPL v2
# $Header: /var/cvsroot/gentoo-x86/app-admin/eselect/ChangeLog,v 1.179 2011/01/22 21:38:52 ulm Exp $
+*eselect-1.4.4-r101 (24 May 2015)
+
+ 24 May 2015; Justin Lecher <jlec@gentoo.org> +eselect-1.4.4-r101.ebuild,
+ +files/eselect-1.4.4-alternatives.patch:
+ app-admin/eselect: Latest patch
+
02 Apr 2015; Justin Lecher <jlec@gentoo.org> -eselect-1.3.7-r100.ebuild,
-eselect-1.3.8-r100.ebuild, -eselect-1.4-r100.ebuild,
-eselect-1.4.1-r100.ebuild, -eselect-1.4.2-r100.ebuild,
diff --git a/app-admin/eselect/eselect-1.4.4-r101.ebuild b/app-admin/eselect/eselect-1.4.4-r101.ebuild
new file mode 100644
index 000000000..67b835c52
--- /dev/null
+++ b/app-admin/eselect/eselect-1.4.4-r101.ebuild
@@ -0,0 +1,72 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=5
+
+inherit autotools eutils bash-completion-r1
+
+DESCRIPTION="Gentoo's multi-purpose configuration and management tool"
+HOMEPAGE="http://wiki.gentoo.org/wiki/Project:Eselect"
+SRC_URI="http://dev.gentoo.org/~ulm/eselect/${P}.tar.xz"
+
+LICENSE="GPL-2+ || ( GPL-2+ CC-BY-SA-3.0 )"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~ppc-aix ~amd64-fbsd ~sparc-fbsd ~x86-fbsd ~x64-freebsd ~x86-freebsd ~hppa-hpux ~ia64-hpux ~x86-interix ~amd64-linux ~arm-linux ~ia64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~m68k-mint ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+IUSE="doc emacs vim-syntax"
+
+RDEPEND="sys-apps/sed
+ || (
+ sys-apps/coreutils
+ sys-freebsd/freebsd-bin
+ app-misc/realpath
+ )"
+DEPEND="${RDEPEND}
+ app-arch/xz-utils
+ doc? ( dev-python/docutils )"
+RDEPEND="!app-admin/eselect-news
+ ${RDEPEND}
+ sys-apps/file
+ sys-libs/ncurses"
+
+PDEPEND="emacs? ( app-emacs/eselect-mode )
+ vim-syntax? ( app-vim/eselect-syntax )"
+
+src_prepare() {
+ epatch "${FILESDIR}"/${P}-alternatives.patch
+ AT_M4DIR="." eautoreconf
+}
+
+src_compile() {
+ emake
+ use doc && emake html
+}
+
+src_install() {
+ emake DESTDIR="${D}" install
+ newbashcomp misc/${PN}.bashcomp ${PN}
+ dodoc AUTHORS ChangeLog NEWS README TODO doc/*.txt
+ use doc && dohtml *.html doc/*
+
+ # needed by news module
+ keepdir /var/lib/gentoo/news
+ if ! use prefix; then
+ fowners root:portage /var/lib/gentoo/news
+ fperms g+w /var/lib/gentoo/news
+ fi
+
+ # band aid for prefix
+ if use prefix; then
+ cd "${ED}"/usr/share/eselect/libs || die
+ sed -i "s:ALTERNATIVESDIR_ROOTLESS=\"${EPREFIX}:ALTERNATIVESDIR_ROOTLESS=\":" alternatives.bash || die
+ fi
+}
+
+pkg_postinst() {
+ # fowners in src_install doesn't work for the portage group:
+ # merging changes the group back to root
+ if ! use prefix; then
+ chgrp portage "${EROOT}/var/lib/gentoo/news" \
+ && chmod g+w "${EROOT}/var/lib/gentoo/news"
+ fi
+}
diff --git a/app-admin/eselect/files/eselect-1.4.4-alternatives.patch b/app-admin/eselect/files/eselect-1.4.4-alternatives.patch
new file mode 100644
index 000000000..71c2e67da
--- /dev/null
+++ b/app-admin/eselect/files/eselect-1.4.4-alternatives.patch
@@ -0,0 +1,1221 @@
+diff --git a/bin/eselect.in b/bin/eselect.in
+index 934a10a..7c1c14b 100755
+--- a/bin/eselect.in
++++ b/bin/eselect.in
+@@ -22,10 +22,15 @@ ESELECT_DATA_PATH="@DATADIR@/eselect"
+ # Where are modules installed by default?
+ ESELECT_DEFAULT_MODULES_PATH="${ESELECT_DATA_PATH}/modules"
+
++# Where are auto-generated modules placed? (e.g. from alternatives-2.eclass)
++ESELECT_AUTO_GENERATED_MODULES_PATH="${ESELECT_DEFAULT_MODULES_PATH}/auto"
++
+ # Look in these places for modules
+-ESELECT_MODULES_PATH=( \
+- "${HOME}/.eselect/modules" \
+- "${ESELECT_DEFAULT_MODULES_PATH}" )
++ESELECT_MODULES_PATH=(
++ "${HOME}/.eselect/modules"
++ "${ESELECT_DEFAULT_MODULES_PATH}"
++ "${ESELECT_AUTO_GENERATED_MODULES_PATH}"
++)
+
+ # Look in this place for libraries
+ ESELECT_CORE_PATH="${ESELECT_DATA_PATH}/libs"
+@@ -64,12 +69,27 @@ fi
+ # Load core functions
+ source "${ESELECT_CORE_PATH}/core.bash" || exit 255
+ # Load necessary functions for the main script
+-inherit manip output path-manipulation tests
++inherit manip output path-manipulation tests config
+
+ # Sneaky trick to make die in subshells work. If you don't get
+ # it, don't ask...
+ trap 'echo "exiting" >&2; exit 250' 15
+
++# es_find_module foo
++# Find and echo the filename of the foo module. If there's no foo module,
++# die.
++es_find_module() {
++ local modname="$1" modpath="" modfile=""
++ [[ -z ${modname} ]] && die "Usage: ${FUNCNAME} <module>"
++ for modpath in "${ESELECT_MODULES_PATH[@]}" ; do
++ [[ -f ${modpath}/${modname}.eselect ]] && break
++ done
++
++ modfile="${modpath}/${modname}.eselect"
++ [[ -r ${modfile} ]] || die -q "Can't load module ${modname}"
++ echo ${modfile}
++}
++
+ # es_do_usage
+ # Display eselect usage
+ es_do_usage() {
+@@ -81,14 +101,10 @@ es_do_usage() {
+ es_do_help() {
+ es_do_usage
+ echo
+- # display all recognized global options
+- write_list_start "Global options:"
+- write_kv_list_entry "--brief" "Make output shorter"
+- write_kv_list_entry "--colour=<yes|no|auto>" \
+- "Enable or disable colour output (default 'auto')"
++ es_do_list-options
+ echo
+ # display all available eselect modules
+- do_action modules list
++ es_do_list-modules
+ }
+
+ # es_do_version
+@@ -100,6 +116,114 @@ es_do_version() {
+ echo "Distributed under the terms of the GNU GPL version 2 or later."
+ }
+
++# es_do_list-options
++# Display all recognized global options
++es_do_list-options() {
++ write_list_start "Global options:"
++ write_kv_list_entry "--brief" "Make output shorter"
++ write_kv_list_entry "--colour=<yes|no|auto>" "Enable or disable colour output (default 'auto')"
++ write_kv_list_entry "--debug" "Debug eselect (enable set -x)"
++}
++
++# es_do_list-modules
++# Display all available eselect modules DEPRECATED
++es_do_list-modules() {
++ do_action modules list $@
++}
++
++### print-* actions, for use with bash_completion and zsh-completion ###
++
++# es_do_print-modules
++#
++# Display all availble eselect modules in a way that's useful to bash
++# completion / zsh completion
++es_do_print-modules() {
++ local ret=1 path module group groupname want_descriptions
++
++ while [[ -n $@ ]]; do
++ case "${1}" in
++ --descriptions)
++ want_descriptions='yes' ;;
++ --group)
++ groupname=${2}
++ [[ -z "$groupname" ]] && die -q "Required option (group name) missing."
++ shift ;;
++ esac
++ shift
++ done
++
++ if [[ ${groupname} == Built-in || -z ${groupname} ]]; then
++ for module in help usage version print-{modules,actions,options}; do
++ echo "${module}"
++ done
++ [[ ${groupname} == Built-in ]] && return 0
++ fi
++
++ # TODO: factor this out in modules.eselect's do_list()
++ for path in "${ESELECT_MODULES_PATH[@]}" ; do
++ [[ -d "${path}" ]] || continue
++ for file in "${path}"/*.eselect ; do
++ [[ -f "${file}" ]] || continue
++ if [[ -n "${groupname}" ]]; then
++ group=$(load_config "${file}" ESELECT_MODULE_GROUP)
++ [[ "${groupname}" == "${group}" ||
++ ( "${groupname}" == Extra && -z "${group}" ) ]] || continue
++ fi
++ module="${file##*/}"
++ module="${module%%.eselect}"
++ echo "${module}${want_descriptions:+:$(load_config "${file}" DESCRIPTION)}"
++ ret=0
++ done
++ done
++ return $ret
++}
++
++# es_do_print-actions
++#
++# Display all available actions for the given module.
++es_do_print-actions() {
++ local modfile="$(es_find_module "${1}")" actions action want_descriptions
++ [[ "${2}" == "--descriptions" ]] && want_descriptions='yes'
++ (
++ source "${modfile}" 2>/dev/null \
++ || die "Couldn't source ${modfile}"
++ actions=( $(declare -F \
++ | sed -n -e 's/^declare\s\+-f\s\+do_//p' \
++ | egrep -v '^(action|help|usage|version)$' \
++ | sort ) )
++ for action in "${actions[@]}" ; do
++ echo "${action}${want_descriptions:+:$(describe_${action})}"
++ done
++ )
++}
++
++# es_do_print-options
++#
++# Display all available options for the given module and action
++es_do_print-options() {
++ local modfile action want_descriptions
++
++ [[ "${1}" == "--descriptions" ]] && want_descriptions='yes' && shift
++
++ if [[ -z ${1} ]]; then
++ echo "--debug${want_descriptions:+:Debug eselect (enable set -x)}"
++ echo "--no-color${want_descriptions:+:Disable coloured output}"
++ echo "--no-colour${want_descriptions:+:Disable coloured output}"
++ elif [[ -n ${2} ]]; then
++ modfile="$(es_find_module "${1}")"
++ action=${2}
++ shift 2
++ (
++ source "${modfile}" 2>/dev/null \
++ || die "Couldn't source ${modfile}"
++ is_function options_${action} || return 1
++ options_${action} ${want_descriptions:+--descriptions} "$@" || return 2
++ )
++ else
++ die "Usage: ${FUNCNAME} [--descriptions] [<module> <action>]"
++ fi
++}
++
+ ### main code ###
+
+ # figure out what the action is. we need to know whether we're
+@@ -141,6 +265,9 @@ while [[ ${1##--} != "$1" ]]; do
+ *) die -q "Invalid argument for ${1%%=*} option" ;;
+ esac
+ ;;
++ debug)
++ set -x
++ ;;
+ help|version)
+ [[ -z ${action} ]] || die -q "Too many parameters"
+ action=${1##--}
+diff --git a/libs/Makefile.am b/libs/Makefile.am
+index 027ef73..a5fe373 100644
+--- a/libs/Makefile.am
++++ b/libs/Makefile.am
+@@ -1,6 +1,8 @@
+ eselectlibsdir = $(datadir)/$(PACKAGE_NAME)/libs/
+
+ eselectlibs_DATA = \
++ alternatives.bash \
++ alternatives-common.bash \
+ config.bash \
+ core.bash \
+ default.eselect \
+@@ -14,6 +16,8 @@ eselectlibs_DATA = \
+ tests.bash
+
+ EXTRA_DIST = \
++ alternatives.bash.in \
++ alternatives-common.bash.in \
+ config.bash.in \
+ core.bash.in \
+ default.eselect.in \
+@@ -30,7 +34,8 @@ dosed = @SED@ \
+ -e 's%\@SED\@%@SED@%g' \
+ -e 's%\@PORTAGEQ\@%@PORTAGEQ@%g' \
+ -e 's%\@ENV_UPDATE\@%@ENV_UPDATE@%g' \
+- -e 's%\@CANONICALISE\@%@CANONICALISE@%g'
++ -e 's%\@CANONICALISE\@%@CANONICALISE@%g' \
++ -e 's%\@sysconfdir\@%@sysconfdir@%g'
+
+ %.bash : %.bash.in
+ @$(dosed) $< > $@
+diff --git a/libs/alternatives-common.bash.in b/libs/alternatives-common.bash.in
+new file mode 100644
+index 0000000..99de48e
+--- /dev/null
++++ b/libs/alternatives-common.bash.in
+@@ -0,0 +1,372 @@
++# Copyright 2015 Gentoo Foundation
++# Copyright 2008 Mike Kelly
++# Copyright 2009, 2013 David Leverton
++# Copyright 2010 Bo Ørsted Andresen
++# Distributed under the terms of the GNU General Public License v2
++
++inherit config output path-manipulation
++
++ALTERNATIVESDIR_ROOTLESS="@sysconfdir@/env.d/alternatives"
++ALTERNATIVESDIR="${EROOT%/}${ALTERNATIVESDIR_ROOTLESS}"
++
++get_current_provider() {
++ local dieprefix="Could not determine current provider for ${ALTERNATIVE}"
++ if [[ -L ${ALTERNATIVESDIR}/${ALTERNATIVE}/_current ]]; then
++ local provider=$(readlink "${ALTERNATIVESDIR}/${ALTERNATIVE}/_current" || die "${dieprefix}: readlink ${symlink} failed")
++ [[ ${provider} == */* ]] && die "${dieprefix}: malformed target for ${symlink}"
++
++ if [[ -L ${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider} ||
++ ( -e ${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider} && ! -d ${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider} ) ]]; then
++ die "${dieprefix}: ${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider} is not a directory"
++ fi
++
++ echo "${provider}"
++
++ elif [[ -e ${ALTERNATIVESDIR}/${ALTERNATIVE}/_current ]]; then
++ die "${dieprefix}: ${ALTERNATIVESDIR}/${ALTERNATIVE}/_current is not a symlink"
++ fi
++}
++
++compare_importance() {
++ local IFS=.
++ local a=( ${1} ) b=( ${2} )
++ local -i i=0
++ while (( i<${#a[@]} && i<${#b[@]} )); do
++ if (( a[i]<b[i] )); then
++ return 0
++ elif (( a[i]>b[i] )); then
++ return 1
++ fi
++ i+=1
++ done
++ (( i<${#b[@]} ))
++}
++
++sort_providers() {
++ local begin=${1:-0}
++ local count=${2:-${#providers[@]}}
++ [[ ${count} -le 1 ]] && return 0
++ sort_providers ${begin} $((count/2))
++ sort_providers $((begin+count/2)) $((count-count/2))
++ local left=( "${providers[@]:begin:count/2}" )
++ local right=( "${providers[@]:begin+count/2:count-count/2}" )
++ local -i x i=0 j=0
++ for (( x=begin; x<begin+count; ++x )); do
++ if (( j>=${#right[@]} )) || { (( i<${#left[@]} )) && compare_importance "${left[i]%%:*}" "${right[j]%%:*}"; }; then
++ providers[x]=${left[i++]}
++ else
++ providers[x]=${right[j++]}
++ fi
++ done
++}
++
++get_providers() {
++ local p= importance providers=()
++ for p in "${ALTERNATIVESDIR}/${ALTERNATIVE}"/* ; do
++ [[ -d ${p} && ! -L ${p} ]] || continue
++ p=${p##*/}
++
++ importance=$(< "${ALTERNATIVESDIR}/${ALTERNATIVE}/${p}/_importance")
++ importance=${importance:-0}
++ [[ "${importance}" =~ ^[0123456789]+(\.[0123456789]+)*$ ]] || die "_importance (${importance}) for ${p} is not a dot-separated list of integers"
++
++ providers+=( "${importance}:${p}" )
++ done
++
++ sort_providers
++ for (( p=${#providers[@]}-1 ; p>=0 ; --p )); do
++ echo "${providers[p]#*:}"
++ done
++}
++
++_options_parameters() {
++ [[ -n ${2} && ${2} != --descriptions ]] && die -q "Unrecognised option ${2}"
++ local describe_func=describe_${1#options_}_options descriptions=${2} opt options oldifs=$IFS
++ if is_function ${describe_func}; then
++ IFS=$'\n'
++ options=( $(${describe_func}) )
++ IFS=$oldifs
++ for opt in "${options[@]}"; do
++ [[ ${opt} == --* ]] || continue
++ if [[ -n ${descriptions} ]]; then
++ echo "${opt/ : /:}"
++ else
++ echo "${opt%% : *}"
++ fi
++ done
++ fi
++}
++
++### set action stub ###
++
++# not available in "eselect alternatives", but needed by do_update
++
++alternatives_do_set() {
++ [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the eselect module"
++
++ local force provider providers
++ if [[ ${1} == --force ]]; then
++ force=yes
++ shift
++ fi
++ local idx=${1}
++ if [[ ${1} == +(-|+|[[:digit:]]) ]]; then
++ idx=${1#+(-|+)}
++ providers=( $(get_providers) )
++ (( ${idx} <= ${#providers[@]} )) || die -q "The given provider with index (${idx}) does not exist"
++ provider=${providers[${idx}-1]}
++ else
++ provider="${1}"
++ fi
++ [[ -z "${provider}" ]] && die -q "Missing required parameter 'provider'"
++ local dieprefix="Could not set provider ${provider} for alternative ${ALTERNATIVE}"
++
++ if [[ ! -d ${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider} ]] ; then
++ if is_number ${provider} ; then
++ providers=( $(get_providers) )
++ [[ -n ${providers[${idx}-1]} ]] && \
++ die -q "The given provider (${provider}) does not exist"
++ fi
++ die -q "The given provider (${provider}) does not exist"
++ fi
++
++ local symlink newsymlinks=() oldsymlinks=()
++
++ while read -r -d '' symlink; do
++ local nicesymlink=${symlink#.}
++ nicesymlink=${nicesymlink//+(\/)/\/}
++ [[ ${nicesymlink} == /* ]] || die "${dieprefix}: bad symlink ${symlink}?"
++ [[ ${nicesymlink} == */ ]] && die "${dieprefix}: bad symlink ${symlink}?"
++
++ newsymlinks+=( "${nicesymlink}" )
++ done < <(
++ cd "${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider}" || die "${dieprefix}: cd failed"
++ find . -type l -print0 | LC_ALL=C sort -r -u -z)
++ [[ ${#newsymlinks[@]} -gt 0 ]] || die "${dieprefix}: does not provide any symlinks?"
++
++ if [[ -f ${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list ]]; then
++ while read -r -d '' symlink; do
++ local nicesymlink=${symlink//+(\/)/\/}
++ [[ ${nicesymlink} == /* ]] || die "${dieprefix}: old provider ${oldcur} provides bad symlink ${symlink}?"
++ [[ ${nicesymlink} == */ ]] && die "${dieprefix}: old provider ${oldcur} provides bad symlink ${symlink}?"
++
++ oldsymlinks+=( "${nicesymlink}" )
++ done < <(LC_ALL=C sort -r -u -z "${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list")
++ [[ ${#oldsymlinks[@]} -gt 0 ]] || die "${dieprefix}: old provider ${oldcur} does not provide any symlinks?"
++
++ elif [[ -L ${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list || -e ${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list ]]; then
++ die "${dieprefix}: ${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list is not a file"
++ fi
++
++ local pass errors=
++ for pass in check perform; do
++ local -i new_i=0 old_i=0
++ while [[ -n ${newsymlinks[new_i]} || -n ${oldsymlinks[old_i]} ]]; do
++
++ if ( LC_ALL=C; [[ ${newsymlinks[new_i]} < ${oldsymlinks[old_i]} ]] ); then
++ if [[ ${pass} == check ]]; then
++ if [[ -L ${EROOT%/}${oldsymlinks[old_i]} ]]; then
++ :
++ elif [[ -d ${EROOT%/}${oldsymlinks[old_i]} ]]; then
++ write_error_msg "Can't remove ${EROOT%/}${oldsymlinks[old_i]}: is a directory${force:+ which is a fatal error that cannot be ignored by --force}"
++ errors=yes
++ elif [[ -e ${EROOT%/}${oldsymlinks[old_i]} ]]; then
++ if [[ -n ${force} ]]; then
++ write_warning_msg "Removing ${EROOT%/}${oldsymlinks[old_i]} due to --force: is not a symlink"
++ else
++ write_error_msg "Refusing to remove ${EROOT%/}${oldsymlinks[old_i]}: is not a symlink (use --force to override)"
++ errors=yes
++ fi
++ fi
++
++ elif [[ ${pass} == perform ]]; then
++ rm -f "${EROOT%/}${oldsymlinks[old_i]}" || die "${dieprefix}: rm failed"
++ else
++ die "${dieprefix}: unknown \${pass} ${pass}???"
++ fi
++
++ old_i+=1
++
++ else
++ local target=${ALTERNATIVESDIR_ROOTLESS#/}/${ALTERNATIVE}/_current${newsymlinks[new_i]} dir=${newsymlinks[new_i]%/*}
++ while [[ -n ${dir} ]]; do
++ target=../${target}
++ dir=${dir%/*}
++ done
++
++ if [[ ${pass} == check ]]; then
++ if [[ -L ${EROOT%/}${newsymlinks[new_i]} ]]; then
++ :
++ elif [[ -d ${EROOT%/}${newsymlinks[new_i]} ]]; then
++ write_error_msg "Can't overwrite ${EROOT%/}${newsymlinks[new_i]}: is a directory${force:+ which is a fatal error that cannot be ignored by --force}"
++ errors=yes
++ elif [[ -e ${EROOT%/}${newsymlinks[new_i]} ]]; then
++ if [[ -n ${force} ]]; then
++ write_warning_msg "Overwriting ${EROOT%/}${newsymlinks[new_i]} due to --force: is not a symlink"
++ else
++ write_error_msg "Refusing to overwrite ${EROOT%/}${newsymlinks[new_i]}: is not a symlink (use --force to override)"
++ errors=yes
++ fi
++ fi
++
++ elif [[ ${pass} == perform ]]; then
++ mkdir -p "${EROOT%/}${newsymlinks[new_i]%/*}" || die "${dieprefix}: mkdir -p failed"
++ ln -snf "${target#/}" "${EROOT%/}${newsymlinks[new_i]}" || die "${dieprefix}: ln -snf failed"
++ else
++ die "${dieprefix}: unknown \${pass} ${pass}???"
++ fi
++
++ [[ ${newsymlinks[new_i]} == ${oldsymlinks[old_i]} ]] && old_i+=1
++ new_i+=1
++ fi
++ done
++
++ [[ -n ${errors} ]] && die "${dieprefix}: see previous errors"
++ done
++
++ local oldcur="$(get_current_provider)"
++ ln -snf "${provider}" "${ALTERNATIVESDIR}/${ALTERNATIVE}/_current" || die "${dieprefix}: ln -snf failed"
++
++ : >"${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list" || die "${dieprefix}: emptying/creating _current_list failed"
++ for symlink in "${newsymlinks[@]}"; do
++ echo -n -e "${symlink}\\0" >>"${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list" || die "${dieprefix}: appending ${symlink} to _current_list failed"
++ done
++ return 0
++}
++
++### update action ###
++
++# available in both "eselect alternatives" and individual modules
++
++alternatives_describe_update() {
++ echo "Set a default provider if no valid one currently exists"
++}
++
++alternatives_describe_update_parameters() {
++ echo "[--best] [--ignore] <provider>"
++}
++
++alternatives_describe_update_options() {
++ echo "--best : update to the best provider even if one is already selected"
++ echo "--ignore : update to any valid provider EXCEPT the specified provider"
++ echo "<provider> : the name of the provider to use"
++}
++
++alternatives_do_update() {
++ [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the eselect module"
++
++ local p cur=$(get_current_provider) providers=( $(get_providers) ) best ignore
++ if [[ "--best" == ${1} ]] ; then
++ shift
++ best=1
++ fi
++ if [[ "--ignore" == ${1} ]] ; then
++ # Try everything except setting the provider to the given
++ # one. So, if it isn't the given one, we end up doing
++ # nothing. Bug #128
++ shift
++ ignore=${1}
++ fi
++ [[ -n ${best} && -n ${1} && -z ${ignore} ]] && die -q "Cannot specify both --best and a provider"
++
++ if [[ -n ${best} ]] ; then
++ : # fall through to "switch to first available" loop below
++ elif [[ ${cur} == ${1} && -z ${ignore} ]]; then
++ # if current provider was just updated, reselect it since it could have changed
++ alternatives_do_set "${cur}" && return 0
++ elif [[ -n ${cur} && ${cur} != ${ignore} ]] ; then
++ # verify existing provider's symlinks
++ local p= bad=0
++ while read -r -d '' p ; do
++ [[ -L "${EROOT%/}${p}" && -e "${EROOT%/}${p}" ]] || (( bad++ ))
++ done < "${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list"
++
++ [[ "${bad}" -eq 0 ]] && return 0
++ # fix existing provider if possible
++ has "${cur}" "${providers[@]}" && alternatives_do_set "${cur}" && return 0
++ elif has "${1}" "${providers[@]}" && [[ -z ${ignore} ]] ; then
++ # switch to new provider if none was set before or it can't be fixed
++ alternatives_do_set "${1}" && return 0
++ fi
++
++ # if no valid provider has been selected switch to first available, valid
++ # provider, sorted according to importance
++ for p in "${providers[@]}"; do
++ [[ ${ignore} != ${p} ]] && alternatives_do_set "${p}" && return 0
++ done
++
++ # if a provider is set but no providers are available anymore cleanup
++ cur=$(get_current_provider)
++ if [[ -n ${cur} ]]; then
++ alternatives_do_unset "${cur}" && return 2
++ fi
++ # if no provider is set and none are available that are not ignored, return 2 for cleanup
++ [[ -z ${providers[@]} || ${providers[@]} == ${ignore} ]] && return 2
++
++ # we tried everything to select a valid provider, but failed
++ return 1
++}
++
++alternatives_options_update() {
++ _options_parameters ${FUNCNAME#alternatives_} "$@"
++ if [[ -n ${ALTERNATIVE} ]]; then
++ get_providers
++ else
++ for alt in ${ALTERNATIVESDIR_ROOTLESS}/_*/*/_importance; do
++ echo ${alt} | cut -d/ -f5
++ done | sort -u
++ fi
++}
++
++### unset action stub ###
++
++# not available in "eselect alternatives", but needed by do_update
++
++alternatives_do_unset() {
++ [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the eselect module"
++
++ local force=
++ if [[ ${1} == --force ]]; then
++ force=yes
++ shift
++ fi
++
++ local cur="$(get_current_provider)" p=
++ [[ -n "${cur}" ]] || die -q "Nothing to unset"
++ local dieprefix="Could not unset provider for ${ALTERNATIVE}"
++
++ local one=false symlink pass errors=
++ for pass in check perform; do
++ while read -r -d '' symlink; do
++ one=true
++ if [[ ${pass} == check ]]; then
++ if [[ -L ${EROOT%/}${symlink} ]]; then
++ :
++ elif [[ -d ${EROOT%/}${symlink} ]]; then
++ write_error_msg "Can't remove ${EROOT%/}${symlink}: is a directory${force:+ which is a fatal error that cannot be ignored by --force}"
++ errors=yes
++ elif [[ -e ${EROOT%/}${symlink} ]]; then
++ if [[ -n ${force} ]]; then
++ write_warning_msg "Removing ${EROOT%/}${symlink} due to --force: is not a symlink"
++ else
++ write_error_msg "Refusing to remove ${EROOT%/}${symlink}: is not a symlink (use --force to override)"
++ errors=yes
++ fi
++ fi
++
++ elif [[ ${pass} == perform ]]; then
++ rm -f "${EROOT%/}${symlink}" || die "${dieprefix}: rm failed"
++ else
++ die "${dieprefix}: unknown \${pass} ${pass}???"
++ fi
++ done <"${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list"
++
++ [[ -n ${errors} ]] && die "${dieprefix}: see previous errors"
++ done
++
++ ${one} || die "${dieprefix}: does not provide any symlinks?"
++
++ rm "${ALTERNATIVESDIR}/${ALTERNATIVE}"/{_current,_current_list} || die "${dieprefix}: rm failed"
++}
++
++# vim: set ft=eselect sw=4 sts=4 ts=4 et tw=80 :
+diff --git a/libs/alternatives.bash.in b/libs/alternatives.bash.in
+new file mode 100644
+index 0000000..c2512e1
+--- /dev/null
++++ b/libs/alternatives.bash.in
+@@ -0,0 +1,249 @@
++# Copyright 2015 Gentoo Foundation
++# Copyright 2008 Mike Kelly
++# Copyright 2009, 2013 David Leverton
++# Copyright 2010 Bo Ørsted Andresen
++# Distributed under the terms of the GNU General Public License v2
++
++inherit alternatives-common
++
++### show action ###
++describe_show() {
++ echo "Show the current provider in use for ${ALTERNATIVE}"
++}
++
++do_show() {
++ [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the eselect module"
++ local current="$(get_current_provider)"
++ if [[ -z "${current}" ]] ; then
++ echo "(none)"
++ return 2
++ fi
++ echo "${current}"
++}
++
++options_show() {
++ :
++}
++
++### list action ###
++describe_list() {
++ echo "Lists all available providers for ${ALTERNATIVE}"
++}
++
++do_list() {
++ [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the eselect module"
++ local n cur= providers=( $(get_providers) )
++ write_list_start "Available providers for ${ALTERNATIVE}:"
++
++ cur="$(get_current_provider)"
++
++ if [[ -n "${providers[@]}" ]] ; then
++ for (( n = 0 ; n < ${#providers[@]} ; ++n )) ; do
++ [[ ${cur} == "${providers[${n}]}" ]] && \
++ providers[${n}]="${providers[${n}]} $(highlight '*')"
++ done
++ write_numbered_list "${providers[@]}"
++ else
++ write_kv_list_entry "(none found)" ""
++ fi
++}
++
++options_list() {
++ :
++}
++
++### files action ###
++describe_files() {
++ echo "Lists symlinks provided by the currently selected provider"
++}
++
++do_files() {
++ [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the eselect module"
++
++ local cur="$(get_current_provider)" p=
++ [[ -n "${cur}" ]] || die -q "No selected provider, hence no symlinks provided"
++ local dieprefix="Could not list symlinks provided for ${ALTERNATIVE}"
++
++ local errors symlink rootsymlink
++ while read -r -d '' symlink; do
++ rootsymlink="${EROOT%/}${symlink}"
++ rootsymlink=${rootsymlink//+(\/)/\/}
++ echo "${rootsymlink}"
++ if [[ -L ${rootsymlink} ]]; then
++ if [[ ! -e ${rootsymlink} ]]; then
++ write_error_msg "${rootsymlink} is dangling symlink"
++ errors=yes
++ fi
++ elif [[ -d ${rootsymlink} ]]; then
++ write_error_msg "${rootsymlink} is a directory"
++ errors=yes
++ elif [[ -e ${rootsymlink} ]]; then
++ write_error_msg "${rootsymlink} exists but is not a symlink"
++ errors=yes
++ else
++ write_error_msg "${rootsymlink} does not exist"
++ errors=yes
++ fi
++ done <"${ALTERNATIVESDIR}/${ALTERNATIVE}/_current_list"
++}
++
++options_files() {
++ :
++}
++
++### set action ###
++
++describe_set() {
++ echo "Sets a provider for ${ALTERNATIVE}"
++}
++
++describe_set_parameters() {
++ echo "[ --force ] <provider>"
++}
++
++describe_set_options() {
++ echo "--force : overwrite or remove existing non-symlink files (but not directories) if necessary"
++ echo "<provider> : the name of the provider to use or the index of the provider preceeded by a dash"
++}
++
++do_set() {
++ # implementation defined in alternatives-common.bash as needed by do_update
++ alternatives_do_set "$@"
++}
++
++options_set() {
++ _options_parameters $FUNCNAME "$@"
++ get_providers
++}
++
++### update action ###
++
++# all functions implemented in alternatives-common.bash as defined for
++# both "eselect alternatives" and individual modules
++
++describe_update() {
++ alternatives_describe_update
++}
++
++describe_update_parameters() {
++ alternatives_describe_update_parameters
++}
++
++describe_update_options() {
++ alternatives_describe_update_options
++}
++
++do_update() {
++ alternatives_do_update "$@"
++}
++
++options_update() {
++ alternatives_options_update
++}
++
++### unset action ###
++
++describe_unset() {
++ echo "Unset any symlinks created for the current provider for ${ALTERNATIVE}."
++}
++
++describe_unset_parameters() {
++ echo "[ --force ]"
++}
++
++describe_unset_options() {
++ echo "--force : remove existing non-symlink files (but not directories) if necessary"
++}
++
++do_unset() {
++ # implementation defined in alternatives-common.bash as needed by do_update
++ alternatives_do_unset "$@"
++}
++
++options_unset() {
++ _options_parameters $FUNCNAME "$@"
++ get_current_provider
++}
++
++### script action ###
++
++describe_script() {
++ echo "Output an evalable script fragment to set PATH, LD_LIBRARY_PATH and MANPATH to use the specified provider"
++}
++
++describe_script_parameters() {
++ echo "[--sh | --csh] [<provider>]"
++}
++
++describe_script_options() {
++ echo "--sh : use Bourne shell syntax (default)"
++ echo "--csh : use C shell syntax"
++ echo "<provider> : the provider to use or the index of the provider (if not specified, use the system default)"
++}
++
++do_script() {
++ [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the eselect module"
++ local syntax=sh provider providers
++ if [[ ${1} == --sh ]]; then
++ shift
++ elif [[ ${1} == --csh ]]; then
++ syntax=csh
++ shift
++ fi
++
++ local idx=${!}
++ if [[ ${idx} == +(-|+|[[:digit:]]) ]]; then
++ idx=${1#+(-|+)}
++ providers=( $(get_providers) )
++ (( ${idx} <= ${#providers[@]} )) || die -q "The given provider with index (${idx}) does not exist"
++ provider=${providers[${idx}-1]}
++ else
++ provider="${idx}"
++ fi
++ [[ -z "${provider}" ]] && die -q "Missing required parameter 'provider'"
++
++ if [[ ! -d ${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider} ]] ; then
++ if is_number ${provider} ; then
++ providers=( $(get_providers) )
++ [[ -n ${providers[${idx}-1]} ]] && \
++ die -q "The given provider (${provider}) does not exist"
++ fi
++ die -q "The given provider (${provider}) does not exist"
++ fi
++
++ local variables=( PATH LD_LIBRARY_PATH MANPATH )
++ [[ -n ${!default_*} ]] && local ${!default_*}
++ local default_LD_LIBRARY_PATH=$(grep '^[^#]' "${EROOT%/}"/etc/ld.so.conf | tr '\n' ':')/lib:/usr/lib
++ local default_MANPATH=$(MANPATH= man -C"${EROOT%/}"/etc/man.conf -w)
++
++ local var IFS=:
++ for var in "${variables[@]}"; do
++ local defvar=default_${var} path paths=( )
++ for path in ${!var}; do
++ [[ ${path} == ${ALTERNATIVESDIR_ROOTLESS}/${ALTERNATIVE}/* ]] && continue
++ [[ -n ${provider} && -d ${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider}/${path#/} ]] && paths+=( "${ALTERNATIVESDIR_ROOTLESS}/${ALTERNATIVE}/${provider}/${path#/}" )
++ paths+=( "${path}" )
++ done
++
++ [[ -n ${provider} ]] && for path in ${!defvar}; do
++ [[ -d ${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider}/${path#/} ]] && paths+=( "${ALTERNATIVESDIR_ROOTLESS}/${ALTERNATIVE}/${provider}/${path#/}" )
++ done
++
++ local newval=${paths[*]}
++ if [[ ${newval} != ${!var} ]]; then
++ newval=${newval//\'/\'\\\'\'}
++ if [[ ${syntax} == sh ]]; then
++ echo "${var}='${newval}'; export ${var}"
++ else
++ echo "setenv ${var} '${newval}'"
++ fi
++ fi
++ done
++}
++
++options_script() {
++ _options_parameters $FUNCNAME "$@"
++ get_providers
++}
++
++# vim: set ft=eselect sw=4 sts=4 ts=4 et tw=80 :
+diff --git a/modules/Makefile.am b/modules/Makefile.am
+index 73960c4..4da6465 100644
+--- a/modules/Makefile.am
++++ b/modules/Makefile.am
+@@ -1,6 +1,7 @@
+ modulesdir=$(datadir)/$(PACKAGE_NAME)/modules/
+
+ modules_DATA = \
++ alternatives.eselect \
+ binutils.eselect \
+ editor.eselect \
+ env.eselect \
+diff --git a/modules/alternatives.eselect b/modules/alternatives.eselect
+new file mode 100644
+index 0000000..b1c219f
+--- /dev/null
++++ b/modules/alternatives.eselect
+@@ -0,0 +1,50 @@
++# Copyright 2015 Gentoo Foundation
++# Copyright 2008 Mike Kelly
++# Copyright 2009, 2013 David Leverton
++# Copyright 2010 Bo Ørsted Andresen
++# Distributed under the terms of the GNU General Public License v2
++
++inherit alternatives-common
++
++DESCRIPTION="Maintain Alternatives symlinks"
++VERSION="20150521"
++MAINTAINER="sci@gentoo.org"
++
++show_extra_help_text() {
++ cat <<- ENDOFTEXT
++ This module is intended for internal use when a package is installed,
++ updated or removed. For alternatives for which it is likely that
++ users will need control over which provider is selected, there will be
++ a separate eselect module installed to do so.
++ ENDOFTEXT
++}
++
++### update action ###
++
++# all functions implemented in alternatives-common.bash as defined for
++# both "eselect alternatives" and individual modules
++
++describe_update() {
++ alternatives_describe_update
++}
++
++describe_update_parameters() {
++ echo "<alternative> $(alternatives_describe_update_parameters)"
++}
++
++describe_update_options() {
++ echo "<alternative> : the name of the alternative to set a provider for"
++ alternatives_describe_update_options
++}
++
++do_update() {
++ local ALTERNATIVE=$1
++ shift
++ [[ -z "${ALTERNATIVE}" ]] && die -q "Missing required parameter 'alternative'"
++ alternatives_do_update "$@"
++}
++
++options_update() {
++ alternatives_options_update
++}
++
+diff --git a/modules/modules.eselect b/modules/modules.eselect
+index 038f630..eb73e16 100644
+--- a/modules/modules.eselect
++++ b/modules/modules.eselect
+@@ -2,7 +2,7 @@
+ # Copyright 2006-2015 Gentoo Foundation
+ # Distributed under the terms of the GNU GPL version 2 or later
+
+-inherit config
++inherit config output tests
+
+ DESCRIPTION="Query eselect modules"
+ MAINTAINER="eselect@gentoo.org"
+@@ -15,57 +15,94 @@ describe_list() {
+ echo "List all available modules"
+ }
+
+-describe_list_options() {
+- echo "--only-names : Output names of modules only"
+-}
+-
+ # List all installed modules
+ do_list() {
+- local only_names path file module name desc
+- local -a extra_modules
+-
+- if [[ ${1#--} = only-names ]]; then
+- only_names=1
+- shift
+- fi
+- [[ $# -gt 0 ]] && die -q "Too many parameters"
+-
+- for path in "${ESELECT_MODULES_PATH[@]}" ; do
+- [[ -d ${path} ]] || continue
+- for file in "${path}"/*.eselect ; do
+- [[ -f ${file} ]] || continue
+- extra_modules=( "${extra_modules[@]}" "${file}" )
+- done
+- done
+-
+- if [[ -n ${only_names} ]]; then
+- # This is mainly intended for bash completion
+- echo "help"
+- echo "usage"
+- echo "version"
+- for module in "${extra_modules[@]}" ; do
+- name=${module##*/}
+- echo "${name%%.eselect}"
+- done
+- else
+- write_list_start "Built-in modules:"
+- write_kv_list_entry "help" "Display a help message"
+- write_kv_list_entry "usage" "Display a usage message"
+- write_kv_list_entry "version" "Display version information"
+-
+- if [[ ${#extra_modules[@]} -gt 0 ]] ; then
+- echo
+- write_list_start "Extra modules:"
+- for module in "${extra_modules[@]}" ; do
+- name=${module##*/}
+- name=${name%%.eselect}
+- desc=$(ESELECT_MODULE_NAME=${name} \
+- load_config "${module}" DESCRIPTION)
+- desc=${desc:-No description available}
+- write_kv_list_entry "${name}" "${desc}"
+- done
+- fi
+- fi
++ local path file module name desc group groups Extra_modules
++
++ write_list_start "Built-in modules:"
++ write_kv_list_entry "help" "Display a help message"
++ write_kv_list_entry "usage" "Display a usage message"
++ write_kv_list_entry "version" "Display version information"
++ write_kv_list_entry "print-modules" "Print eselect modules"
++ write_kv_list_entry "print-actions" "Print actions for a given module"
++ write_kv_list_entry "print-options" "Print options for a given action"
++
++ for path in "${ESELECT_MODULES_PATH[@]}" ; do
++ [[ -d ${path} ]] || continue
++ for file in ${path}/*.eselect ; do
++ [[ -f ${file} ]] || continue
++ group=$(load_config "${file}" ESELECT_MODULE_GROUP)
++ if [[ -n ${group} ]]; then
++ has ${group} ${groups} || groups+=" ${group}"
++ declare ${group}_modules+=" ${file}"
++ else
++ Extra_modules+=" ${file}"
++ fi
++ done
++ done
++
++ for group in ${groups} Extra; do
++ local m
++ m="${group}_modules"
++ if [[ -n ${!m} ]] ; then
++ echo
++ write_list_start "${group} modules:"
++ for module in ${!m}; do
++ name=${module##*/}
++ name=${name%%.eselect}
++ desc=$(load_config "${module}" DESCRIPTION)
++ desc=${desc:-No description available}
++ write_kv_list_entry "${name}" "${desc}"
++ done
++ fi
++ done
++}
++
++### group action
++
++describe_group() {
++ echo "Lists all available modules belonging to a specified group."
++}
++
++describe_group_parameters() {
++ echo "<group>"
++}
++
++do_group() {
++ local path file groupname="$1" group module modules name desc
++ [[ -z "$groupname" ]] && die -q "Required option (group name) missing."
++
++ if [[ ${groupname} == Built-in ]]; then
++ write_list_start "Built-in modules:"
++ write_kv_list_entry "help" "Display a help message"
++ write_kv_list_entry "usage" "Display a usage message"
++ write_kv_list_entry "version" "Display version information"
++ return 0
++ fi
++
++ for path in "${ESELECT_MODULES_PATH[@]}" ; do
++ [[ -d ${path} ]] || continue
++ for file in ${path}/*.eselect ; do
++ [[ -f ${file} ]] || continue
++ group=$(load_config "${file}" ESELECT_MODULE_GROUP)
++ [[ ${groupname} == ${group} ||
++ ( ${groupname} == Extra && -z ${group} ) ]] || continue
++ modules+=" ${file}"
++ done
++ done
++
++ if [[ -n ${modules} ]] ; then
++ write_list_start "${groupname} modules:"
++ for module in ${modules}; do
++ name=${module##*/}
++ name=${name%%.eselect}
++ desc=$(load_config "${module}" DESCRIPTION)
++ desc=${desc:-No description available}
++ write_kv_list_entry "${name}" "${desc}"
++ done
++ else
++ die -q "No modules belonging to ${groupname} was found"
++ fi
+ }
+
+ ### has action
+@@ -75,56 +112,89 @@ describe_has() {
+ }
+
+ describe_has_parameters() {
+- echo "<module>"
++ echo "<module>"
+ }
+
+ do_has() {
+- [[ -z $1 ]] && die -q "Required option (module name) missing"
+- [[ $# -gt 1 ]] && die -q "Too many parameters"
+-
+- local modname=$1 modpath
+- for modpath in "${ESELECT_MODULES_PATH[@]}" ; do
+- [[ -f ${modpath}/${modname}.eselect ]] && return 0
+- done
+- return 1
++ [[ -z $1 ]] && die -q "Required option (module name) missing"
++ [[ $# -gt 1 ]] && die -q "Too many parameters"
++ local modname="$1" modpath
++ [[ -z "$modname" ]] && die -q "Required option (module name) missing."
++ for modpath in "${ESELECT_MODULES_PATH[@]}" ; do
++ [[ -f "${modpath}/${modname}.eselect" ]] && return 0
++ done
++ return 1
+ }
+
+ ### add action
+-# *** Commented out. Do we really want to have an eselect module that is
+-# *** installing other modules in a system directory? Also, this should
+-# *** go together with a "remove" action.
+-
+-# describe_add() {
+-# echo "Install the given module file somewhere that eselect can find it."
+-# echo "By default, install to \$HOME/.eselect/modules/, unless running as "
+-# echo "root. Then, install to ${ESELECT_DATA_PATH}/modules/."
+-# }
+-
+-# describe_add_parameters() {
+-# echo "<module_file>"
+-# }
+-
+-# do_add() {
+-# local local_path="${ROOT}${HOME}/.eselect/modules/" module_file
+-# local force_default=0
+-#
+-# if [[ $1 = "--force-default-location" ]] ; then
+-# force_default=1
+-# shift
+-# fi
+-# module_file=$1
+-#
+-# [[ -z ${module_file} ]] && die -q "Required option (module file) missing"
+-#
+-# # TODO: Don't install the module "somewhere", depending on write access.
+-# # Add an option to control if it goes to the user's or to the system dir.
+-# if ! cp "${module_file}" "${ESELECT_DEFAULT_MODULES_PATH}" &> /dev/null ; then
+-# [[ ${force_default} == 1 ]] \
+-# && die -q "Failed to install module file to default modules path"
+-#
+-# mkdir -p "${local_path}" \
+-# || die -q "Failed to create module install directory"
+-# cp "${module_file}" "${local_path}" \
+-# || die -q "Failed to install module file"
+-# fi
+-# }
++
++describe_add() {
++ echo "Install a module file to \$HOME/.eselect/modules/, or ${ESELECT_DEFAULT_MODULES_PATH//\/\///}/ when run as root"
++}
++
++describe_add_parameters() {
++ echo "<module_file>"
++}
++
++do_add() {
++
++ local local_path="${ROOT}${HOME}/.eselect/modules/" module_file
++ local force_default=0
++
++ if [[ $1 = "--force-default-location" ]] ; then
++ force_default=1
++ shift
++ fi
++ module_file=$1
++
++ [[ -z ${module_file} ]] && die -q "Required option (module file) missing"
++
++ # TODO: Don't install the module "somewhere", depending on write access.
++ # Add an option to control if it goes to the user's or to the system dir.
++ if ! cp "${module_file}" "${ESELECT_DEFAULT_MODULES_PATH}" &> /dev/null ; then
++ [[ ${force_default} == 1 ]] \
++ && die -q "Failed to install module file to default modules path"
++
++ mkdir -p "${local_path}" \
++ || die -q "Failed to create module install directory"
++ cp "${module_file}" "${local_path}" \
++ || die -q "Failed to install module file"
++ fi
++}
++
++### remove action
++
++describe_remove() {
++ echo "Remove the given module name"
++ echo "By default, it will remove from \$HOME/.eselect/modules/, unless running as "
++ echo "root. Then, remove from ${ESELECT_DATA_PATH}/modules/."
++}
++
++describe_remove_parameters() {
++ echo "<module>"
++}
++
++do_remove() {
++ local local_path="${ROOT}${HOME}/.eselect/modules/" module_name
++ local force_default=0
++
++ if [[ $1 = "--force-default-location" ]] ; then
++ force_default=1
++ shift
++ fi
++ module_name=$1
++
++ [[ -z ${module_name} ]] && die -q "Required option (module name) missing"
++
++ # TODO: Don't install the module "somewhere", depending on write access.
++ # Add an option to control if it goes to the user's or to the system dir.
++ if ! rm "${ESELECT_DEFAULT_MODULES_PATH}"/${module_name}.eselect &> /dev/null ; then
++ [[ ${force_default} == 1 ]] \
++ && die -q "Failed to remove module ${module_name} from default modules path"
++
++ rm "${module_file}" "${local_path}"/${module_name}.eselect \
++ || die -q "Failed to remove module ${module_name}"
++ fi
++}
++
++# vim: set ft=eselect sw=4 sts=4 ts=4 et tw=80 :