aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/rust.eselect')
-rw-r--r--src/modules/rust.eselect202
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"
+}