From d48d1c9525f6632e9ba58202e028bb517b0a118c Mon Sep 17 00:00:00 2001 From: Paul Varner Date: Mon, 28 Mar 2011 21:12:44 -0500 Subject: [PATCH] Latest euse changes from Jared Hancock Prefers /etc/portage/make.conf when modifing global flags only if it defines the USE variable Also fixes a bug where euse would refuse to add hyphenated use flags. So you can: euse -E bash-completion --- bin/euse | 79 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/bin/euse b/bin/euse index dbbb129..8262271 100755 --- a/bin/euse +++ b/bin/euse @@ -29,10 +29,13 @@ warn() { 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" @@ -56,7 +59,7 @@ else 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 @@ -74,8 +77,8 @@ parse_arguments() { -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 @@ -83,10 +86,10 @@ parse_arguments() { ;; "%active") get_portageuseflags - ARGUMENTS="${ARGUMENTS} ${ACTIVE_FLAGS[9]}" + ARGUMENTS="${ARGUMENTS:-} ${ACTIVE_FLAGS[9]}" ;; *) - ARGUMENTS="${ARGUMENTS} ${1}" + ARGUMENTS="${ARGUMENTS:-} ${1}" ;; esac shift @@ -128,6 +131,7 @@ check_sanity() { 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() { @@ -435,7 +439,7 @@ get_all_make_conf() { traverse_profile() { local curdir local parent - local rvalue + local rvalue="" curdir="${2:-$(get_real_path ${MAKE_PROFILE_PATH})}" @@ -458,7 +462,7 @@ traverse_profile() { # 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 @@ -606,7 +610,7 @@ get_flagstatus() { # 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() { @@ -671,8 +675,10 @@ 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}" @@ -680,9 +686,9 @@ get_portdir() { 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)" @@ -691,10 +697,14 @@ 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) ) @@ -761,8 +771,7 @@ showdesc() { 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 @@ -773,14 +782,14 @@ showdesc() { 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 @@ -925,18 +934,22 @@ showflags() { # 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 } @@ -981,9 +994,8 @@ scrub_use_flag() { 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 @@ -1231,6 +1243,7 @@ modify() { 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}" -- 2.26.2