# -*-eselect-*- vim: ft=eselect # Copyright 1999-2010 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Id: profile.eselect 773 2010-07-27 14:25:05Z ulm $ # This is a portage-only module. inherit package-manager DESCRIPTION="Manage the /etc/make.profile symlink" MAINTAINER="eselect@gentoo.org" SVN_DATE='$Date: 2010-07-27 16:25:05 +0200 (Tue, 27 Jul 2010) $' VERSION=$(svn_date_to_version "${SVN_DATE}") ROOT="$(canonicalise "${ROOT}")" # remove the exta slashes if exist ROOT="${ROOT:=/}" EROOT="$(canonicalise "${EROOT}")" # get a list of all overlays PORTDIR_OVERLAY=$(PORTAGE_CONFIGROOT=${ROOT} ROOT=${ROOT} portageq portdir_overlay) echo "PORTDIR_OVERLAY=${PORTDIR_OVERLAY}" find_targets() { local arch p portdir=${1} [[ -n ${portdir} ]] || portdir=$(PORTAGE_CONFIGROOT=${ROOT} portageq portdir) arch=$(arch) [[ -z ${arch} ]] && return 1 sed -rne "s|^${arch}\s+(\S+).*$|\1|p" \ $(echo $PORTDIR_OVERLAY $portdir | \ sed -re 's|(\S+)\s*|\1/profiles/profiles.desc |g') \ 2>/dev/null } # remove make.profile symlink remove_symlink() { rm "${EROOT}/etc/make.profile" } # set the make.profile symlink set_symlink() { local portdir=$(PORTAGE_CONFIGROOT=${ROOT} portageq portdir) target=${1} targets profdir arch parch if [[ -z "${target}" ]] ; then die -q "Target \"${target}\" doesn't appear to be valid!" fi if is_number "${target}" ; then targets=( $(find_targets "${portdir}") ) [[ -z ${targets} ]] && die -q "Failed to get a list of valid profiles" target=${targets[target - 1]} arch=$(arch) fi [[ -z "${arch}" ]] && ( [[ "${2}" != "--force" ]] && arch=$(arch) || arch='\S+' ) profdir=$( grep -lP "${arch}\s+${target}\s+" \ $(echo $portdir $PORTDIR_OVERLAY | sed -re 's|(\S+)\s*|\1/profiles/profiles.desc |g') 2>/dev/null | \ head -n1 | sed -e 's|/profiles/profiles.desc$||' ) if [[ -z "${profdir}" ]]; then [[ "${2}" != "--force" ]] && return 1 die -q "${target} is not a valid profile for ${arch}" fi [[ ! -d "${ROOT}${profdir}/profiles/${target}" ]] && die -q "Target \"${target}\" doesn't appear to be valid!" remove_symlink \ || die -q "Couldn't remove current make.profile symlink" ln -s "$(relative_name "${ROOT}${profdir}/profiles/${target}" "${EROOT}/etc")" "${EROOT}/etc/make.profile" # check if the resulting symlink is sane if [[ $(canonicalise "${EROOT}/etc/make.profile") \ != "$(canonicalise "${EROOT}")"/* ]]; then write_warning_msg \ "Strange path. Check ${EROOT}/etc/make.profile symlink" fi } ### using in show and list action ### get_active() { local portdir=$(PORTAGE_CONFIGROOT=${ROOT} portageq portdir) canonicalise "${EROOT}/etc/make.profile" | \ sed -nre "s:^${ROOT%/}($( echo $portdir $PORTDIR_OVERLAY | sed -re 's/\s+/|/g' ))/profiles/(\S+)$:\2:p" } ### show action ### describe_show() { echo "Show the current make.profile symlink" } do_show() { write_list_start "Current make.profile symlink:" link=$(get_active) write_kv_list_entry "${link:=(unset)}" "" } ### list action ### describe_list() { echo "List available profile symlink targets" } do_list() { local portdir profiledir targets targets=( $(find_targets) ) local active=$(get_active) [[ -z ${targets} ]] && die -q "Failed to get a list of valid profiles" if [[ -n ${targets[@]} ]] ; then local i for (( i = 0 ; i < ${#targets[@]} ; i = i + 1 )) ; do [[ ${targets[i]} == ${active} ]] \ && targets[i]=$(highlight_marker "${targets[i]}") done fi write_list_start "Available profile symlink targets:" write_numbered_list "${targets[@]}" } ### set action ### describe_set() { echo "Set a new profile symlink target" } describe_set_parameters() { echo "" } describe_set_options() { echo "target : Target name or number (from 'list' action)" echo "--force : Forcibly set the symlink" } do_set() { local force if [[ ${1} == "--force" ]] ; then force=${1} shift fi if [[ -z ${1} ]] ; then die -q "You didn't tell me what to set the symlink to" elif [[ -e ${EROOT}/etc/make.profile ]] && [[ ! -L ${EROOT}/etc/make.profile ]] ; then die -q "${EROOT}/etc/make.profile isn't a symlink" else set_symlink "${1}" ${force} || die -q "Couldn't set a new symlink" fi }