# -*-eselect-*- vim: ft=eselect # Copyright 2014 Gentoo Foundation # Distributed under the terms of the GNU GPL version 2 or later DESCRIPTION="Manage the rust compiler versions" MAINTAINER="jauhien@gentoo.org" VERSION="0.1" inherit package-manager path-manipulation SITELISP=/usr/share/emacs/site-lisp SITEVIM=/usr/share/vim/vimfiles SITEZSH=/usr/share/zsh/site-functions # find a list of installed rust compilers find_targets() { local f local version for f in "${EROOT}"/usr/bin/rustc-*; do version="" [[ -x ${f} ]] && version=`basename "${f}" | awk -F"-" '{ print $2 }'` has_version "=dev-lang/rust-${version}" && echo ${version} done } # remove symlink if exists remove_symlink() { local symlink=$1 if [[ -L ${symlink} ]]; then # existing symlink rm ${symlink} || die -q "Couldn't remove existing symlink ${symlink}" elif [[ -e ${symlink} ]]; then # we have something strange die -q "${symlink} exists but is not a symlink" fi } # Regenerate the site-gentoo.el file, based on packages' site # initialisation files in the /usr/share/emacs/site-lisp/site-gentoo.d/ # directory. # A slightly changed function from elisp-common.eclass elisp-site-regen() { local sitelisp=${EROOT}${SITELISP} local sf i ret=0 null="" page=$'\f' local -a sflist local T=${EROOT}/tmp/eselect mkdir -p "${T}" || die -q "temporary directory creation failed for ${T}" [[ -d ${sitelisp} ]] \ || die -q "elisp-site-regen: Directory ${sitelisp} does not exist" [[ -d ${T} ]] \ || die -q "elisp-site-regen: Temporary directory ${T} does not exist" for sf in "${sitelisp}"/site-gentoo.d/[0-9][0-9]*.el; do [[ -r ${sf} ]] && sflist+=("${sf}") done cat <<-EOF >"${T}"/site-gentoo.el || ret=$? ;;; site-gentoo.el --- site initialisation for Gentoo-installed packages ;;; Commentary: ;; Automatically generated by eselect-rust ;; DO NOT EDIT THIS FILE ;;; Code: EOF # Use sed instead of cat here, since files may miss a trailing newline. sed '$q' "${sflist[@]}" >"${T}"/site-gentoo.el || ret=$? cat <<-EOF >>"${T}"/site-gentoo.el || ret=$? ${page} (provide 'site-gentoo) ;; Local ${null}Variables: ;; no-byte-compile: t ;; buffer-read-only: t ;; End: ;;; site-gentoo.el ends here EOF if [[ ${ret} -ne 0 ]]; then die -q "elisp-site-regen: Writing site-gentoo.el failed." else mv "${T}"/site-gentoo.el "${sitelisp}"/site-gentoo.el || \ die -q "elisp-site-regen: Replacing site-gentoo.el failed" fi rm -rf "${T}" true } # set symlink if source exists set_symlink() { local source=$1 local dest=$2 if [[ -e ${source} ]]; then mkdir -p "$(dirname ${dest})" || die -q "directory creation failed for $(dirname ${dest})" ln -s "${source}" "${dest}" || die -q "${dest} symlink setting failed" else false fi } # unset the rust version unset_version() { remove_symlink "${EROOT}"/usr/bin/rustc remove_symlink "${EROOT}"/usr/bin/rustdoc remove_symlink "${EROOT}/${SITELISP}"/rust-mode remove_symlink "${EROOT}/${SITELISP}"/site-gentoo.d/50rust-mode-gentoo.el for i in after/syntax autoload ftdetect ftplugin indent plugin syntax; do remove_symlink "${EROOT}/${SITEVIM}/${i}/rust.vim" done for i in compiler syntax_checkers/rust; do remove_symlink "${EROOT}/${SITEVIM}/${i}/rustc.vim" done remove_symlink "${EROOT}/${SITEVIM}/doc/rust.txt" remove_symlink "${EROOT}/${SITEZSH}/_rust" } # set the rust version set_version() { local target=$1 if is_number "${target}"; then local targets=( $(find_targets) ) target=${targets[target-1]} fi [[ -z ${target} || ! -x "${EROOT}/usr/bin/rustc-${target}" ]] \ && die -q "Target \"$1\" doesn't appear to be valid!" unset_version ln -s "${EROOT}/usr/bin/rustc-${target}" "${EROOT}/usr/bin/rustc" || die -q "rustc symlink setting failed" ln -s "${EROOT}/usr/bin/rustdoc-${target}" "${EROOT}/usr/bin/rustdoc" || die -q "rustdoc symlink setting failed" local datadir="${EROOT}/usr/share/rust-${target}" set_symlink "${datadir}/emacs/site-lisp/rust-mode" "${EROOT}/${SITELISP}/rust-mode" && \ set_symlink "${datadir}/emacs/site-lisp/site-gentoo.d/50rust-mode-gentoo.el" \ "${EROOT}/${SITELISP}/site-gentoo.d/50rust-mode-gentoo.el" && \ elisp-site-regen local rustvimdir="${datadir}/vim/vimfiles" for i in after/syntax autoload ftdetect ftplugin indent plugin syntax; do set_symlink "${rustvimdir}/${i}/rust.vim" "${EROOT}/${SITEVIM}/${i}/rust.vim" done for i in compiler syntax_checkers/rust; do set_symlink "${rustvimdir}/${i}/rustc.vim" "${EROOT}/${SITEVIM}/${i}/rustc.vim" done set_symlink "${rustvimdir}/doc/rust.txt" "${EROOT}/${SITEVIM}/doc/rust.txt" set_symlink "${datadir}/zsh/site-functions/_rust" "${EROOT}/${SITEZSH}/_rust" true } ### list action ### describe_list() { echo "List available rust versions" } do_list() { local i targets=( $(find_targets) ) write_list_start "Available rust versions:" for (( i = 0; i < ${#targets[@]}; i++ )); do # highlight the target where the symlink is pointing to [[ rustc-${targets[i]} = \ $(basename "$(canonicalise "${EROOT}/usr/bin/rustc")") ]] \ && targets[i]=$(highlight_marker "${targets[i]}") done write_numbered_list -m "(none found)" "${targets[@]}" } ### set action ### describe_set() { echo "Set active rust version" } describe_set_parameters() { echo "" } describe_set_options() { echo "target : Target number (from 'list' action)" } do_set() { [[ -z $1 ]] && die -q "You didn't tell me what to set the version to" [[ $# -gt 1 ]] && die -q "Too many parameters" set_version "$1" || die -q "Couldn't set new active version" } ### update action ### describe_update() { echo "Switch to the most recent rust compiler" } describe_update_options() { echo "--if-unset : Do not override existing implementation" } do_update() { local if_unset="0" while [[ $# > 0 ]]; do case "$1" in --if-unset) if_unset="1" ;; *) die -q "Unrecognized argument '$1'" ;; esac shift done if [[ "${if_unset}" == "1" && -f "${EROOT}"/usr/bin/rustc ]]; then return fi local targets=( $(find_targets) ) do_set ${#targets[@]} } ### unset action ### describe_unset() { echo "Unset active rust version" } do_unset() { [[ $# -gt 0 ]] && die -q "Too many parameters" unset_version || die -q "Couldn't unset active version" }