commit:     2074128c90645ffd391f98faa9296c596ae9c9e2
Author:     Justin Lecher <jlec <AT> gentoo <DOT> org>
AuthorDate: Sun May 24 08:09:37 2015 +0000
Commit:     Justin Lecher <jlec <AT> gentoo <DOT> org>
CommitDate: Sun May 24 08:09:37 2015 +0000
URL:        https://gitweb.gentoo.org/proj/sci.git/commit/?id=2074128c

app-admin/eselect: Latest patch

Package-Manager: portage-2.2.20

 app-admin/eselect/ChangeLog                        |    6 +
 app-admin/eselect/eselect-1.4.4-r101.ebuild        |   72 ++
 .../eselect/files/eselect-1.4.4-alternatives.patch | 1221 ++++++++++++++++++++
 3 files changed, 1299 insertions(+)

diff --git a/app-admin/eselect/ChangeLog b/app-admin/eselect/ChangeLog
index cc795da..47d1515 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 <j...@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 <j...@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 0000000..67b835c
--- /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 0000000..71c2e67
--- /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="s...@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="esel...@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 :

Reply via email to