#!/bin/bash - # # defeature - disable a FEATURE on a per-package basis. # # source /usr/lib/portage/bin/isolated-functions.sh defeature() { if [[ ! -w /etc/portage ]]; then echo eerror "You don't have write permissions for /etc/portage." echo exit 1 fi local opt overwrite while getopts o opt; do case ${opt} in o) overwrite="true" ;; '?') print_usage ;; esac done shift $((OPTIND - 1)) [[ $# -lt 2 ]] && print_usage local pkgcat pkgname pkgcat=${!#%%/*} pkgname=${!###/*} if [[ $(equery w =${pkgname} 2>&1 | grep "No masked" ) ]]; then echo eerror "No package found matching \"${pkgname}\"." echo exit 1 fi [[ $pkgcat == $pkgname ]] && pkgcat= if [[ -z ${pkgcat} ]]; then # Need a better way to get category - use app-portage/udept for now # check for ambiguous package names if [[ $(dep -1c ${pkgname} | awk 'END { print NR }') -gt 1 ]]; then echo eerror "Found multiple categories for \"${pkgname}\"." eerror "Please use a fully qualified package name (cat/package)." echo exit 1 fi pkgcat="$(dep -1c ${pkgname})" # strip whitespace pkgcat="${pkgcat// /}" fi [[ ! -d /etc/portage/env/${pkgcat} ]] && mkdir -p /etc/portage/env/${pkgcat} local feathead featloop featlist featheader="FEATURES=\" \${FEATURES}\"" while [[ ${#} -gt 1 ]]; do featlist="${featlist} ${1}" featloop="${featloop}\nFEATURES=\${FEATURES/ ${1}/}" shift done if [[ ${overwrite} ]]; then echo -e "${featheader}${featloop}" > /etc/portage/env/${pkgcat}/${pkgname} else echo -e "${featheader}${featloop}" >> /etc/portage/env/${pkgcat}/${pkgname} fi if [[ $? -eq 0 ]]; then echo einfo "Disabled${featlist} FEATURE(s) for ${pkgcat}/${pkgname}." einfo einfo "To re-enable default behaviour for this package, delete" einfo "/etc/portage/env/${pkgcat}/${pkgname}." echo fi exit 0 } print_usage() { echo eerror "Usage: $(basename $0) [-o] [FEATURE] " eerror eerror " -o overwrite current settings rather than append" echo exit 1 } defeature "$@"