diff options
Diffstat (limited to 'src/modules/rust.eselect')
-rw-r--r-- | src/modules/rust.eselect | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/src/modules/rust.eselect b/src/modules/rust.eselect new file mode 100644 index 0000000..2aa63a7 --- /dev/null +++ b/src/modules/rust.eselect @@ -0,0 +1,202 @@ +# -*-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[@]}" </dev/null >>"${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 +} + +# 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!" + + local datadir="${EROOT}/usr/share/rust-${target}" + + 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" + + 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" + + 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 "<target>" +} + +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" +} |