diff options
author | 2015-01-22 23:21:24 +0100 | |
---|---|---|
committer | 2015-01-22 23:21:24 +0100 | |
commit | 6dae9a0b0e4eb6f2f61a9b606fb5a7120ca47898 (patch) | |
tree | 2556e6ba76b6981afd2be75bbdd86260f4b2bc09 | |
parent | symlink lib stuff (diff) | |
download | eselect-wine-6dae9a0b0e4eb6f2f61a9b606fb5a7120ca47898.tar.gz eselect-wine-6dae9a0b0e4eb6f2f61a9b606fb5a7120ca47898.tar.bz2 eselect-wine-6dae9a0b0e4eb6f2f61a9b606fb5a7120ca47898.zip |
Enable setting variants separately
Only executables are symlinked for variants
-rw-r--r-- | wine.eselect | 213 |
1 files changed, 190 insertions, 23 deletions
diff --git a/wine.eselect b/wine.eselect index 33fda2f..af91922 100644 --- a/wine.eselect +++ b/wine.eselect @@ -7,6 +7,8 @@ inherit multilib tests DESCRIPTION="Manage active wine version" MAINTAINER="" +VARIANTS=(staging) + PREFIXDIR=/usr/lib BINDIR=/usr/bin EXECUTABLES=(msiexec notepad regedit regsvr32 widl wine wine64 wine64-preloader @@ -37,11 +39,20 @@ sort_versions() { | LC_ALL=C ${vsort} | sed 's/.* //' } -# find a list of installed wine versions +# find a list of available wine versions find_targets() { local f for f in "${EROOT}${PREFIXDIR}"/wine-*; do - [[ -f ${f}/bin/wine ]] && basename "${f}" + [[ -f ${f}/bin/wine ]] && echo "${f##*/}" + done | sort_versions +} + +find_variant_targets() { + local variant=$1 + [[ -n $variant ]] || die "\$variant is empty :(" + local f + for f in "${EROOT}${PREFIXDIR}/wine-${variant}-"*; do + [[ -f ${f}/bin/wine ]] && echo "${f##*/}" done | sort_versions } @@ -90,8 +101,23 @@ remove_symlinks() { return 0 } +# remove variant wine symlinks +# usage: remove_variant_symlinks <variant> +remove_variant_symlinks() { + local variant=$1 + [[ -n $variant ]] || die "\$variant is empty :(" + + for exe in "${EXECUTABLES[@]}"; do + if [[ -L ${EROOT}${BINDIR}/${exe}-${variant} ]]; then + rm "${EROOT}${BINDIR}/${exe}-${variant}" || return 1 + fi + done + + return 0 +} + # set wine symlinks -# Usage: set_symlinks <name> | <number> +# Usage: set_symlinks <name|number> set_symlinks() { local target=$1 @@ -101,7 +127,7 @@ set_symlinks() { fi if [[ -z ${target} ]]; then - die -q "Target \"$1\" doesn't appear to be valid!" + die "Target \"$target\" doesn't appear to be valid!" elif [[ -f ${EROOT}${PREFIXDIR}/${target}/bin/wine ]]; then for exe in "${EXECUTABLES[@]}"; do @@ -140,7 +166,7 @@ set_symlinks() { done else - die -q "Target \"$1\" doesn't appear to be valid!" + die "Target \"$target\" doesn't appear to be valid!" fi desktop_database_update @@ -148,6 +174,37 @@ set_symlinks() { return 0 } +# set variant wine symlinks +# usage: set_variant_symlinks <variant> <name|number> +set_variant_symlinks() { + local variant=$1 + [[ -n $variant ]] || die "\$variant is empty :(" + + local target=$2 + + if is_number "${target}"; then + local targets=( $(find_variant_targets "$variant") ) + target=${targets[target-1]} + fi + + if [[ -z ${target} ]]; then + die "Target \"$target\" doesn't appear to be valid!" + elif [[ -f ${EROOT}${PREFIXDIR}/${target}/bin/wine ]]; then + + for exe in "${EXECUTABLES[@]}"; do + local tgtexe="${exe}"-"${target#wine-}" + if [[ -f ${EROOT}${BINDIR}/${tgtexe} || -L ${EROOT}${BINDIR}/${tgtexe} ]]; then + ln -s "${tgtexe}" "${EROOT}${BINDIR}/${exe}-${variant}" || return 1 + fi + done + + else + die "Target \"$target\" doesn't appear to be valid!" + fi + + return 0 +} + # print currently selected wine get_current() { if [[ -L ${EROOT}${BINDIR}/wine ]]; then @@ -158,15 +215,45 @@ get_current() { fi } +# print currently selected variant wine +get_current_variant() { + local variant=$1 + [[ -n $variant ]] || die "\$variant is empty :(" + + if [[ -L ${EROOT}${BINDIR}/wine-${variant} ]]; then + local winefull=$(canonicalise "${EROOT}${BINDIR}/wine-${variant}") + local wine="${winefull##*/}" + [[ -n $wine ]] || return 1 + echo "${wine}" + fi +} + ### show action ### describe_show() { echo "Show the active wine version" } +describe_show_options() { + for v in ${VARIANTS[@]}; do + echo "--$v : Show the active 'wine-$v'" + done +} + do_show() { - write_list_start "Active wine version:" - local wine=$(get_current) + local variant="" + if has "${1#--}" "${VARIANTS[@]}" ; then + variant=${1#--} + fi + + local wine + if [[ -n $variant ]]; then + write_list_start "Active wine-${variant} version:" + wine=$(get_current_variant "$variant") + else + write_list_start "Active wine version:" + wine=$(get_current) + fi if [[ -n ${wine} ]]; then write_kv_list_entry "${wine}" "" local winedir=${EROOT}${PREFIXDIR}/${wine##*/} @@ -183,10 +270,28 @@ describe_list() { echo "List available wine versions" } +describe_list_options() { + for v in ${VARIANTS[@]}; do + echo "--$v : List the available 'wine-$v'" + done +} + do_list() { - local i targets=( $(find_targets) ) + local i + local variant="" + local targets + if has "${1#--}" "${VARIANTS[@]}" ; then + variant=${1#--} + fi + + if [[ -n $variant ]]; then + targets=( $(find_variant_targets "$variant") ) + write_list_start "Available wine-$variant versions:" + else + targets=( $(find_targets) ) + write_list_start "Available wine versions:" + fi - write_list_start "Available wine versions:" for (( i = 0; i < ${#targets[@]}; i++ )); do [[ ${targets[i]} = \ $(basename "$(canonicalise "${EROOT}${BINDIR}/wine")") ]] \ @@ -201,8 +306,22 @@ describe_remove() { echo "Remove wine symlinks" } +describe_remove_options() { + for v in ${VARIANTS[@]}; do + echo "--$v : Remove the 'wine-$v' symlinks" + done +} + do_remove() { - remove_symlinks || die -q "Couldn't remove existing symlinks" + local variant="" + if has "${1#--}" "${VARIANTS[@]}" ; then + variant=${1#--} + fi + if [[ -n $variant ]]; then + remove_variant_symlinks "$variant" || die -q "Couldn't remove wine-${variant} symlinks" + else + remove_symlinks || die -q "Couldn't remove wine symlinks" + fi } ### set action ### @@ -216,24 +335,39 @@ describe_set_parameters() { } describe_set_options() { + for v in ${VARIANTS[@]}; do + echo "--$v : Set only the 'wine-$v' symlinks" + done echo "target : Target name or number (from 'list' action)" } do_set() { + local variant="" + if has "${1#--}" "${VARIANTS[@]}" ; then + variant=${1#--} + shift + fi [[ -z $1 ]] && die -q "You didn't tell me what version to symlink" - [[ $# -gt 1 ]] && die -q "Too many parameters" + [[ $# -gt 1 ]] && die "Too many parameters" + local suffix="" + [[ -n $variant ]] && suffix=-$variant for exe in "${EXECUTABLES[@]}"; do - if [[ -L ${EROOT}/usr/bin/${exe} ]]; then + if [[ -L ${EROOT}${BINDIR}/${exe}${suffix} ]]; then continue - elif [[ -e ${EROOT}/usr/bin/${exe} ]]; then + elif [[ -e ${EROOT}${BINDIR}/${exe}${suffix} ]]; then # we have something strange - die -q "${EROOT}/usr/bin/${exe} exists but is not a symlink" + die "${EROOT}${BINDIR}/${exe}${suffix} exists but is not a symlink" fi done - remove_symlinks || die -q "Couldn't remove existing symlinks" - set_symlinks "$1" || die -q "Couldn't set a new symlinks" + if [[ -n $variant ]]; then + remove_variant_symlinks "$variant" + set_variant_symlinks "$variant" "$1" + else + remove_symlinks || die -q "Couldn't remove existing symlinks" + set_symlinks "$1" || die -q "Couldn't set a new symlinks" + fi } ### update action ### @@ -242,18 +376,47 @@ describe_update() { echo "Set highest version installed active" } -describe_update_parameters() { - echo "[--if-unset]" -} - describe_update_options() { + for v in ${VARIANTS[@]}; do + echo "--$v : Update the 'wine-$v' symlinks" + done + echo "--all : Update main active wine and all variants" echo "--if-unset : Reuse currently selected version if it appears valid" } do_update() { + local variant="" + if has --all "$@"; then + if has --if-unset "$@"; then + do_update --if-unset + else + do_update + fi + for variant in "$VARIANTS"; do + if has --if-unset "$@"; then + do_update "--${variant}" --if-unset + else + do_update "--${variant}" + fi + done + return 0 + fi + local v=0 - if [[ ${1} = "--if-unset" ]]; then - local wine=$(get_current) + local arg + for arg in "$@"; do + if has "${arg#--}" "${VARIANTS[@]}" ; then + variant=${arg#--} + break + fi + done + if has --if-unset "$@"; then + local wine + if [[ -n $variant ]]; then + wine=$(get_current_variant "$variant") + else + wine=$(get_current) + fi if [[ -n ${wine} ]]; then v="${wine}" else @@ -261,5 +424,9 @@ do_update() { fi fi - do_set "$v" || die -q "Couldn't set a new symlinks" + if [[ -n $variant ]]; then + do_set "--$variant" "$v" || die -q "Couldn't set a new wine-$variant symlinks" + else + do_set "$v" || die -q "Couldn't set a new wine symlinks" + fi } |