commit:     c3a91632926bc7b944c9f3ed000e3208b020c241
Author:     Horodniceanu Andrei <a.horodniceanu <AT> proton <DOT> me>
AuthorDate: Wed Jan  3 10:06:25 2024 +0000
Commit:     Horodniceanu Andrei <a.horodniceanu <AT> proton <DOT> me>
CommitDate: Wed Jan  3 19:38:57 2024 +0000
URL:        https://gitweb.gentoo.org/repo/user/dlang.git/commit/?id=c3a91632

app-eselect/eselect-dlang: add 20240103

Additional features:
- symlinks in /usr/include/dlang are properly removed when the last
versions of compilers are uninstalled

Signed-off-by: Horodniceanu Andrei <a.horodniceanu <AT> proton.me>

 .../eselect-dlang/eselect-dlang-20240103.ebuild    |  21 ++
 .../eselect-dlang/files/dlang.eselect-20240103     | 242 +++++++++++++++++++++
 2 files changed, 263 insertions(+)

diff --git a/app-eselect/eselect-dlang/eselect-dlang-20240103.ebuild 
b/app-eselect/eselect-dlang/eselect-dlang-20240103.ebuild
new file mode 100644
index 0000000..8f0a7c4
--- /dev/null
+++ b/app-eselect/eselect-dlang/eselect-dlang-20240103.ebuild
@@ -0,0 +1,21 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DESCRIPTION="Eselect module for management of multiple D versions"
+HOMEPAGE="https://github.com/gentoo/dlang";
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+
+RDEPEND="app-admin/eselect"
+
+S="${FILESDIR}"
+
+src_install() {
+       insinto /usr/share/eselect/modules
+       newins dlang.eselect-${PV} dlang.eselect
+       keepdir /usr/include/dlang
+}

diff --git a/app-eselect/eselect-dlang/files/dlang.eselect-20240103 
b/app-eselect/eselect-dlang/files/dlang.eselect-20240103
new file mode 100644
index 0000000..da9ecf0
--- /dev/null
+++ b/app-eselect/eselect-dlang/files/dlang.eselect-20240103
@@ -0,0 +1,242 @@
+# -*-eselect-*-  vim: ft=eselect
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+inherit config
+
+DESCRIPTION="Manage D symlinks"
+MAINTAINER="marco.le...@gmx.de"
+VERSION="20240103"
+
+ETC_PATH="${EROOT}/etc"
+COMPILER_PATH="${EROOT}/usr/bin"
+MAN1_PATH="${EROOT}/usr/share/man/man1"
+MAN5_PATH="${EROOT}/usr/share/man/man5"
+INC_PATH="${EROOT}/usr/include/dlang"
+CONFIG_FILE="${EROOT}/var/lib/dlang"
+declare -A COMPILER_NAMES=([dmd]="Digital Mars D (dmd)"
+                           [ldc2]="LLVM D2 (ldc2)")
+
+
+### list action ###
+
+describe_list() {
+       echo "List installed D compilers by vendor (or all installed compilers)"
+}
+
+describe_list_options() {
+       for compiler in ${!COMPILER_NAMES[@]}; do
+               printf "% -11s : List installed %s compilers\n" $compiler 
"${COMPILER_NAMES[$compiler]}"
+       done
+}
+
+describe_list_parameters() {
+       echo "[<vendor>]"
+}
+
+do_list() {
+       [[ $# -eq 1 ]] && has "$1" ${!COMPILER_NAMES[@]} || [[ $# -eq 0 ]] \
+               || die -q "Syntax: eselect dlang list [$(compiler_options)]"
+
+       for compiler in ${!COMPILER_NAMES[@]}; do
+               if [[ $# -eq 0 ]] || [[ $compiler == $1 ]]; then
+                       write_list_start "Available 
${COMPILER_NAMES[$compiler]} compilers:"
+                       local targets=($(find_targets $compiler))
+                       local active="$(do_show $compiler)"
+                       local mode="$(load_config "$CONFIG_FILE" $compiler)"
+                       for ((i = 0; i < ${#targets[@]}; i++)); do
+                               if [[ "${targets[$i]}" == "$active" ]]; then
+                                       if [[ "${mode:-auto}" == "auto" ]]; then
+                                               targets[$i]="$(highlight_marker 
"${targets[$i]}" auto)"
+                                       else
+                                               targets[$i]="$(highlight_marker 
"${targets[$i]}" manual)"
+                                       fi
+                               fi
+                       done
+                       write_numbered_list -m "(none found)" "${targets[@]}"
+                       echo
+               fi
+       done
+}
+
+
+### set action ###
+
+describe_set() {
+       echo "Set active version of D compilers"
+}
+
+describe_set_options() {
+       for compiler in ${!COMPILER_NAMES[@]}; do
+               printf "% -11s : Set active %s compiler\n" $compiler 
"${COMPILER_NAMES[$compiler]}"
+       done
+}
+
+describe_set_parameters() {
+       echo "<vendor>"
+}
+
+do_set() {
+       [[ $# -eq 2 ]] && has "$1" ${!COMPILER_NAMES[@]} \
+               || die -q "2 arguments required: eselect dlang set 
$(compiler_options) <version|index|\"auto\">"
+
+       local targets=($(find_targets $1))
+       local target="$2"
+       if [[ "$target" == "auto" ]]; then
+               local autoTarget="${targets[$((${#targets[@]} - 1))]}"
+               if [[ -n "${targets[$(($target - 1))]}" ]]; then
+                       target="$autoTarget"
+               fi
+       elif is_number "$2" && [[ $2 -ge 1 ]]; then
+               local idxToTarget="${targets[$(($target - 1))]}"
+               if [[ -n "${targets[$(($target - 1))]}" ]]; then
+                       target="$idxToTarget"
+               fi
+       fi
+
+       has "$target" "${targets[@]}" || die -q "Invalid or unavailable target"
+       if [[ "$2" == "auto" ]]; then
+               echo -n "Switching $1 to always latest version, currently 
$target..."
+       else
+               echo -n "Switching $1 to $target..."
+       fi
+
+       case $1 in
+               dmd)
+                       symlink_helper "${EROOT}/usr/lib/dmd/${target}/bin/dmd" 
     "${COMPILER_PATH}/dmd"
+                       symlink_helper 
"${EROOT}/usr/lib/dmd/${target}/bin/dmd.conf" "${ETC_PATH}/dmd.conf"
+                       symlink_helper "${EROOT}/usr/lib/dmd/${target}/import"  
     "${INC_PATH}/dmd"
+                       [[ -d ${MAN1_PATH} ]] && symlink_helper 
"/usr/lib/dmd/${target}/man/man1/dmd.1"      "${MAN1_PATH}/dmd.1"
+                       [[ -d ${MAN5_PATH} ]] && symlink_helper 
"/usr/lib/dmd/${target}/man/man5/dmd.conf.5" "${MAN5_PATH}/dmd.conf.5"
+                       ;;
+               ldc2)
+                       symlink_helper 
"${EROOT}/usr/lib/ldc2/${target}/bin/ldc2"  "${COMPILER_PATH}/ldc2"
+                       symlink_helper 
"${EROOT}/usr/lib/ldc2/${target}/bin/ldmd2" "${COMPILER_PATH}/ldmd2"
+                       symlink_helper 
"${EROOT}/usr/lib/ldc2/${target}/include/d" "${INC_PATH}/ldc"
+                       ;;
+       esac
+       store_config "$CONFIG_FILE" $1 "$2"
+
+       echo " done"
+}
+
+
+### show action ###
+
+describe_show() {
+       echo "Show active D compiler by vendor"
+}
+
+describe_show_options() {
+       for compiler in ${!COMPILER_NAMES[@]}; do
+               printf "% -11s : Show active %s compiler\n" $compiler 
"${COMPILER_NAMES[$compiler]}"
+       done
+}
+
+describe_show_parameters() {
+       echo "<vendor>"
+}
+
+do_show() {
+       [[ $# -eq 1 ]] && has "$1" ${!COMPILER_NAMES[@]} \
+               || die -q "1 argument required: eselect dlang show 
$(compiler_options)"
+
+       local interpreter="$(readlink "${COMPILER_PATH}/$1" | sed -r 
"s#^/usr/lib(32|64)?/$1/##;s#/bin/$1\$##")"
+       [[ -n "$interpreter" ]] && echo "$interpreter"
+}
+
+
+### update action ###
+
+describe_update() {
+       echo "Update active D compilers to the latest installed version in 
absense of a manually set version"
+}
+
+describe_update_options() {
+       for compiler in ${!COMPILER_NAMES[@]}; do
+               printf "% -11s : Update active %s compiler\n" $compiler 
"${COMPILER_NAMES[$compiler]}"
+       done
+}
+
+describe_update_parameters() {
+       echo "<vendor>"
+}
+
+do_update() {
+       [[ $# -eq 1 ]] && has "$1" ${!COMPILER_NAMES[@]} \
+               || die -q "1 argument required: eselect dlang update 
$(compiler_options)"
+
+       local targets=($(find_targets $1))
+       if [[ ${#targets[@]} -eq 0 ]]; then
+               # No compiler avalable, remove symlinks
+               echo "No installed ${COMPILER_NAMES[$1]} compilers. Removing 
any existing symlinks."
+               case $1 in
+                       # Keep this in sync with `do_set`
+                       dmd)
+                               rm -f "${COMPILER_PATH}/dmd"
+                               rm -f "${ETC_PATH}/dmd.conf"
+                               rm -f "${INC_PATH}/dmd"
+                               rm -f "${MAN1_PATH}/dmd.1"
+                               rm -f "${MAN5_PATH}/dmd.conf.5"
+                               ;;
+                       ldc2)
+                               rm -f "${COMPILER_PATH}/ldc2"
+                               rm -f "${COMPILER_PATH}/ldmd2"
+                               rm -f "${INC_PATH}/ldc"
+                               ;;
+               esac
+       else
+               # Check if the active compiler is actually available, update 
otherwise
+               local compiler=$1
+               local active="$(do_show $compiler)"
+               local latest="${targets[$((${#targets[@]} - 1))]}"
+               local mode="$(load_config "$CONFIG_FILE" $compiler)"
+               if [[ "$active" == "" ]]; then
+                       # First installation of a compiler
+                       do_set $compiler auto
+               elif ! has "$active" "${targets[@]}"; then
+                       # Active compiler is no longer valid (uninstalled), 
switch to "auto"
+                       echo "Switching $1 from uninstalled version '$active' 
to '$latest'"
+                       do_set $compiler auto
+               elif [[ "${mode:-auto}" == "auto" ]] && [[ "$active" != 
"$latest" ]]; then
+                       # Active compiler was set to auto and we have a more 
recent version
+                       echo "Updating active $1 version from '$active' to 
'$latest'"
+                       do_set $compiler auto
+               fi
+       fi
+}
+
+
+### helper functions ###
+
+# Find a list of D versions
+find_targets() {
+       case "$1" in
+               dmd)
+                       ls /usr/lib/dmd/?.???/bin/dmd 2> /dev/null | sed 
"s#^/usr/lib/dmd/##;s#/.*##"
+                       ;;
+               ldc2)
+                       ls -v /usr/lib/ldc2/?.*/bin/ldc2 2> /dev/null | sed 
"s#^/usr/lib/ldc2/##;s#/.*##"
+                       ;;
+               *)
+                       die "Unknown compiler '$1'"
+       esac
+}
+
+# Creates a symlink or prints a message and quits on error
+symlink_helper() {
+       local link="$(canonicalise "$1")"
+       ln -nfs "$link" "$2" || die -q "Couldn't symlink '$link' as '$2'!"
+}
+
+# Prints compilers as argument options <comp1|comp2|...>
+compiler_options() {
+       local additional=0
+       echo -n "<"
+       for compiler in ${!COMPILER_NAMES[@]}; do
+               [[ $additional -eq 1 ]] && echo -n "|"
+               echo -n $compiler
+               additional=1
+       done
+       echo -n ">"
+}

Reply via email to