# -*-eselect-*- vim: ft=eselect # Copyright 2022-2025 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 DESCRIPTION="Manage Zig versions" MAINTAINER="bratishkaerik@landless-city.net" VERSION="2" show_selected_target() { readlink "${EROOT}/usr/bin/zig" } find_targets() { local f name for f in "${EROOT}"/usr/bin/zig-*; do name="$(basename "${f}")" [[ "${name}" =~ ^zig(-bin)?-[[:digit:]] ]] || continue [[ -x "${f}" ]] || continue echo "${name}" done } remove_symlinks() { rm "${EROOT}/usr/bin/zig" } set_symlinks() { local target="${1}" if is_number "${target}"; then local targets=( $(find_targets) ) target="${targets[target - 1]}" fi [[ -z "${target}" || ! -x "${EROOT}/usr/bin/${target}" ]] && die -q "Target \"${1}\" doesn't appear to be valid!" ln -s "${target}" "${EROOT}/usr/bin/zig" } ### show action ### describe_show() { echo "Show current Zig version" } do_show() { write_list_start "Current Zig version:" if [[ -L "${EROOT}/usr/bin/zig" ]]; then write_kv_list_entry "$(show_selected_target)" "" else write_kv_list_entry "(unset)" "" fi } ### list action ### describe_list() { echo "List available Zig versions" } do_list() { local targets=( $(find_targets) ) local selected_target selected_target=$(show_selected_target) write_list_start "Available Zig versions:" for ((i = 0; i < ${#targets[@]}; i++)); do [[ "${targets[i]}" == "${selected_target}" ]] && targets[i]="$(highlight_marker "${targets[i]}")" done write_numbered_list -m "(none found)" "${targets[@]}" } ### set action ### describe_set() { echo "Set active Zig version" } describe_set_parameters() { echo "" } describe_set_options() { echo "target: Target name or number (from 'list' action)" } do_set() { [[ -z "${1}" ]] && die -q "You need to specify a target" [[ ${#} -gt 1 ]] && die -q "Too many parameters" test_usr_bin_writeable if [[ -L "${EROOT}/usr/bin/zig" ]]; then remove_symlinks || die -q "Couldn't remove symlink" fi set_symlinks "${1}" || die -q "Couldn't set a new symlink" } ### update action ### describe_update() { echo "Automatically update the zig symlink" } describe_update_options() { echo "ifunset: Do not override currently set version" } do_update() { [[ -z "${1}" || "${1}" == ifunset ]] || die -q "Usage error" [[ ${#} -gt 1 ]] && die -q "Too many parameters" test_usr_bin_writeable if [[ -L "${EROOT}/usr/bin/zig" ]]; then if [[ "${1}" == ifunset && -e "${EROOT}/usr/bin/zig" ]]; then return fi remove_symlinks elif [[ -e "${EROOT}/usr/bin/zig" ]]; then die -q "\"${EROOT}/usr/bin/zig\" exists but is not a symlink" fi local targets=( $(find_targets) ) if [[ ${#targets[@]} -gt 0 ]]; then set_symlinks "${targets[${#targets[@]} - 1]}" fi } ### helper functions ### test_usr_bin_writeable() { [[ -w "${EROOT}/usr/bin" ]] || die -q "\"${EROOT}/usr/bin\" not writeable by current user. Are you root?" }