echo -e "WARNING: ${*}"
}
-# /etc/make.conf can now exist in /etc/portage/make.conf, prefer it over /etc/make.conf for changes
-if [ -e "${ETC}/portage/make.conf" ]; then
+# /etc/make.conf can now exist in /etc/portage/make.conf, prefer it over
+# /etc/make.conf for changes. Since this will only be used for modifying
+# the USE variable, we need to make sure the one we pick is the one with
+# the USE variable defined.
+if [[ -n $(grep '^USE="' "${ETC}/portage/make.conf" 2>/dev/null) ]]; then
MAKE_CONF_PATH="${ETC}/portage/make.conf"
-elif [ -e "${ETC}/make.conf" ]; then
+elif [[ -e "${ETC}/make.conf" ]]; then
MAKE_CONF_PATH="${ETC}/make.conf"
else
fatal "make.conf does not exist"
fi
PACKAGE_USE_PATH=${ETC}/portage/package.use
-[ -z "${MODE}" ] && MODE="showhelp" # available operation modes: showhelp, showversion, showdesc, showflags, modify
+[ -z "${MODE:-}" ] && MODE="showhelp" # available operation modes: showhelp, showversion, showdesc, showflags, modify
parse_arguments() {
if [ -z "${1}" ]; then
-E | --enable) MODE="modify"; ACTION="add";;
-D | --disable) MODE="modify"; ACTION="remove";;
-P | --prune | -R | --remove)
- MODE="modify"; ACTION="prune";;
- -p | --package) MODE="modify"; shift; PACKAGE=${1}; SCOPE="local";;
+ MODE="modify"; ACTION="prune";;
+ -p | --package) MODE="modify"; shift; PACKAGE=${1}; SCOPE="local";;
-*)
echo "ERROR: unknown option ${1} specified."
echo
;;
"%active")
get_portageuseflags
- ARGUMENTS="${ARGUMENTS} ${ACTIVE_FLAGS[9]}"
+ ARGUMENTS="${ARGUMENTS:-} ${ACTIVE_FLAGS[9]}"
;;
*)
- ARGUMENTS="${ARGUMENTS} ${1}"
+ ARGUMENTS="${ARGUMENTS:-} ${1}"
;;
esac
shift
done
[ "${MODE}" == "modify" -a ! -w "${MAKE_CONF_PATH}" ] && fatal ""${MAKE_CONF_PATH}" is not writable"
[ "${MODE}" == "modify" -a -s "${PACKAGE_USE_PATH}" -a ! -w "${PACKAGE_USE_PATH}" ] && fatal ""${PACKAGE_USE_PATH}" is not writable"
+ return 0
} # }}}
showhelp() {
traverse_profile() {
local curdir
local parent
- local rvalue
+ local rvalue=""
curdir="${2:-$(get_real_path ${MAKE_PROFILE_PATH})}"
# Function: get_all_make_defaults {{{
# Det all make.defaults by traversing the cascaded profile directories
get_all_make_defaults() {
- if [[ -z $MAKE_DEFAULTS ]]; then
+ if [[ -z ${MAKE_DEFAULTS:-} ]]; then
MAKE_DEFAULTS=$(traverse_profile "make.defaults")
fi
echo $MAKE_DEFAULTS
# Flag status for package.use and ebuild, slot and version, and overlay
# the version lives is if not PORTDIR
#
-# Full positive would be "[+PB]", full negative would be "[-pb], and full
+# Full positive would be "[+PB]", full negative would be "[-pb]", and full
# missing would be "[? ]", question because the sign will default to the
# sign of the global status of the flag
get_flagstatus_pkg() {
# Outputs:
# Location of portage tree root
get_portdir() {
- if [ -z "${PORTDIR}" ]; then
- use_backup="${USE}"
+ # Use a subshell so we don't have to protect the variables in
+ # the current scope
+ (
+ if [ -z "${PORTDIR:-}" ]; then
source "${MAKE_GLOBALS_PATH}"
for x in $(get_all_make_defaults); do
source "${x}"
for x in $(get_all_make_conf); do
source "${x}"
done
- USE="${use_backup}"
fi
echo "${PORTDIR}"
+ )
} # }}}
# This won't change while the script is running, so cache it
PORTDIR="$(get_portdir)"
# Outputs list of portage overlays as defined in the PORTDIR_OVERLAY
# variable defined in make.conf
get_all_overlays() {
- use_backup="${USE}"
- source "${MAKE_CONF_PATH}"
- USE="${use_backup}"
- echo ${PORTDIR_OVERLAY}
+ # Use a subshell so we don't have to protect the variables in
+ # the current scope
+ (
+ for x in $(get_all_make_conf); do
+ [[ -r "${x}" ]] && source "${x}"
+ done
+ echo ${PORTDIR_OVERLAY}
+ )
} # }}}
ALL_PORTDIRS=( "$PORTDIR" $(get_all_overlays) )
if array_contains "${useflags[*]}" "$1"; then
get_flagstatus "${1}"
# XXX: Handle overlay
- grep "^${1} *-" ${ALL_PORTDIRS[@]/%//profiles/use.desc} 2> /dev/null \
- | sed -re "s/^([^:]+)://"
+ grep -h "^${1} *-" ${ALL_PORTDIRS[@]/%//profiles/use.desc} 2> /dev/null
foundone=1
fi
fi
foundone=1
fi
# Fetch all the packages data using this flag
- infos=$( grep ":${1} *-" ${ALL_PORTDIRS[@]/%//profiles/use.local.desc} 2> /dev/null \
- | sed -re "s/^([^:]+):([^:]+):(${1}) *- *(.+)/\1|\2|\3|\4/g")
+ infos=$( grep -h ":${1} *-" ${ALL_PORTDIRS[@]/%//profiles/use.local.desc} 2> /dev/null \
+ | sed -re "s/^([^:]+):(${1}) *- *(.+)/\1|\2|\3/g")
OIFS=$IFS; IFS=$'\n'; infos=($infos); IFS=$OIFS;
for line in "${infos[@]}"; do
OIFS=$IFS; IFS="|"; line=($line); IFS=$OIFS
- pkg=${line[1]}
- flag=${line[2]}
- desc=${line[3]}
+ pkg=${line[0]}
+ flag=${line[1]}
+ desc=${line[2]}
if get_flagstatus "${flag}"; then
ACTIVE="+"
else
# two small helpers to add or remove a flag from a USE string
add_flag() {
- if [[ -n $(grep " -${1//-/} " <<< " ${ACTIVE_FLAGS[6]} ") ]]; then
- error "Use flag \"${1//-/}\" is masked and should not be added" \
+ # Remove leading '-' from flag if found
+ local flag=$1
+ [[ ${flag:0:1} == "-" ]] && flag=${1:1}
+
+ if [[ -n $(grep " -${flag} " <<< " ${ACTIVE_FLAGS[6]} ") ]]; then
+ error "Use flag \"${flag}\" is masked and should not be added" \
"to make.conf."
return 1
# Bug #104396 -- Only add use flags defined in use.desc and use.local.desc
- elif [[ -z $(grep "^${1//-/}$" <<< "$(get_useflaglist)") ]]; then
- error "Use flag \"${1//-/}\" is not defined in use.desc and should" \
+ elif [[ -z $(grep "^${flag}$" <<< "$(get_useflaglist)") ]]; then
+ error "Use flag \"${flag}\" is not defined in use.desc and should" \
"not be added\nto make.conf."
return 1
else
NEW_MAKE_CONF_USE="${NEW_MAKE_CONF_USE} ${1}"
- echo "Adding flag \"${1}\" to make.conf" >&2
+ echo "Adding flag \"${1}\" to make.conf" >&2
fi
}
elif [[ -n "${PACKAGE}" ]]; then
if [[ -n $(echo "${line}" | grep -Ee "${pkg_re}") ]]; then
# If this is the only (remaining) use flag defined
- # for this package, then remove the whole line
- if [[ -z $(echo "${line}" | \
- grep -Ee "${pkg_re} *-?${flag} *$") ]]; then
+ # for this package, then remove the whole line
+ if [[ -z $(echo "${line}" | grep -Ee "${pkg_re} *-?${flag} *$") ]]; then
# Remove flag from this line
echo "${line}" | sed -re "s/ *-?\b${flag}\b//"
fi
fi
done
+ # Bail if there is no need to modify make.conf
[[ ${make_conf_modified} == 1 ]] || return
# make a backup just in case the user doesn't like the new make.conf
cp -p "${MAKE_CONF_PATH}" "${MAKE_CONF_BACKUP_PATH}"