# -*-eselect-*- vim: ft=eselect
# Copyright (c) 2005-2013 Gentoo Foundation
#
# 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 .
# This library is for managing environment variables like EDITOR or PAGER.
# To use it, you must set the following variables:
#
# EDITOR_VAR is the name of the environment variable, e.g. "EDITOR".
# EDITOR_ENVFILE is the path to the config file where the variable should be
# stored, e.g. "/etc/env.d/99editor". Several modules may share the same file.
# EDITOR_LIST is a space-separated list of available programs (full pathnames)
# e.g. "/bin/nano /usr/bin/emacs /usr/bin/vi". Alternatively, items can be of
# the form "name:/path/to/binary".
# EDITOR_PATH (optional) is a colon-separated list of directories where to
# search for available programs. Default is "/bin:/usr/bin".
inherit config
# find a list of valid targets
find_targets() {
local cur i
for i in ${EDITOR_LIST}; do
[[ -f ${EROOT}${i#*:} ]] && echo "${EPREFIX}${i%%:*}"
done
# also output the current value if it isn't in our list
cur=$(read_env_value)
[[ -n ${cur} && ${EDITOR_LIST} != *:* && -f ${ROOT}${cur} ]] \
&& ! has "${cur#${EPREFIX}}" ${EDITOR_LIST} \
&& echo "${cur}"
}
# read variable value from config file
read_env_value() {
load_config "${EROOT}${EDITOR_ENVFILE}" "${EDITOR_VAR}"
}
# write variable to config file
write_env_value() {
[[ -w ${EROOT}${EDITOR_ENVFILE%/*} ]] \
|| die -q "You need root privileges!"
store_config "${EROOT}${EDITOR_ENVFILE}" "${EDITOR_VAR}" "$1"
}
### show action ###
describe_show() {
echo "Show value of the ${EDITOR_VAR} variable in profile"
}
do_show() {
[[ $# -gt 0 ]] && die -q "Too many parameters"
local cur=$(read_env_value)
write_list_start "${EDITOR_VAR} variable in profile:"
write_kv_list_entry "${cur:-(none)}"
}
### list action ###
describe_list() {
echo "List available targets for the ${EDITOR_VAR} variable"
}
do_list() {
[[ $# -gt 0 ]] && die -q "Too many parameters"
local cur targets i
cur=$(read_env_value)
targets=( $(find_targets) )
write_list_start "Available targets for the ${EDITOR_VAR} variable:"
for (( i = 0; i < ${#targets[@]}; i = i + 1 )); do
targets[i]=${targets[i]%%:*}
# display a star to indicate the currently chosen version
[[ ${targets[i]} = "${cur}" ]] \
&& targets[i]=$(highlight_marker "${targets[i]}")
done
write_numbered_list "${targets[@]}"
if is_output_mode brief; then
:
elif [[ ${EDITOR_LIST} != *:* ]]; then
write_numbered_list_entry " " "(free form)"
elif [[ ${#targets[@]} -eq 0 ]]; then
write_kv_list_entry "(none found)" ""
fi
}
### set action ###
describe_set() {
echo "Set the ${EDITOR_VAR} variable in profile"
}
describe_set_options() {
echo "target : Target name or number (from 'list' action)"
}
describe_set_parameters() {
echo ""
}
do_set() {
[[ -z $1 ]] && die -q "You didn't tell me what to set the variable to"
[[ $# -gt 1 ]] && die -q "Too many parameters"
local target=$1 targets=() dir ifs_save=${IFS-$' \t\n'}
# target may be specified by its name or its index
if is_number "${target}"; then
targets=( $(find_targets) )
[[ ${target} -ge 1 && ${target} -le ${#targets[@]} ]] \
|| die -q "Number out of range: $1"
target=${targets[target-1]%%:*}
fi
if [[ ${EDITOR_LIST} != *:* ]]; then
# is the target an absolute path? if not, try to find it
if [[ ${target} != /* ]]; then
IFS=:
for dir in ${EDITOR_PATH-/bin:/usr/bin}; do
[[ -f ${EROOT}${dir}/${target} ]] || continue
target=${EPREFIX}${dir}/${target}
break
done
IFS=${ifs_save}
fi
# target is valid if it's a path to an existing binary
[[ ${target} == /* && -f ${ROOT}${target} ]] \
|| die -q "Target \"${target}\" doesn't appear to be valid!"
else
# target is valid only if it's in our list
[[ ${#targets[@]} -gt 0 ]] || targets=( $(find_targets) )
has "${target}" "${targets[@]%%:*}" \
|| die -q "Target \"${target}\" doesn't appear to be valid!"
fi
echo "Setting ${EDITOR_VAR} to ${target} ..."
write_env_value "${target}"
# update profile
do_action env update noldconfig
[[ ${ROOT:-/} = / ]] && echo \
"Run \". ${EROOT}/etc/profile\" to update the variable in your shell."
}
### update action ###
describe_update() {
echo "Update the ${EDITOR_VAR} variable if it is unset or invalid"
}
do_update() {
[[ $# -gt 0 ]] && die -q "Too many parameters"
local cur targets
cur=$(read_env_value)
[[ ${EDITOR_LIST} != *:* && ${cur} == /* && -f ${ROOT}${cur} ]] && return
targets=( $(find_targets) )
[[ ${#targets[@]} -gt 0 ]] \
|| die -q "No valid target for ${EDITOR_VAR} found"
has "${cur}" "${targets[@]%%:*}" && return
echo "Setting ${EDITOR_VAR} to ${targets[0]%%:*} ..."
write_env_value "${targets[0]%%:*}"
do_action env update noldconfig
}