# -*-eselect-*- vim: ft=eselect # Copyright 2005-2014 Gentoo Foundation # Distributed under the terms of the GNU GPL version 2 or later 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 wineboot winebuild winecfg wineconsole winecpp winedbg winefile wineg++ winegcc winemine winepath wine-preloader wineserver wmc wrc) MANDIR=/usr/share/man MANPAGES=(man1/widl.1 man1/winebuild.1 man1/winegcc.1 man1/wineg++.1 man1/winecpp.1 man1/wineserver.1 man1/wine.1 man1/wmc.1 man1/wrc.1 man1/msiexec.1 man1/notepad.1 man1/regedit.1 man1/regsvr32.1 man1/wineboot.1 man1/winecfg.1 man1/wineconsole.1 man1/winedbg.1 man1/winefile.1 man1/winemine.1 man1/winepath.1) DESKTOPFILES=(wine.desktop) DESKTOPDIR=/usr/share/applications # sort function for versions, to be used in a pipe sort_versions() { local vsort="sort --version-sort" # Test if our sort supports the --version-sort option (posix does) ${vsort} /dev/null || vsort=sort # We sort versions as follows: # 1. Run sed to prepend the version string by the numeric version # 1.7.21 wine-1.7.21 # 1.7.14 wine-compholio-1.7.14 # 2. sort --version-sort # 3. Run sed again to remove the prepended keys from step 1. sed -e 's/^\(.\+-\)\([[:digit:].]*\)$/\2 &/' \ | LC_ALL=C ${vsort} | sed 's/.* //' } # find a list of available wine versions find_targets() { local f for f in "${EROOT}${PREFIXDIR}"/wine-*; do [[ -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 } # lifted from fdo-mime.eclass desktop_database_update() { if [[ -x "${EPREFIX}/usr/bin/update-desktop-database" ]]; then echo "Updating desktop mime database ..." "${EPREFIX}/usr/bin/update-desktop-database" -q "${EROOT}usr/share/applications" fi } # remove wine symlinks remove_symlinks() { for exe in "${EXECUTABLES[@]}"; do if [[ -L ${EROOT}${BINDIR}/${exe} ]]; then rm "${EROOT}${BINDIR}/${exe}" || return 1 fi done for page in "${MANPAGES[@]}"; do if [[ -L ${EROOT}/${MANDIR}/${page} ]]; then rm "${EROOT}/${MANDIR}/${page}" || return 1 fi done for d in "${DESKTOPFILES[@]}"; do if [[ -L ${EROOT}/${DESKTOPDIR}/${d} ]]; then rm "${EROOT}/${DESKTOPDIR}/${d}" || return 1 fi done if [[ -L ${EROOT}/usr/include/wine ]]; then rm "${EROOT}/usr/include/wine" || return 1 fi for d in $(list_libdirs); do local ld=/usr/$d [[ -L $ld ]] && continue for f in "$ld"/libwine.so*; do rm -f "$f" || return 1 done if [[ -L ${ld}/wine ]]; then rm -f "${ld}/wine" || return 1 fi done desktop_database_update return 0 } # remove variant wine symlinks # usage: remove_variant_symlinks 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 set_symlinks() { local target=$1 if is_number "${target}"; then local targets=( $(find_targets) ) 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}" || return 1 fi done for page in "${MANPAGES[@]}"; do if [[ -f ${EROOT}${PREFIXDIR}/${target}/man/${page} ]]; then ln -s "${EROOT}${PREFIXDIR}/${target}/man/${page}" "${EROOT}/${MANDIR}/${page}" || return 1 fi done for d in "${DESKTOPFILES[@]}"; do if [[ -f ${EROOT}${PREFIXDIR}/${target}/applications/${d} ]]; then ln -s "${EROOT}${PREFIXDIR}/${target}/applications/${d}" "${EROOT}/${DESKTOPDIR}/${d}" || return 1 fi done if [[ -d ${EROOT}${PREFIXDIR}/${target}/include/wine ]]; then ln -s "${EROOT}${PREFIXDIR}/${target}/include/wine" "${EROOT}/usr/include/wine" || return 1 fi for d in $(list_libdirs); do local ld=/usr/$d [[ -L $ld ]] && continue local wined=${EROOT}${PREFIXDIR}/${target}/${d} for f in "${wined}"/libwine.so*; do ln -s "$f" "$ld"/ || return 1 done if [[ -d ${wined}/wine ]]; then ln -s "${wined}/wine" "$ld"/wine || return 1 fi done else die "Target \"$target\" doesn't appear to be valid!" fi desktop_database_update return 0 } # set variant wine symlinks # usage: set_variant_symlinks 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 local winefull=$(canonicalise "${EROOT}${BINDIR}/wine") local wine="${winefull##*/}" [[ -n $wine ]] || return 1 echo "${wine}" 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() { 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##*/} [[ -f ${winedir}/bin/wine ]] \ || write_warning_msg "Symlink target doesn't appear to be valid!" else write_kv_list_entry "(unset)" "" fi } ### list action ### 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 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 for (( i = 0; i < ${#targets[@]}; i++ )); do [[ ${targets[i]} = \ $(basename "$(canonicalise "${EROOT}${BINDIR}/wine")") ]] \ && targets[i]=$(highlight_marker "${targets[i]}") done write_numbered_list -m "(none found)" "${targets[@]}" } ### unset action ### describe_unset() { echo "Remove wine symlinks" } describe_unset_options() { for v in ${VARIANTS[@]}; do echo "--$v : Remove the 'wine-$v' symlinks" done } do_unset() { 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 ### describe_set() { echo "Set a new wine version" } describe_set_parameters() { echo "" } 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 "Too many parameters" local suffix="" [[ -n $variant ]] && suffix=-$variant for exe in "${EXECUTABLES[@]}"; do if [[ -L ${EROOT}${BINDIR}/${exe}${suffix} ]]; then continue elif [[ -e ${EROOT}${BINDIR}/${exe}${suffix} ]]; then # we have something strange die "${EROOT}${BINDIR}/${exe}${suffix} exists but is not a symlink" fi done 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 ### describe_update() { echo "Set highest version installed active" } 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 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 echo "Current wine is not valid, will update to newest" fi fi 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 }