# -*-eselect-*- vim: ft=eselect
# Copyright (c) 2005-2020 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 .
# 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 (with or without
# full pathname), e.g., "nano 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 file in EDITOR_PATH
find_in_path() {
local file=$1
# do we already have an absolute path?
if [[ ${file} == /* ]]; then
[[ -f ${ROOT}${file} ]]
return
fi
# try to find it
local IFS=:
for dir in ${EDITOR_PATH-/bin:/usr/bin}; do
[[ -f ${EROOT}${dir}/${file} ]] && return 0
done
return 1
}
# find a list of valid targets
find_targets() {
local cur i file
for i in ${EDITOR_LIST}; do
file=${i#*:}
[[ ${file} == /* ]] && file=${EPREFIX}${file}
if find_in_path "${file}"; then
[[ ${i} == *:* ]] && echo "${i%%:*}" || echo "${file}"
fi
done
# also output the current value if it isn't in our list
cur=$(read_env_value)
[[ -n ${cur} && ${EDITOR_LIST} != *:* ]] \
&& ! has "${cur#${EPREFIX}}" ${EDITOR_LIST} \
&& find_in_path "${cur}" \
&& 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
# 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
# target is valid if it's a path to an existing binary
find_in_path "${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
if [[ ${ROOT:-/} = / ]]; then
echo "Run \". ${EROOT}/etc/profile\" to update the variable" \
"in your shell."
fi
}
### 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
}