commit:     116c78640289d6d8fccea17a03536fafd7569412
Author:     Justin Lecher <jlec <AT> gentoo <DOT> org>
AuthorDate: Sun May 24 08:28:21 2015 +0000
Commit:     Justin Lecher <jlec <AT> gentoo <DOT> org>
CommitDate: Sat Jun  6 12:34:57 2015 +0000
URL:        https://gitweb.gentoo.org/proj/sci.git/commit/?id=116c7864

Update to latest alternative progress

Package-Manager: portage-2.2.20

 app-admin/eselect/ChangeLog                        |   8 +
 app-admin/eselect/eselect-1.4.4-r100.ebuild        |  72 ---
 ...1.4.4-r101.ebuild => eselect-1.4.4-r102.ebuild} |   0
 .../eselect/files/eselect-1.4.2-alternatives.patch | 616 ---------------------
 .../eselect/files/eselect-1.4.4-alternatives.patch | 311 ++++++++++-
 app-misc/aa/ChangeLog                              |  11 +
 app-misc/aa/aa-0.ebuild                            |  33 ++
 app-misc/aa/metadata.xml                           |   8 +
 app-misc/bb/ChangeLog                              |  11 +
 app-misc/bb/bb-0.ebuild                            |  33 ++
 app-misc/bb/metadata.xml                           |   8 +
 eclass/alternatives-2.eclass                       | 136 +----
 12 files changed, 424 insertions(+), 823 deletions(-)

diff --git a/app-admin/eselect/ChangeLog b/app-admin/eselect/ChangeLog
index 47d1515..79d1aac 100644
--- a/app-admin/eselect/ChangeLog
+++ b/app-admin/eselect/ChangeLog
@@ -2,6 +2,14 @@
 # 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-r102 (06 Jun 2015)
+
+  06 Jun 2015; Justin Lecher <[email protected]> +eselect-1.4.4-r102.ebuild,
+  -eselect-1.4.4-r100.ebuild, -eselect-1.4.4-r101.ebuild,
+  -files/eselect-1.4.2-alternatives.patch,
+  files/eselect-1.4.4-alternatives.patch:
+  app-admin/eselect: Add latest patch
+
 *eselect-1.4.4-r101 (24 May 2015)
 
   24 May 2015; Justin Lecher <[email protected]> +eselect-1.4.4-r101.ebuild,

diff --git a/app-admin/eselect/eselect-1.4.4-r100.ebuild 
b/app-admin/eselect/eselect-1.4.4-r100.ebuild
deleted file mode 100644
index 8001cf1..0000000
--- a/app-admin/eselect/eselect-1.4.4-r100.ebuild
+++ /dev/null
@@ -1,72 +0,0 @@
-# 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}"/${PN}-1.4.2-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/eselect-1.4.4-r101.ebuild 
b/app-admin/eselect/eselect-1.4.4-r102.ebuild
similarity index 100%
rename from app-admin/eselect/eselect-1.4.4-r101.ebuild
rename to app-admin/eselect/eselect-1.4.4-r102.ebuild

diff --git a/app-admin/eselect/files/eselect-1.4.2-alternatives.patch 
b/app-admin/eselect/files/eselect-1.4.2-alternatives.patch
deleted file mode 100644
index 3f4a34b..0000000
--- a/app-admin/eselect/files/eselect-1.4.2-alternatives.patch
+++ /dev/null
@@ -1,616 +0,0 @@
-Index: bin/eselect.in
-===================================================================
---- bin/eselect.in     (revision 863)
-+++ bin/eselect.in     (working copy)
-@@ -22,10 +22,15 @@
- # 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"
---- bin/Makefile.am.orig       2013-09-02 14:35:05.328684465 +0400
-+++ bin/Makefile.am    2013-09-02 14:49:50.895842067 +0400
-@@ -4,6 +4,7 @@
- dosed = @SED@ -e 's%\@BASH\@%$(BASH)%g' \
-             -e 's%\@DATADIR\@%$(datadir)%g' \
-             -e 's%\@EPREFIX\@%$(EPREFIX)%g' \
-+            -e 's%\@LIBEXECDIR\@%$(datadir)%g' \
-             -e 's%\@VERSION\@%$(VERSION)$(EXTRAVERSION)%g'
- 
- % : %.in
-Index: libs/Makefile.am
-===================================================================
---- libs/Makefile.am   (revision 863)
-+++ libs/Makefile.am   (working copy)
-@@ -1,6 +1,7 @@
- eselectlibsdir = $(datadir)/$(PACKAGE_NAME)/libs/
- 
- eselectlibs_DATA = \
-+      alternatives.bash \
-       config.bash \
-       core.bash \
-       default.eselect \
-@@ -14,6 +15,7 @@
-       tests.bash
- 
- EXTRA_DIST = \
-+      alternatives.bash.in \
-       config.bash.in \
-       core.bash.in \
-       default.eselect.in \
-@@ -30,7 +32,8 @@
-       -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) $< > $@
---- libs/alternatives.bash.in.orig     1970-01-01 01:00:00.000000000 +0100
-+++ libs/alternatives.bash.in  2011-09-06 18:55:43.000000000 +0100
-@@ -0,0 +1,550 @@
-+# Copyright 2008 Mike Kelly
-+# Copyright 2009 David Leverton
-+# Copyright 2010 Bo Ørsted Andresen
-+# 2010: Adapted to eselect Sebastien Fabbro (who doesn't like copyrights)
-+# 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
-+}
-+
-+### 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() {
-+    [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the eselect 
module"
-+
-+    local force provider providers
-+    if [[ ${1} == --force ]]; then
-+        force=yes
-+        shift
-+    fi
-+
-+    if [[ ${1} == -+([[:digit:]]) ]]; then
-+        providers=( $(get_providers) )
-+        (( ${1#-} <= ${#providers[@]} )) || die -q "The given provider with 
index (${1#-}) does not exist"
-+        provider=${providers[${1#-}-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[${1#-}-1]} ]] &&
-+                die -q "The given provider (${provider}) does not exist, did 
you mean -${provider} (${providers[${1#-}-1]})?"
-+        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 "${ROOT}${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
-+}
-+
-+_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
-+}
-+
-+options_set() {
-+    _options_parameters $FUNCNAME "$@"
-+    get_providers
-+}
-+
-+### update action ###
-+
-+describe_update() {
-+    echo "Set a default provider if no valid one currently exists"
-+}
-+
-+describe_update_parameters() {
-+    echo "[--ignore] <provider>"
-+}
-+
-+describe_update_options() {
-+    echo "--ignore : update to any valid provider EXCEPT the specified 
provider"
-+    echo "<provider> : the name of the provider to use"
-+}
-+
-+do_update() {
-+    [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the eselect 
module"
-+
-+    local p cur=$(get_current_provider) providers=( $(get_providers) ) ignore
-+    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
-+
-+    if [[ ${cur} == ${1} && -z ${ignore} ]]; then
-+        # if current provider was just updated, reselect it since it could 
have changed
-+        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[@]}" && 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
-+        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} ]] && 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
-+        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
-+}
-+
-+options_update() {
-+    _options_parameters $FUNCNAME "$@"
-+    get_providers
-+}
-+
-+### 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() {
-+    [[ -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"
-+}
-+
-+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 
preceeded by a dash (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
-+
-+    if [[ ${1} == -+([[:digit:]]) ]]; then
-+        providers=( $(get_providers) )
-+        (( ${1#-} <= ${#providers[@]} )) || die -q "The given provider with 
index (${1#-}) does not exist"
-+        provider=${providers[${1#-}-1]}
-+    else
-+        provider="${1}"
-+    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[${1#-}-1]} ]] &&
-+                die -q "The given provider (${provider}) does not exist, did 
you mean -${provider} (${providers[${1#-}-1]})?"
-+        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/app-admin/eselect/files/eselect-1.4.4-alternatives.patch 
b/app-admin/eselect/files/eselect-1.4.4-alternatives.patch
index 71c2e67..b2b9432 100644
--- a/app-admin/eselect/files/eselect-1.4.4-alternatives.patch
+++ b/app-admin/eselect/files/eselect-1.4.4-alternatives.patch
@@ -226,10 +226,10 @@ index 027ef73..a5fe373 100644
        @$(dosed) $< > $@
 diff --git a/libs/alternatives-common.bash.in 
b/libs/alternatives-common.bash.in
 new file mode 100644
-index 0000000..99de48e
+index 0000000..64d74df
 --- /dev/null
 +++ b/libs/alternatives-common.bash.in
-@@ -0,0 +1,372 @@
+@@ -0,0 +1,488 @@
 +# Copyright 2015 Gentoo Foundation
 +# Copyright 2008 Mike Kelly
 +# Copyright 2009, 2013 David Leverton
@@ -238,7 +238,7 @@ index 0000000..99de48e
 +
 +inherit config output path-manipulation
 +
-+ALTERNATIVESDIR_ROOTLESS="@sysconfdir@/env.d/alternatives"
++: "${ALTERNATIVESDIR_ROOTLESS:=@sysconfdir@/env.d/alternatives}"
 +ALTERNATIVESDIR="${EROOT%/}${ALTERNATIVESDIR_ROOTLESS}"
 +
 +get_current_provider() {
@@ -298,7 +298,8 @@ index 0000000..99de48e
 +              [[ -d ${p} && ! -L ${p} ]] || continue
 +              p=${p##*/}
 +
-+              importance=$(< 
"${ALTERNATIVESDIR}/${ALTERNATIVE}/${p}/_importance")
++              [[ -e "${ALTERNATIVESDIR}/${ALTERNATIVE}/${p}/_importance" ]] &&
++                      importance=$(< 
"${ALTERNATIVESDIR}/${ALTERNATIVE}/${p}/_importance")
 +              importance=${importance:-0}
 +              [[ "${importance}" =~ ^[0123456789]+(\.[0123456789]+)*$ ]] || 
die "_importance (${importance}) for ${p} is not a dot-separated list of 
integers"
 +
@@ -466,6 +467,117 @@ index 0000000..99de48e
 +      return 0
 +}
 +
++### add action ###
++alternatives_describe_add() {
++      echo "Add provider to selected alternative"
++}
++
++alternatives_describe_add_parameters() {
++      echo "<provider> <importance> <source> <target> [<source> <target> 
[...]]"
++}
++
++alternatives_describe_add_options() {
++      echo "<provider> : the name of the alternative provider"
++      echo "<importance> : interger value, representing the importance of the 
provider"
++      echo "<source> : source of the symlink"
++      echo "<target> : destination for the symlink"
++}
++
++alternatives_do_add() {
++      [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the 
eselect module"
++
++      (( $# >= 4 )) && (( ($#-2)%2 == 0)) || \
++              die "exactly 3+N*2 arguments where N>=1 required"
++      local provider=${1}
++      local importance=${2}
++      shift 2
++      local index src target ret=0
++      local provider_dir="${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider}"
++
++      # Creating base dir
++      if [[ ! -e "${provider_dir}" ]]; then
++              mkdir -p "${provider_dir}" || die "Failed to create 
${provider_dir}"
++      elif [[ ! -d "${provider_dir}" ]]; then
++              die "${provider_dir} exists but is a file"
++      else
++              die "${provider_dir} already present. You need ot remove it 
before adding it again"
++      fi
++
++      # Make sure importance is a signed integer
++      if [[ -n ${importance} ]] && ! [[ ${importance} =~ ^[0-9]+(\.[0-9]+)*$ 
]]; then
++              die "Invalid importance (${importance}) detected"
++      else
++              # Setting importance
++              echo ${importance} > "${provider_dir}/_importance"
++      fi
++
++      # Process source-target pairs
++      while (( $# >= 2 )); do
++              src=${1//+(\/)/\/}; target=${2//+(\/)/\/}
++              if [[ ${src} != /* ]]; then
++                      die "Source path must be absolute, but got ${src}"
++              else
++                      local reltarget= dir=${provider_dir}${src%/*}
++                      while [[ -n ${dir} ]]; do
++                              reltarget+=../
++                              dir=${dir%/*}
++                      done
++
++                      reltarget=${reltarget%/}
++                      [[ ${target} == /* ]] || reltarget+=${src%/*}/
++                      reltarget+=${target}
++                      mkdir -p "${provider_dir}${src%/*}" || die "Failed to 
create ${provider_dir}${src%/*}"
++                      ln -sf "${reltarget}" "${provider_dir}${src}" || die 
"Failed to create symlink"
++                      # The -e test will fail if existing symlink points to 
non-existing target,
++                      # so check for -L also.
++                      # Say ${ED}/sbin/init exists and links to /bin/systemd 
(which doesn't exist yet).
++#                     if [[ -e ${ED}${src} || -L ${ED}${src} ]]; then
++#                             local fulltarget=${target}
++#                             [[ ${fulltarget} != /* ]] && 
fulltarget=${src%/*}/${fulltarget}
++#                             if [[ -e ${ED}${fulltarget} || -L 
${ED}${fulltarget} ]]; then
++#                                     die "${src} defined as provider for 
${fulltarget}, but both already exist in \${ED}"
++#                             else
++#                                     mv "${ED}${src}" "${ED}${fulltarget}" 
|| die
++#                             fi
++#                     fi
++              fi
++              shift 2
++      done
++}
++
++alternatives_options_add() {
++      _options_parameters ${FUNCNAME#alternatives_} "$@"
++}
++
++### remove action ###
++
++alternatives_describe_remove() {
++      echo "Remove a provider for selected alternative"
++}
++
++alternatives_describe_remove_parameters() {
++      echo "<provider>"
++}
++
++alternatives_describe_remove_options() {
++      echo "<provider> : the name of the alternative provider to be removed"
++}
++
++alternatives_do_remove() {
++      [[ -z "${ALTERNATIVE}" ]] && die "Need to set ALTERNATIVE in the 
eselect module"
++
++      if [[ -d "${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider}" ]]; then
++              rm -r "${ALTERNATIVESDIR}/${ALTERNATIVE}/${provider}" || \
++                      die "Failed to remove '${provider}' for 
'${ALTERNATIVE}'"
++      else
++              einfo "'${provider}' is not a provider for '${ALTERNATIVE}'"
++      fi
++}
++
++alternatives_options_remove() {
++      _options_parameters ${FUNCNAME#alternatives_} "$@"
++}
++
 +### update action ###
 +
 +# available in both "eselect alternatives" and individual modules
@@ -502,6 +614,10 @@ index 0000000..99de48e
 +      [[ -n ${best} && -n ${1} && -z ${ignore} ]] && die -q "Cannot specify 
both --best and a provider"
 +
 +      if [[ -n ${best} ]] ; then
++              # set best provider
++              : # fall through to "switch to first available" loop below
++      elif [[ $# == "0" ]] && [[ -z ${cur} ]]; then
++              # if nothing is specified
 +              : # 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
@@ -541,13 +657,13 @@ index 0000000..99de48e
 +
 +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
++      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 ###
@@ -604,10 +720,10 @@ index 0000000..99de48e
 +# 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
+index 0000000..1b5a2b0
 --- /dev/null
 +++ b/libs/alternatives.bash.in
-@@ -0,0 +1,249 @@
+@@ -0,0 +1,293 @@
 +# Copyright 2015 Gentoo Foundation
 +# Copyright 2008 Mike Kelly
 +# Copyright 2009, 2013 David Leverton
@@ -726,6 +842,50 @@ index 0000000..c2512e1
 +      get_providers
 +}
 +
++### add action ###
++
++describe_add() {
++      alternatives_describe_add
++}
++
++describe_add_parameters() {
++      alternatives_describe_add_parameters
++}
++
++describe_add_options() {
++      alternatives_describe_add_options
++}
++
++do_add() {
++      alternatives_do_add
++
++      # make sure we have something selected
++      eselect ${provider} show > /dev/null || eselect ${provider} update 
--best
++}
++
++### remove action ###
++
++describe_remove() {
++      alternatives_describe_remove
++}
++
++describe_remove_parameters() {
++      alternatives_describe_remove_parameters
++}
++
++describe_remove_options() {
++      alternatives_describe_remove_options
++}
++
++do_remove() {
++      alternatives_do_remove
++
++#     if no provider is present, remove whole Alternative
++      if ! eselect ${provider} update --best > /dev/null; then
++              eselect alternatives remove ${ALTERNATIVE}
++      fi
++}
++
 +### update action ###
 +
 +# all functions implemented in alternatives-common.bash as defined for
@@ -803,7 +963,7 @@ index 0000000..c2512e1
 +
 +      local idx=${!}
 +      if [[ ${idx} == +(-|+|[[:digit:]]) ]]; then
-+      idx=${1#+(-|+)}
++              idx=${1#+(-|+)}
 +              providers=( $(get_providers) )
 +              (( ${idx} <= ${#providers[@]} )) || die -q "The given provider 
with index (${idx}) does not exist"
 +              provider=${providers[${idx}-1]}
@@ -871,10 +1031,10 @@ index 73960c4..4da6465 100644
        env.eselect \
 diff --git a/modules/alternatives.eselect b/modules/alternatives.eselect
 new file mode 100644
-index 0000000..b1c219f
+index 0000000..912bb3d
 --- /dev/null
 +++ b/modules/alternatives.eselect
-@@ -0,0 +1,50 @@
+@@ -0,0 +1,165 @@
 +# Copyright 2015 Gentoo Foundation
 +# Copyright 2008 Mike Kelly
 +# Copyright 2009, 2013 David Leverton
@@ -896,11 +1056,11 @@ index 0000000..b1c219f
 +      ENDOFTEXT
 +}
 +
-+### update action ###
-+
 +# all functions implemented in alternatives-common.bash as defined for
 +# both "eselect alternatives" and individual modules
 +
++### update action ###
++
 +describe_update() {
 +      alternatives_describe_update
 +}
@@ -925,6 +1085,121 @@ index 0000000..b1c219f
 +      alternatives_options_update
 +}
 +
++### create action ###
++
++describe_create() {
++      echo "Create a new alternative"
++}
++
++describe_create_parameters() {
++      echo "<alternative>"
++}
++
++describe_create_options() {
++      echo "<alternative> : the name of the alternative to create"
++}
++
++do_create() {
++      [[ $# == 1 ]] || die "Need exactly one alternative name"
++
++      local auto_dir="${ESELECT_AUTO_GENERATED_MODULES_PATH}"
++      local auto_file="${auto_dir}/${1}.eselect"
++
++      if [[ ! -e "${auto_file}" ]]; then
++              if [[ ! -e "${auto_dir}" ]]; then
++                      mkdir -p "${auto_dir}" || die "Failed to create 
${auto_dir}"
++              elif [[ ! -d "${auto_dir}" ]]; then
++                      die "${auto_dir} exists but is a file"
++              fi
++              cat >> ${auto_file} <<- ENDOFTEXT
++                      DESCRIPTION="${DESCRIPTION} for ${1}"
++                      VERSION="${VERSION}"
++                      MAINTAINER="${MAINTAINER}"
++                      ESELECT_MODULE_GROUP="Alternatives"
++
++                      ALTERNATIVE="${1}"
++
++                      inherit alternatives
++              ENDOFTEXT
++      fi
++}
++
++### delete action ###
++
++describe_delete() {
++      echo "Delete an existing alternative"
++}
++
++describe_delete_parameters() {
++      echo "<alternative>"
++}
++
++describe_delete_options() {
++      echo "<alternative> : the name of the alternative to delete"
++}
++
++do_delete() {
++      [[ $# == 1 ]] || die "Need exactly one alternative name"
++
++      local auto_dir="${ESELECT_AUTO_GENERATED_MODULES_PATH}"
++      local auto_file="${auto_dir}/${1}.eselect"
++
++      if [[ -e "${auto_file}" ]]; then
++              rm "${auto_file}" || die "Failed to remove alternative: ${1}"
++      fi
++}
++
++### add action ###
++
++describe_add() {
++      alternatives_describe_add
++}
++
++describe_add_parameters() {
++      echo "<alternative> $(alternatives_describe_add_parameters)"
++}
++
++describe_add_options() {
++      echo "<alternative> : the name of the alternative to add a provider for"
++      alternatives_describe_add_options
++}
++
++do_add() {
++      local ALTERNATIVE=$1
++      shift
++      [[ -z "${ALTERNATIVE}" ]] && die -q "Missing required parameter 
'alternative'"
++      alternatives_do_add "$@"
++}
++
++options_add() {
++      alternatives_options_add
++}
++
++### remove action ###
++
++describe_remove() {
++      alternatives_describe_remove
++}
++
++describe_remove_parameters() {
++      echo "<alternative> $(alternatives_describe_remove_parameters)"
++}
++
++describe_remove_options() {
++      echo "<alternative> : the name of the alternative to remove a provider 
from"
++      alternatives_describe_remove_options
++}
++
++do_remove() {
++      local ALTERNATIVE=$1
++      shift
++      [[ -z "${ALTERNATIVE}" ]] && die -q "Missing required parameter 
'alternative'"
++      alternatives_do_remove "$@"
++}
++
++options_remove() {
++      alternatives_options_remove
++}
 diff --git a/modules/modules.eselect b/modules/modules.eselect
 index 038f630..eb73e16 100644
 --- a/modules/modules.eselect

diff --git a/app-misc/aa/ChangeLog b/app-misc/aa/ChangeLog
new file mode 100644
index 0000000..e1e42cb
--- /dev/null
+++ b/app-misc/aa/ChangeLog
@@ -0,0 +1,11 @@
+# ChangeLog for app-misc/aa
+# Copyright 1999-2015 Gentoo Foundation; Distributed under the GPL v2
+# $Header: $
+
+  24 May 2015; Justin Lecher <[email protected]> aa-0.ebuild:
+  app-misc/aa: Fix usage
+
+*aa-0 (24 May 2015)
+
+  24 May 2015; Justin Lecher <[email protected]> +aa-0.ebuild, +metadata.xml:
+  app-misc/aa: Dummy package

diff --git a/app-misc/aa/aa-0.ebuild b/app-misc/aa/aa-0.ebuild
new file mode 100644
index 0000000..142e1c7
--- /dev/null
+++ b/app-misc/aa/aa-0.ebuild
@@ -0,0 +1,33 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=5
+
+inherit alternatives-2
+
+DESCRIPTION="AA"
+HOMEPAGE="http://www.gentoo.org";
+SRC_URI=""
+
+SLOT="0"
+LICENSE="BSD"
+KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux"
+IUSE=""
+
+RDEPEND=""
+DEPEND="${RDEPEND}
+"
+
+S="${WORKDIR}"
+
+src_install() {
+       cat > aa <<- EOF
+       #!/bin/bash
+       echo "aa"
+       EOF
+
+       dobin aa
+
+       alternatives_for alternatives-2 aa 0 /usr/bin/alternatives aa
+}

diff --git a/app-misc/aa/metadata.xml b/app-misc/aa/metadata.xml
new file mode 100644
index 0000000..7bc6ee8
--- /dev/null
+++ b/app-misc/aa/metadata.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd";>
+<pkgmetadata>
+  <maintainer>
+    <email>[email protected]</email>
+    <name>Justin Lecher</name>
+  </maintainer>
+</pkgmetadata>

diff --git a/app-misc/bb/ChangeLog b/app-misc/bb/ChangeLog
new file mode 100644
index 0000000..9b385c0
--- /dev/null
+++ b/app-misc/bb/ChangeLog
@@ -0,0 +1,11 @@
+# ChangeLog for app-misc/bb
+# Copyright 1999-2015 Gentoo Foundation; Distributed under the GPL v2
+# $Header: $
+
+  24 May 2015; Justin Lecher <[email protected]> bb-0.ebuild:
+  app-misc/bb: Fix usage
+
+*bb-0 (24 May 2015)
+
+  24 May 2015; Justin Lecher <[email protected]> +bb-0.ebuild, +metadata.xml:
+  app-misc/bb: Dummy package

diff --git a/app-misc/bb/bb-0.ebuild b/app-misc/bb/bb-0.ebuild
new file mode 100644
index 0000000..befb227
--- /dev/null
+++ b/app-misc/bb/bb-0.ebuild
@@ -0,0 +1,33 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=5
+
+inherit alternatives-2
+
+DESCRIPTION="BB"
+HOMEPAGE="http://www.gentoo.org";
+SRC_URI=""
+
+SLOT="0"
+LICENSE="BSD"
+KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux"
+IUSE=""
+
+RDEPEND=""
+DEPEND="${RDEPEND}
+"
+
+S="${WORKDIR}"
+
+src_install() {
+       cat > bb <<- EOF
+       #!/bin/bash
+       echo "bb"
+       EOF
+
+       dobin bb
+
+       alternatives_for alternatives-2 bb 0 /usr/bin/alternatives aa
+}

diff --git a/app-misc/bb/metadata.xml b/app-misc/bb/metadata.xml
new file mode 100644
index 0000000..7bc6ee8
--- /dev/null
+++ b/app-misc/bb/metadata.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd";>
+<pkgmetadata>
+  <maintainer>
+    <email>[email protected]</email>
+    <name>Justin Lecher</name>
+  </maintainer>
+</pkgmetadata>

diff --git a/eclass/alternatives-2.eclass b/eclass/alternatives-2.eclass
index 5a7eb6c..4fcf672 100644
--- a/eclass/alternatives-2.eclass
+++ b/eclass/alternatives-2.eclass
@@ -21,17 +21,17 @@
 # sure you explicitly run alternatives-2_pkg_{postinst,prerm} where 
appropriate.
 
 case "${EAPI:-0}" in
-       0|1|2|3)
+       0|1|2|3|4)
                die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}"
                ;;
-       4|5)
+       5)
                ;;
        *)
                die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}"
                ;;
 esac
 
-DEPEND=">=app-admin/eselect-1.4.4-r100"
+DEPEND=">=app-admin/eselect-1.4.4-r102"
 RDEPEND="${DEPEND}
        !app-admin/eselect-blas
        !app-admin/eselect-cblas
@@ -56,87 +56,12 @@ ALTERNATIVES_DIR="/etc/env.d/alternatives"
 alternatives_for() {
        debug-print-function ${FUNCNAME} "${@}"
 
-       (( $# >= 5 )) && (( ($#-3)%2 == 0)) || \
-               die "${FUNCNAME} requires exactly 3+N*2 arguments where N>=1"
-       local alternative=${1} provider=${2} importance=${3} index src target 
ret=0
-       shift 3
+       dodir /etc/env.d/alternatives
 
-       # Make sure importance is a signed integer
-       if [[ -n ${importance} ]] && ! [[ ${importance} =~ ^[0-9]+(\.[0-9]+)*$ 
]]; then
-               eerror "Invalid importance (${importance}) detected"
-               ((ret++))
-       fi
-
-       # Create alternative provider subdirectories under ALTERNATIVES_DIR if 
needed
-       [[ -d "${ED}${ALTERNATIVES_DIR}/${alternative}/${provider}" ]] || \
-               dodir "${ALTERNATIVES_DIR}/${alternative}/${provider}"
-
-       # Keep track of provided alternatives for use in pkg_{postinst,prerm}.
-       # Keep a mapping between importance and provided alternatives
-       # and make sure the former is set to only one value.
-       if ! has "${alternative}:${provider}" "${ALTERNATIVES_PROVIDED[@]}"; 
then
-               # Add new provider and set its importance
-               index=${#ALTERNATIVES_PROVIDED[@]}
-               ALTERNATIVES_PROVIDED+=( "${alternative}:${provider}" )
-               ALTERNATIVES_IMPORTANCE[index]=${importance}
-               [[ -n ${importance} ]] && \
-                       echo "${importance}" > 
"${ED}${ALTERNATIVES_DIR}/${alternative}/${provider}/_importance"
-       else
-               # Set importance for existing provider
-               for ((index=0;index<${#ALTERNATIVES_PROVIDED[@]};index++)); do
-                       if [[ ${alternative}:${provider} == 
${ALTERNATIVES_PROVIDED[index]} ]]; then
-                               if [[ -n ${ALTERNATIVES_IMPORTANCE[index]} ]]; 
then
-                                       if [[ -n ${importance} && 
${ALTERNATIVES_IMPORTANCE[index]} != ${importance} ]]; then
-                                               eerror "Differing importance 
(${ALTERNATIVES_IMPORTANCE[index]} != ${importance}) detected"
-                                               ((ret++))
-                                       fi
-                               else
-                                       
ALTERNATIVES_IMPORTANCE[index]=${importance}
-                                       [[ -n ${importance} ]] && \
-                                               echo "${importance}" > 
"${ED}${ALTERNATIVES_DIR}/${alternative}/${provider}/_importance"
-                               fi
-                       fi
-               done
-       fi
+       ALTERNATIVESDIR_ROOTLESS="${ED}/etc/env.d/alternatives" \
+               eselect alternatives add ${@} || die
 
-       # Process source-target pairs
-       while (( $# >= 2 )); do
-               src=${1//+(\/)/\/}; target=${2//+(\/)/\/}
-               if [[ ${src} != /* ]]; then
-                       eerror "Source path must be absolute, but got ${src}"
-                       ((ret++))
-
-               else
-                       local reltarget= 
dir=${ALTERNATIVES_DIR}/${alternative}/${provider}${src%/*}
-                       while [[ -n ${dir} ]]; do
-                               reltarget+=../
-                               dir=${dir%/*}
-                       done
-
-                       reltarget=${reltarget%/}
-                       [[ ${target} == /* ]] || reltarget+=${src%/*}/
-                       reltarget+=${target}
-                       dodir 
"${ALTERNATIVES_DIR}/${alternative}/${provider}${src%/*}"
-                       dosym "${reltarget}" 
"${ALTERNATIVES_DIR}/${alternative}/${provider}${src}"
-
-                       # The -e test will fail if existing symlink points to 
non-existing target,
-                       # so check for -L also.
-                       # Say ${ED}/sbin/init exists and links to /bin/systemd 
(which doesn't exist yet).
-                       if [[ -e ${ED}${src} || -L ${ED}${src} ]]; then
-                               local fulltarget=${target}
-                               [[ ${fulltarget} != /* ]] && 
fulltarget=${src%/*}/${fulltarget}
-                               if [[ -e ${ED}${fulltarget} || -L 
${ED}${fulltarget} ]]; then
-                                       die "${src} defined as provider for 
${fulltarget}, but both already exist in \${ED}"
-                               else
-                                       mv "${ED}${src}" "${ED}${fulltarget}" 
|| die
-                               fi
-                       fi
-               fi
-               shift 2
-       done
-
-       # Stop if there were any errors
-       [[ ${ret} -eq 0 ]] || die "Errors detected for ${provider}, provided 
for ${alternative}"
+       ALTERNATIVES_CREATED+=( ${1} )
 }
 
 # @FUNCTION: cleanup_old_alternatives_module
@@ -151,7 +76,7 @@ cleanup_old_alternatives_module() {
        if [[ -f "${old_module}" && $(grep 'ALTERNATIVE=' "${old_module}" | cut 
-d '=' -f 2) == "${alt}" ]]; then
                local version="$(grep 'VERSION=' "${old_module}" | grep -o 
'[0-9.]\+')"
                if [[ "${version}" == "0.1" || "${version}" == "20080924" ]]; 
then
-                       echo "rm ${old_module}"
+                       einfo "rm ${old_module}"
                        rm "${old_module}" || eerror "rm ${old_module} failed"
                fi
        fi
@@ -168,30 +93,12 @@ cleanup_old_alternatives_module() {
 alternatives-2_pkg_postinst() {
        debug-print-function ${FUNCNAME} "${@}"
 
-       local a alt provider module_version="20150521"
-       local EAUTO="${EROOT%/}/usr/share/eselect/modules/auto"
-
-       for a in "${ALTERNATIVES_PROVIDED[@]}"; do
-               alt="${a%:*}"
-               provider="${a#*:}"
-               if [[ ! -f "${EAUTO}/${alt}.eselect" \
-                       || "$(grep '^VERSION=' "${EAUTO}/${alt}.eselect" | grep 
-o '[0-9]\+')" \
-                               -ne "${module_version}" ]]; then
-                       if [[ ! -d ${EAUTO} ]]; then
-                               install -d "${EAUTO}" || eerror "Could not 
create eselect modules dir"
-                       fi
-                       einfo "Creating alternatives eselect module for ${alt}"
-                       cat > "${EAUTO}/${alt}.eselect" <<- EOF
-                               # This module was automatically generated by 
alternatives-2.eclass
-                               DESCRIPTION="Alternatives for ${alt}"
-                               VERSION="${module_version}"
-                               MAINTAINER="[email protected]"
-                               ESELECT_MODULE_GROUP="Alternatives"
-
-                               ALTERNATIVE="${alt}"
-
-                               inherit alternatives
-                       EOF
+       local alt
+
+       for alt in ${ALTERNATIVES_CREATED[@]}; do
+               if ! eselect ${alt} show > /dev/null; then
+                       einfo "Creating Alternative for ${alt}"
+                       eselect alternatives create ${alt}
                fi
 
                # Set alternative provider if there is no valid provider 
selected
@@ -211,25 +118,20 @@ alternatives-2_pkg_postinst() {
 alternatives-2_pkg_prerm() {
        debug-print-function ${FUNCNAME} "${@}"
 
-       local a alt provider ignore ret
-       local EAUTO="${EROOT%/}/usr/share/eselect/modules/auto"
+       local alt ret
 
        # If we are uninstalling, update alternatives to valid provider
        [[ -n ${REPLACED_BY_VERSION} ]] || ignore="--ignore"
-       for a in "${ALTERNATIVES_PROVIDED[@]}"; do
-               alt="${a%:*}"
-               provider="${a#*:}"
+
+       for alt in ${ALTERNATIVES_CREATED[@]}; do
                eselect "${alt}" update ${ignore} "${provider}"
-               ret=$?
-               [[ -n ${REPLACED_BY_VERSION} ]] || \
-                       einfo "Removing ${provider} alternative module for 
${alt}, current is $(eselect ${alt} show)"
+
                case ${ret} in
                        0) : ;;
                        2)
                                # This was last provider for the alternative, 
remove eselect module
                                einfo "Cleaning up unused alternatives module 
for ${alt}"
-                               rm "${EAUTO}/${alt}.eselect" || \
-                                       eerror "rm ${EAUTO}/${alt}.eselect 
failed"
+                               eselect alternatives delete "${alt}" || eerror 
"Failed to remove ${alt}"
                                ;;
                        *)
                                eerror "eselect ${alt} update ${provider} 
returned ${ret}"

Reply via email to