#!@EPREFIX@/bin/bash
# -*-eselect-*- vim: ft=eselect
# Copyright (c) 2005-2023 Gentoo Authors
#
# This file is part of the 'eselect' tools framework.
#
# eselect is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 2 of the License, or (at your option) any later
# version.
#
# eselect is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# eselect. If not, see .
# Where are our data?
ESELECT_DATA_PATH="@DATADIR@/eselect"
# Where are modules installed by default?
ESELECT_DEFAULT_MODULES_PATH="${ESELECT_DATA_PATH}/modules"
# Look in these places for modules
ESELECT_MODULES_PATH=( \
"${HOME}/.eselect/modules" \
"${ESELECT_DEFAULT_MODULES_PATH}" )
# Look in this place for libraries
ESELECT_CORE_PATH="${ESELECT_DATA_PATH}/libs"
# Look here for the default contents of a module
ESELECT_DEFAULT_ACTIONS="${ESELECT_CORE_PATH}/default.eselect"
# Our program name and version
ESELECT_PROGRAM_NAME="eselect"
ESELECT_VERSION="@VERSION@"
# Invocation information
ESELECT_BINARY_NAME="$0"
ESELECT_KILL_TARGET="$$"
# Support variables for Gentoo Prefix. BROOT is hardcoded as the
# prefix for the build host. EPREFIX defaults to the same, but can be
# overridden at runtime when building for a different prefix.
BROOT="@EPREFIX@"
: "${EPREFIX="${BROOT}"}"
EROOT="${ROOT%${EPREFIX:+/}}${EPREFIX}"
# Remove all alias definitions. Unset functions and variables that are
# known to cause trouble.
"unalias" -a
unset -f rm
unset CDPATH GLOBIGNORE
shopt -s extglob
shopt -s expand_aliases
umask +rx
# Sanitise PATH: We don't want to execute Portage's internal helpers
# if we're called from an ebuild.
IFS=:
# Append ${IFS} to prevent any trailing empty field from being dropped
set -f; path=(${PATH}${IFS}); set +f
for i in "${!path[@]}"; do
[[ ${path[i]} == */portage?(/*)/ebuild-helpers?(/*) ]] && unset "path[i]"
done
PATH="${path[*]}"
unset i path
IFS=$' \t\n'
# Save stderr file descriptor
if (( BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 1 || BASH_VERSINFO[0] > 4 ))
then
exec {ESELECT_STDERR}>&2 # >=bash-4.1
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
# Sneaky trick to make die in subshells work. If you don't get
# it, don't ask...
trap 'exit 250' 15
# es_do_usage
# Display eselect usage
es_do_usage() {
echo "Usage: eselect "
}
# es_do_help
# Display eselect help
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=" \
"Enable or disable colour output (default 'auto')"
write_kv_list_entry "--eprefix=" \
"Override the EPREFIX variable for a cross-prefix build"
write_kv_list_entry "--root=" \
"The target root path for eselect's operations"
echo
# display all available eselect modules
do_action modules list
}
# es_do_version
# Display eselect version
es_do_version() {
echo "eselect ${ESELECT_VERSION}"
echo
echo "Copyright (c) 2005-2023 Gentoo Authors."
echo "Distributed under the terms of the GNU GPL version 2 or later."
}
### main code ###
# figure out what the action is. we need to know whether we're
# invoked as a something-config/something-update.
action=""
for suffix in config update{,r} tool manager reader; do
if [[ ${0%%-${suffix}} != "$0" ]]; then
action=$(basename "$0")
action=${action%%-${suffix}}
break
fi
done
unset suffix
if [[ -z ${action} ]]; then
binname=$(basename "$0")
for prefix in config update{,r} manage 'read'; do
if [[ ${binname##${prefix}-} != "${binname}" ]]; then
action=$(basename "$0")
action=${action##${prefix}-}
break
fi
done
unset binname prefix
fi
# parse global options
colour=""
while [[ ${1##--} != "$1" ]]; do
case ${1##--} in
brief)
set_output_mode brief
;;
colour=*|color=*|colour|color)
# accept all arguments that are valid for ls or emerge
case ${1#*=} in
yes|y|always|force|"$1") colour=yes ;;
no|n|never|none) colour=no ;;
auto|tty|if-tty) colour="" ;;
*) die -q "Invalid argument for ${1%%=*} option" ;;
esac
;;
help|version)
[[ -z ${action} ]] || die -q "Too many parameters"
action=${1##--}
;;
eprefix=*|eprefix)
[[ ${1#*=} == "$1" ]] && die -q "Option $1 requires an argument"
# set EPREFIX and recalculate EROOT
EPREFIX=${1#*=}
EROOT="${ROOT%${EPREFIX:+/}}${EPREFIX}"
;;
root=*|root)
[[ ${1#*=} == "$1" ]] && die -q "Option $1 requires an argument"
# set ROOT and recalculate EROOT
ROOT=${1#*=}
EROOT="${ROOT%${EPREFIX:+/}}${EPREFIX}"
;;
"")
# -- indicates end of options
shift
break
;;
*)
die -q "Unknown option $1"
;;
esac
shift
done
if [[ -z ${action} && $# -gt 0 ]]; then
action=$1
shift
fi
# enable colour output and get width of terminal iff stdout is a tty
if [[ -t 1 ]]; then
# command line option overrides NO_COLOR variable
[[ -z ${colour} && -n ${NO_COLOR} ]] && colour=no
colours ${colour:-yes}
init_columns
else
colours ${colour:-no}
fi
unset colour
if [[ -n ${action} ]]; then
if is_function "es_do_${action}"; then
[[ $# -eq 0 ]] || die -q "Too many parameters"
es_do_${action}
else
do_action "${action}" "$@"
fi
else
es_do_help
fi