diff options
-rw-r--r-- | app-admin/eselect-python/ChangeLog | 7 | ||||
-rw-r--r-- | app-admin/eselect-python/Manifest | 1 | ||||
-rw-r--r-- | app-admin/eselect-python/eselect-python-20111108-r1.ebuild | 63 | ||||
-rw-r--r-- | app-admin/eselect-python/files/python-eselect.patch | 378 | ||||
-rw-r--r-- | app-admin/eselect-python/files/wrapper.patch | 25 | ||||
-rw-r--r-- | app-admin/eselect-python/metadata.xml | 5 | ||||
-rw-r--r-- | app-admin/eselect-python/python.eselect | 479 |
7 files changed, 958 insertions, 0 deletions
diff --git a/app-admin/eselect-python/ChangeLog b/app-admin/eselect-python/ChangeLog new file mode 100644 index 0000000..ca61fa3 --- /dev/null +++ b/app-admin/eselect-python/ChangeLog @@ -0,0 +1,7 @@ +*eselect-python-20111108-r1 (25 Jun 2012) + + 25 Jun 2012; <testuser@gentoo.org> +eselect-python-20111108-r1.ebuild, + +files/python-eselect.patch, +files/wrapper.patch, +metadata.xml, + +python.eselect: + [app-admin/eselect-python] A pypy aware version + diff --git a/app-admin/eselect-python/Manifest b/app-admin/eselect-python/Manifest new file mode 100644 index 0000000..99c09d4 --- /dev/null +++ b/app-admin/eselect-python/Manifest @@ -0,0 +1 @@ +DIST eselect-python-20111108.tar.bz2 64959 SHA256 34d7618808a3c1d22e6763bc6c67d5ae47a1fa371f5e91de95a911da9aceba5e SHA512 59a493128753ae968c6fa30eb870f52198de7bb5090213ef0b8c0d3d8b1f552ac514174dd1e97e54dd9434432be1a68ad01853d1ffb21e53d28d08f623199dac WHIRLPOOL 605730de7fee70cf5a33e15c8e16a938807c5ed32f80ff0435a196f03cb38ce397092626c88df598b1b88dab7ee3b8c7f3105b9f3b88acb13fe532f964b8aced diff --git a/app-admin/eselect-python/eselect-python-20111108-r1.ebuild b/app-admin/eselect-python/eselect-python-20111108-r1.ebuild new file mode 100644 index 0000000..e07e59b --- /dev/null +++ b/app-admin/eselect-python/eselect-python-20111108-r1.ebuild @@ -0,0 +1,63 @@ +# Copyright 1999-2012 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/app-admin/eselect-python/eselect-python-20111108.ebuild,v 1.2 2012/04/26 14:53:20 aballier Exp $ + +# Keep the EAPI low here because everything else depends on it. +# We want to make upgrading simpler. + +EAPI=2 +ESVN_PROJECT="eselect-python" +ESVN_REPO_URI="https://overlays.gentoo.org/svn/proj/python/projects/eselect-python/trunk" + +inherit eutils +if [[ ${PV} == "99999999" ]] ; then + inherit autotools subversion eutils +else + SRC_URI="mirror://gentoo/${P}.tar.bz2" + KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-fbsd ~sparc-fbsd ~x86-fbsd" +fi + +DESCRIPTION="Eselect module for management of multiple Python versions" +HOMEPAGE="http://www.gentoo.org" + +LICENSE="GPL-2" +SLOT="0" +IUSE="" + +RDEPEND=">=app-admin/eselect-1.2.3" +# Avoid autotool deps for released versions for circ dep issues. +if [[ ${PV} == "99999999" ]] ; then + DEPEND="sys-devel/autoconf" +else + DEPEND="" +fi + +src_unpack() { + unpack ${A} + cd "${S}" + [[ -x configure ]] || eautoreconf +} + +src_prepare() { + epatch "${FILESDIR}"/python-eselect.patch + epatch "${FILESDIR}"/wrapper.patch || die +} + +src_install() { + keepdir /etc/env.d/python + emake DESTDIR="${D}" install || die +} + +pkg_preinst() { + if has_version "<${CATEGORY}/${PN}-20090804" || ! has_version "${CATEGORY}/${PN}"; then + run_eselect_python_update="1" + fi +} + +pkg_postinst() { + if [[ "${run_eselect_python_update}" == "1" ]]; then + ebegin "Running \`eselect python update\`" + eselect python update --ignore 3.0 --ignore 3.1 --ignore 3.2 > /dev/null + eend "$?" + fi +} diff --git a/app-admin/eselect-python/files/python-eselect.patch b/app-admin/eselect-python/files/python-eselect.patch new file mode 100644 index 0000000..9cceab7 --- /dev/null +++ b/app-admin/eselect-python/files/python-eselect.patch @@ -0,0 +1,378 @@ +diff -ur eselect-python-20111108.orig/python.eselect eselect-python-20111108/python.eselect +--- python.eselect 2011-11-09 07:15:22.000000000 +0800 ++++ python.eselect 2012-06-25 21:48:00.142723058 +0800 +@@ -1,4 +1,4 @@ +-# Copyright 1999-2010 Gentoo Foundation ++7# Copyright 1999-2010 Gentoo Foundation + # Distributed under the terms of the GNU General Public License v2 + # $Id: $ + +@@ -15,9 +15,11 @@ + + # Find a list of Python versions + find_targets() { +- local interpreter interpreters="python?.?" ++ local interpreter interpreters="python?.?" pypyinterpreters="pypy-c1.?" + +- if [[ "${PYTHON_INTERPRETERS_GROUP}" == "2" ]]; then ++ if [[ "${PYTHON_INTERPRETERS_GROUP}" == "1" ]]; then ++ interpreters="pypy-c1.?" ++ elif [[ "${PYTHON_INTERPRETERS_GROUP}" == "2" ]]; then + interpreters="python2.?" + elif [[ "${PYTHON_INTERPRETERS_GROUP}" == "3" ]]; then + interpreters="python3.?" +@@ -25,8 +27,8 @@ + + # Think twice before adding jython to this list. /usr/bin/jython + # is a bash wrapper that calls java-config, which is a Python +- # script, so you need a valid /usr/bin/python to start jython. +- for interpreter in "${INTERPRETER_PATH}"${interpreters}; do ++ # script, so you need a valid /usr/bin/python to start jython. Adding pypy ++ for interpreter in "${INTERPRETER_PATH}"${interpreters} "${INTERPRETER_PATH}"${pypyinterpreters}; do + if [[ -f "${interpreter}" ]]; then + echo ${interpreter#${INTERPRETER_PATH}} + fi +@@ -40,8 +42,9 @@ + } + + set_python_config() { +- local script="${INTERPRETER_PATH}python-config" target="${1}" +- cat << EOF > "${script}" ++ local script="${INTERPRETER_PATH}python-config" pyscript=${INTERPRETER_PATH}pypy-config target="${1}" ++ if [[ "${target:0:6}" == "python" ]]; then ++ cat << EOF > "${script}" + #!/usr/bin/env bash + # Gentoo python-config wrapper script + +@@ -49,18 +52,31 @@ + python_config="\${EPYTHON/python/python-config-}" + "\${0%/*}/\${python_config:-${target}}" "\$@" + EOF +- chmod a+rx "${script}" ++ chmod a+rx "${script}" ++ elif [[ "${target:0:6}" == "pypy-c" ]]; then ++ cat << EOF > "${pyscript}" ++#!/usr/bin/env bash ++# Gentoo python-config wrapper script ++ ++[[ "\${EPYTHON}" =~ (/|^python\$) ]] && EPYTHON="${target/-config-/}" ++python_config="\${EPYTHON/python/python-config-}" ++"\${0%/*}/\${python_config:-${target}}" "\$@" ++EOF ++ chmod a+rx "${pyscript}" ++ fi ++ # We always need a "${script}" ++ ln -s "${pyscript}" "${script}" + } + + # Try to remove python and python.1 symlinks + remove_symlinks() { + local symlink symlink_target symlink_target_found + if [[ "${SET_MAIN_ACTIVE_PYTHON_INTERPRETER}" == "1" ]]; then +- rm -f "${INTERPRETER_PATH}"{idle,pydoc,python,python-config,pythonw} &> /dev/null || return 1 ++ rm -f "${INTERPRETER_PATH}"{idle,pydoc,python,pypy,python-config,pythonw} &> /dev/null || return 1 + rm -f "${MAN_PATH}"python.1{,.gz,.bz2,.lzma,.xz} &> /dev/null || return 1 + fi + +- for symlink in "${INTERPRETER_PATH}python"?; do ++ for symlink in "${INTERPRETER_PATH}python"? "${INTERPRETER_PATH}pypy-c"?; do + [[ ! -L "${symlink}" ]] && continue + symlink_target_found=0 + for symlink_target in "${symlink}".?; do +@@ -75,7 +91,7 @@ + rm -f "${INTERPRETER_PATH%/bin/}/lib/Python.framework}"/{Headers,Python,Resources} + } + +-# Set a man page symlink ++# Set a man page symlink; pypy apparently does not come with man pages + set_man_symlink() { + local target="${1}" x extension + +@@ -86,13 +102,15 @@ + fi + done + +- if [[ -z "${extension}" ]]; then ++ if [[ -z "${extension}" && "${target:0:4}" != "pypy" ]]; then + echo "Couldn't find a man page for ${target}; skipping." 1>&2 + return 1 + fi + + pushd "${MAN_PATH}" 1> /dev/null +- ln -nfs "${target}${extension}" "python${extension}" ++ if [[ "${target:0:4}" != "pypy" ]]; then ++ ln -nfs "${target}${extension}" "python${extension}" ++ fi + popd 1> /dev/null + } + +@@ -175,17 +193,22 @@ + + describe_show_options() { + echo "--ABI : Show Python ABI in format of PYTHON_ABI variable" ++ echo "--pypy-c1 : Show active pypy 1 interpreter" + echo "--python2 : Show active Python 2 interpreter" + echo "--python3 : Show active Python 3 interpreter" ++ echo "" + } + + do_show() { +- local ABI="0" interpreter python2="0" python3="0" ++ local ABI="0" interpreter python2="0" python3="0" pypy1="0" + while [[ $# > 0 ]]; do + case "$1" in + --ABI) + ABI="1" + ;; ++ --pypy1) ++ pypy1="1" ++ ;; + --python2) + python2="1" + ;; +@@ -201,9 +224,15 @@ + + if [[ "${python2}" == "1" && "${python3}" == "1" ]]; then + die -q "'--python2' and '--python3' options cannot be specified simultaneously" ++ elif [[ "${pypy1}" == "1" && "${python2}" == "1" ]]; then ++ die -q "'--pypy-c1' and '--python2' options cannot be specified simultaneously" ++ elif [[ "${pypy1}" == "1" && "${python3}" == "1" ]]; then ++ die -q "'--pypy-c1' and '--python3' options cannot be specified simultaneously" + fi + +- if [[ "${python2}" == "1" ]]; then ++ if [[ "${pypy1}" == "1" ]]; then ++ interpreter="$(readlink "${INTERPRETER_PATH}pypy-c1")" ++ elif [[ "${python2}" == "1" ]]; then + interpreter="$(readlink "${INTERPRETER_PATH}python2")" + elif [[ "${python3}" == "1" ]]; then + interpreter="$(readlink "${INTERPRETER_PATH}python3")" +@@ -211,8 +240,10 @@ + interpreter="$(<"${ENV_D_PATH}/python/config")" + fi + +- if [[ "${ABI}" == "1" ]]; then ++ if [[ "${ABI}" == "1" && "${interpreter:0:6}" == "python" ]]; then + echo -n "${interpreter#python}" ++ elif [[ "${ABI}" == "1" && "${interpreter:0:6}" == "pypy-c" ]]; then ++ echo -n 2.7-"${interpreter/c/}" + else + echo -n "${interpreter}" + fi +@@ -229,14 +260,23 @@ + } + + describe_list_options() { ++ echo "--pypy1 : List installed Pypy 1 interpreters" + echo "--python2 : List installed Python 2 interpreters" + echo "--python3 : List installed Python 3 interpreters" + } + + do_list() { +- local active i python_descriptive_name="Python" python_version_option= python2="0" python3="0" targets=() ++ local active i python_descriptive_name="Python" python_version_option= python2="0" python3="0" ++ local pypy1="0" targets=() active_version=$(do_show) ++ + while [[ $# > 0 ]]; do + case "$1" in ++ --pypy1) ++ pypy1="1" ++ python_descriptive_name="Pypy 1" ++ python_version_option="--pypy1" ++ PYTHON_INTERPRETERS_GROUP="1" ++ ;; + --python2) + python2="1" + python_descriptive_name="Python 2" +@@ -258,19 +298,69 @@ + + if [[ "${python2}" == "1" && "${python3}" == "1" ]]; then + die -q "'--python2' and '--python3' options cannot be specified simultaneously" ++ elif [[ "${pypy1}" == "1" && "${python2}" == "1" ]]; then ++ die -q "'--pypy-c1' and '--python2' options cannot be specified simultaneously" ++ elif [[ "${pypy1}" == "1" && "${python3}" == "1" ]]; then ++ die -q "'--pypy-c1' and '--python3' options cannot be specified simultaneously" + fi + +- targets=($(find_targets)) ++ combined_targets=($(find_targets)) ++ # $(find_targets) captures pypy entries; need to filter them from the list ++ if [[ $PYTHON_INTERPRETERS_GROUP > "1" ]]; then ++ for (( j=0 ; j < ${#combined_targets[@]} ; j++ )) ++ do ++ if [[ ${combined_targets[$j]:0:4} == "pypy" ]]; then ++ break ++ fi ++ targets[$j]="${combined_targets[$j]}" ++ done + +- write_list_start "Available ${python_descriptive_name} interpreters:" + +- active="$(do_show ${python_version_option})" +- for ((i = 0; i < ${#targets[@]}; i++)); do +- if [[ ${targets[${i}]} == ${active} ]]; then +- targets[${i}]="$(highlight_marker "${targets[${i}]}")" +- fi +- done +- write_numbered_list -m "(none found)" "${targets[@]}" ++ write_list_start "Available ${python_descriptive_name} interpreters:" ++ ++ active="$(do_show ${python_version_option})" ++ for ((i = 0; i < ${#targets[@]}; i++)); do ++ if [[ ${targets[${i}]} == ${active} ]]; then ++ targets[${i}]="$(highlight_marker "${targets[${i}]}")" ++ fi ++ done ++ write_numbered_list -m "(none found)" "${targets[@]}" ++ ++ elif [[ $PYTHON_INTERPRETERS_GROUP == "1" ]]; then ++ # pypy entries duplicate, filter to only 1 of each ++ for (( j=0 ; j < ${#combined_targets[@]} ; j++ )) ++ do ++ if [[ $j -gt 0 && "${combined_targets[$j]}" == "${combined_targets[0]}" ]]; then ++ break ++ fi ++ targets[$j]="${combined_targets[$j]}" ++ done ++ write_list_start "Available ${python_descriptive_name} interpreters:" ++ ++ if [[ "${active_version:0:4}" == "pypy" ]]; then ++ active="$(do_show ${python_version_option})" ++ for ((i = 0; i < ${#targets[@]}; i++)); do ++ if [[ ${targets[${i}]} == ${active} ]]; then ++ targets[${i}]="$(highlight_marker "${targets[${i}]}")" ++ fi ++ done ++ fi ++ write_numbered_list -m "(none found)" "${targets[@]}" ++ ++ else ++ targets=($(find_targets)) active=($(find_targets)) ++ ++ write_list_start "Available ${python_descriptive_name} interpreters:" ++ ++ active="$(do_show ${python_version_option})" ++ ++ for ((i = 0; i < ${#targets[@]}; i++)); do ++ if [[ ${targets[${i}]} == ${active} ]]; then ++ targets[${i}]="$(highlight_marker "${targets[${i}]}")" ++ fi ++ done ++ write_numbered_list -m "(none found)" "${targets[@]}" ++ fi + } + + ### set action ### +@@ -280,6 +370,7 @@ + } + + describe_set_options() { ++ echo "--pypy-c1 : Set active Pypy-c 1 interpreter without setting of main active Python interpreter if it is not set to Pypy-c 1" + echo "--python2 : Set active Python 2 interpreter without setting of main active Python interpreter if it is not set to Python 2" + echo "--python3 : Set active Python 3 interpreter without setting of main active Python interpreter if it is not set to Python 3" + } +@@ -289,10 +380,14 @@ + } + + do_set() { +- local main_active_python_interpreter python2="0" python3="0" ++ local main_active_python_interpreter python2="0" python3="0" pypy1="0" + SET_MAIN_ACTIVE_PYTHON_INTERPRETER="1" + while [[ $# > 0 ]]; do + case "$1" in ++ --pypy1) ++ pypy1="1" ++ PYTHON_INTERPRETERS_GROUP="1" ++ ;; + --python2) + python2="1" + PYTHON_INTERPRETERS_GROUP="2" +@@ -310,6 +405,10 @@ + + if [[ "${python2}" == "1" && "${python3}" == "1" ]]; then + die -q "'--python2' and '--python3' options cannot be specified simultaneously" ++ elif [[ "${pypy1}" == "1" && "${python2}" == "1" ]]; then ++ die -q "'--pypy-c1' and '--python2' options cannot be specified simultaneously" ++ elif [[ "${pypy1}" == "1" && "${python3}" == "1" ]]; then ++ die -q "'--pypy-c1' and '--python3' options cannot be specified simultaneously" + fi + + if [[ $# -lt 1 ]]; then +@@ -319,9 +418,11 @@ + else + main_active_python_interpreter="$(do_show)" + if [[ "${python2}" == "1" && "${main_active_python_interpreter}" != "python2."* ]]; then +- SET_MAIN_ACTIVE_PYTHON_INTERPRETER="0" +- elif [[ "${python3}" == "1" && "${main_active_python_interpreter}" != "python3."* ]]; then +- SET_MAIN_ACTIVE_PYTHON_INTERPRETER="0" ++ if [[ "${python3}" == "1" && "${main_active_python_interpreter}" != "python3."* ]]; then ++ if [[ "${pypy1}" == "1" && "${main_active_python_interpreter}" != "pypy-c1."* ]]; then ++ SET_MAIN_ACTIVE_PYTHON_INTERPRETER="0" ++ fi ++ fi + fi + + if ! set_scripts_and_symlinks "${1}"; then +@@ -343,12 +444,14 @@ + describe_update_options() { + echo "--if-unset : Do not override existing implementation" + echo "--ignore SLOT : Ignore SLOT when setting symlinks" ++ echo "--pypy-c1 : Set active Pypy-c 1 interpreter without setting of main active Python interpreter if it is not set to Pypy-c 1" + echo "--python2 : Set active Python 2 interpreter without setting of main active Python interpreter if it is not set to Python 2" + echo "--python3 : Set active Python 3 interpreter without setting of main active Python interpreter if it is not set to Python 3" + } + + do_update() { +- local if_unset="0" ignored_slots=() interpreters="python?.?" python2="0" python3="0" python_version_option= slot= target targets=() ++ local if_unset="0" ignored_slots=() interpreters="python?.?" python2="0" python3="0" pypy1="0" ++ local python_version_option= slot= target targets=() + while [[ $# > 0 ]]; do + case "$1" in + --if-unset) +@@ -357,6 +460,10 @@ + --ignore) + ignored_slots+=("${2}") + shift;; ++ --pypy1) ++ pypy1="1" ++ python_version_option="--pypy-c1" ++ ;; + --python2) + python2="1" + python_version_option="--python2" +@@ -374,19 +481,28 @@ + + if [[ "${python2}" == "1" && "${python3}" == "1" ]]; then + die -q "'--python2' and '--python3' options cannot be specified simultaneously" ++ elif [[ "${pypy1}" == "1" && "${python2}" == "1" ]]; then ++ die -q "'--pypy-c1' and '--python2' options cannot be specified simultaneously" ++ elif [[ "${pypy1}" == "1" && "${python3}" == "1" ]]; then ++ die -q "'--pypy-c1' and '--python3' options cannot be specified simultaneously" + fi + ++ # This reduceS by 3 lines + if [[ "${if_unset}" == "1" && -f "${INTERPRETER_PATH}python" && -f "${ENV_D_PATH}/python/config" ]]; then +- if [[ "${python2}" == "1" && -f "${INTERPRETER_PATH}python2" ]]; then +- return +- elif [[ "${python3}" == "1" && -f "${INTERPRETER_PATH}python3" ]]; then +- return +- elif [[ "${python2}" == "0" && "${python3}" == "0" ]]; then +- return ++ if [[ "${pypy1}" == "1" && -f "${INTERPRETER_PATH}pypy1" ]]; then ++ if [[ "${python2}" == "1" && -f "${INTERPRETER_PATH}python2" ]]; then ++ if [[ "${python3}" == "1" && -f "${INTERPRETER_PATH}python3" ]]; then ++ if [[ "${python2}" == "0" && "${python3}" == "0" && "${pypy1}" == "0" ]]; then ++ return ++ fi ++ fi ++ fi + fi + fi + +- if [[ "${python2}" == "1" ]]; then ++ if [[ "${pypy1}" == "1" ]]; then ++ interpreters="pypy-c1.?" ++ elif [[ "${python2}" == "1" ]]; then + interpreters="python2.?" + elif [[ "${python3}" == "1" ]]; then + interpreters="python3.?" diff --git a/app-admin/eselect-python/files/wrapper.patch b/app-admin/eselect-python/files/wrapper.patch new file mode 100644 index 0000000..f15ca2e --- /dev/null +++ b/app-admin/eselect-python/files/wrapper.patch @@ -0,0 +1,25 @@ +diff -ur eselect-python-20111108.orig/python-wrapper.c eselect-python-20111108/python-wrapper.c +--- python-wrapper.c 2011-11-09 07:15:22.000000000 +0800 ++++ python-wrapper.c 2012-06-06 15:14:49.712818087 +0800 +@@ -82,7 +82,7 @@ + /* True if a valid file name, and not "python" */ + int valid_interpreter(const char* name) + { +- if (! name || ! *name || (strcmp(name, "python") == 0)) ++ if (! name || ! *name || (strcmp(name, "python") == 0) || (strncmp(name, "pypy-c", 6) == 0) ) + { + return 0; + } +@@ -91,10 +91,9 @@ + + int get_version(const char* name) + { +- /* Only find files beginning with "python" - this is a fallback, +- * so we only want CPython ++ /* Find files beginning with "python" && "pypy-c1"; so we want CPython && pypy. + */ +- if (! valid_interpreter(name) || strncmp(name, "python", 6) != 0) ++ if (! (valid_interpreter(name)) || strncmp(name, "python", 6) != 0 || (strncmp(name, "pypy-c", 6) != 0)) + return -1; + int pos = 6; + int major = 0; diff --git a/app-admin/eselect-python/metadata.xml b/app-admin/eselect-python/metadata.xml new file mode 100644 index 0000000..301d220 --- /dev/null +++ b/app-admin/eselect-python/metadata.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <herd>python</herd> +</pkgmetadata> diff --git a/app-admin/eselect-python/python.eselect b/app-admin/eselect-python/python.eselect new file mode 100644 index 0000000..0319f2e --- /dev/null +++ b/app-admin/eselect-python/python.eselect @@ -0,0 +1,479 @@ +# Copyright 1999-2012 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id: $ + +DESCRIPTION="Manage Python symlinks" +MAINTAINER="python@gentoo.org" +SVN_DATE='$Date: 2010-08-02 12:23:53 -0400 (Mon, 02 Aug 2010) $' +VERSION=$(svn_date_to_version "${SVN_DATE}" ) + +ENV_D_PATH="${EROOT%/}/etc/env.d" +INTERPRETER_PATH="${EROOT%/}/usr/bin/" +MAN_PATH="${EROOT%/}/usr/share/man/man1/" + +PYTHON_INTERPRETERS_GROUP="" + +# Find a list of Python versions +find_targets() { + local interpreter interpreters="python?.?" pypyinterpreters="pypy-c1.?" + + if [[ "${PYTHON_INTERPRETERS_GROUP}" == "1" ]]; then + interpreters="pypy-c1.?" + elif [[ "${PYTHON_INTERPRETERS_GROUP}" == "2" ]]; then + interpreters="python2.?" + elif [[ "${PYTHON_INTERPRETERS_GROUP}" == "3" ]]; then + interpreters="python3.?" + fi + + # Think twice before adding jython to this list. /usr/bin/jython + # is a bash wrapper that calls java-config, which is a Python + # script, so you need a valid /usr/bin/python to start jython. Adding pypy + for interpreter in "${INTERPRETER_PATH}"${interpreters} "${INTERPRETER_PATH}"${pypyinterpreters}; do + if [[ -f "${interpreter}" ]]; then + echo ${interpreter#${INTERPRETER_PATH}} + fi + done +} + +set_python() { + local symlink="${INTERPRETER_PATH}python" target="${1}" + ln -s python-wrapper "${symlink}" + echo "${target}" > "${ENV_D_PATH}/python/config" +} + +set_python_config() { + local script="${INTERPRETER_PATH}python-config" pyscript=${INTERPRETER_PATH}pypy-config target="${1}" + if [[ "${target:0:6}" == "python" ]]; then + cat << EOF > "${script}" +#!/usr/bin/env bash +# Gentoo python-config wrapper script + +[[ "\${EPYTHON}" =~ (/|^python\$) ]] && EPYTHON="${target/-config-/}" +python_config="\${EPYTHON/python/python-config-}" +"\${0%/*}/\${python_config:-${target}}" "\$@" +EOF + chmod a+rx "${script}" + elif [[ "${target:0:6}" == "pypy-c" ]]; then + cat << EOF > "${pyscript}" +#!/usr/bin/env bash +# Gentoo python-config wrapper script + +[[ "\${EPYTHON}" =~ (/|^python\$) ]] && EPYTHON="${target/-config-/}" +python_config="\${EPYTHON/python/python-config-}" +"\${0%/*}/\${python_config:-${target}}" "\$@" +EOF + chmod a+rx "${pyscript}" + fi +} + +# Try to remove python and python.1 symlinks +remove_symlinks() { + local symlink symlink_target symlink_target_found + if [[ "${SET_MAIN_ACTIVE_PYTHON_INTERPRETER}" == "1" ]]; then + rm -f "${INTERPRETER_PATH}"{idle,pydoc,python,pypy,python-config,pythonw} &> /dev/null || return 1 + rm -f "${MAN_PATH}"python.1{,.gz,.bz2,.lzma,.xz} &> /dev/null || return 1 + fi + + for symlink in "${INTERPRETER_PATH}python"? "${INTERPRETER_PATH}pypy-c"?; do + [[ ! -L "${symlink}" ]] && continue + symlink_target_found=0 + for symlink_target in "${symlink}".?; do + [[ -f "${symlink_target}" ]] && symlink_target_found=1 + done + if [[ "${symlink_target_found}" -eq 0 ]]; then + rm -f "${symlink}" + fi + done + + # Files of Mac OS X framework + rm -f "${INTERPRETER_PATH%/bin/}/lib/Python.framework}"/{Headers,Python,Resources} +} + +# Set a man page symlink; pypy apparently does not come with man pages +set_man_symlink() { + local target="${1}" x extension + + for x in ".1" ".1.bz2" ".1.gz" ".1.lzma" ".1.xz"; do + if [[ -e "${MAN_PATH}${target}${x}" ]]; then + extension="${x}" + break + fi + done + + if [[ -z "${extension}" && "${target:0:4}" != "pypy" ]]; then + echo "Couldn't find a man page for ${target}; skipping." 1>&2 + return 1 + fi + + pushd "${MAN_PATH}" 1> /dev/null + if [[ "${target:0:4}" != "pypy" ]]; then + ln -nfs "${target}${extension}" "python${extension}" + fi + popd 1> /dev/null +} + +# Set python-config script and appropriate symlinks +set_scripts_and_symlinks() { + local target="${1}" targets=($(find_targets)) + if is_number "${target}" && [[ ${target} -ge 1 ]]; then + target=${targets[$((${target} - 1))]} + fi + + if ! has ${target} "${targets[@]}"; then + die -q "Invalid target ${target}" + fi + if [[ -f "${INTERPRETER_PATH}${target}" ]]; then + if ! remove_symlinks; then + die -q "Cannot remove symlinks" + fi + + if [[ "${SET_MAIN_ACTIVE_PYTHON_INTERPRETER}" == "1" ]]; then + set_man_symlink "${target}" + fi + + pushd "${INTERPRETER_PATH}" 1> /dev/null + + ln -nfs "${target}" "${target%.*}" + if [[ "${SET_MAIN_ACTIVE_PYTHON_INTERPRETER}" == "1" ]]; then + set_python "${target}" + set_python_config "${target/python/python-config-}" + ln -nfs "${target/python/pydoc}" pydoc + # idle is optionally installed + if [[ -f "${target/python/idle}" ]]; then + ln -nfs "${target/python/idle}" idle + fi + # 2to3 for >=2.6 + if [[ -f "${target/python/2to3-}" ]]; then + ln -nfs "${target/python/2to3-}" 2to3 + fi + + # Wrapper for graphical applications on Mac OS X + if [[ -f "${target/python/pythonw}" ]] ; then + ln -nfs "${target/python/pythonw}" pythonw + fi + + # Files of Mac OS X framework + local framework_dir="${INTERPRETER_PATH%/bin/}/lib/Python.framework" + if [[ -d "${framework_dir}" ]]; then + local version="${target#python}" + pushd "${framework_dir}" 1> /dev/null + ln -nfs "Versions/${version}/Headers" + ln -nfs "Versions/${version}/Python" + ln -nfs "Versions/${version}/Resources" + popd 1> /dev/null + fi + fi + + popd 1> /dev/null + else + die -q "Target \"${1}\" doesn't appear to be valid!" + fi +} + +# Set the content of /etc/env.d/65python-docs +set_python_docs() { + local path target="${1#python}" variable + rm -f "${ENV_D_PATH}/65python-docs" + if [[ -f "${ENV_D_PATH}/60python-docs-${target}" ]]; then + variable="PYTHONDOCS_${target//./_}" + path="$(. "${ENV_D_PATH}/60python-docs-${target}"; echo -n "${!variable}")" + if [[ -d "${path}" ]]; then + echo "PYTHONDOCS=\"${path}\"" > "${ENV_D_PATH}/65python-docs" + fi + fi +} + +### show action ### + +describe_show() { + echo "Show main active Python interpreter" +} + +describe_show_options() { + echo "--ABI : Show Python ABI in format of PYTHON_ABI variable" + echo "--pypy-c1 : Show active pypy 1 interpreter" + echo "--python2 : Show active Python 2 interpreter" + echo "--python3 : Show active Python 3 interpreter" + echo "" +} + +do_show() { + local ABI="0" interpreter python2="0" python3="0" pypy1="0" + while [[ $# > 0 ]]; do + case "$1" in + --ABI) + ABI="1" + ;; + --pypy1) + pypy1="1" + ;; + --python2) + python2="1" + ;; + --python3) + python3="1" + ;; + *) + die -q "Unrecognized argument '$1'" + ;; + esac + shift + done + + if [[ "${python2}" == "1" && "${python3}" == "1" ]]; then + die -q "'--python2' and '--python3' options cannot be specified simultaneously" + elif [[ "${pypy1}" == "1" && "${python2}" == "1" ]]; then + die -q "'--pypy-c1' and '--python2' options cannot be specified simultaneously" + elif [[ "${pypy1}" == "1" && "${python3}" == "1" ]]; then + die -q "'--pypy-c1' and '--python3' options cannot be specified simultaneously" + fi + + if [[ "${pypy1}" == "1" ]]; then + interpreter="$(readlink "${INTERPRETER_PATH}pypy-c1")" + elif [[ "${python2}" == "1" ]]; then + interpreter="$(readlink "${INTERPRETER_PATH}python2")" + elif [[ "${python3}" == "1" ]]; then + interpreter="$(readlink "${INTERPRETER_PATH}python3")" + elif [[ -f "${ENV_D_PATH}/python/config" ]]; then + interpreter="$(<"${ENV_D_PATH}/python/config")" + fi + + if [[ "${ABI}" == "1" && "${interpreter:0:6}" == "python" ]]; then + echo -n "${interpreter#python}" + elif [[ "${ABI}" == "1" && "${interpreter:0:6}" == "pypy-c" ]]; then + echo -n "${interpreter#pypy-c}" + else + echo -n "${interpreter}" + fi + + if [[ -n "${interpreter}" ]]; then + echo + fi +} + +### list action ### + +describe_list() { + echo "List installed Python interpreters" +} + +describe_list_options() { + echo "--pypy-c1 : List installed Pypy-c 1 interpreters" + echo "--python2 : List installed Python 2 interpreters" + echo "--python3 : List installed Python 3 interpreters" +} + +do_list() { + local active i python_descriptive_name="Python" python_version_option= python2="0" python3="0" + local pypy1="0" targets=() + while [[ $# > 0 ]]; do + case "$1" in + --pypy1) + pypy1="1" + python_descriptive_name="Pypy 1" + python_version_option="--pypy-c1" + PYTHON_INTERPRETERS_GROUP="1" + ;; + --python2) + python2="1" + python_descriptive_name="Python 2" + python_version_option="--python2" + PYTHON_INTERPRETERS_GROUP="2" + ;; + --python3) + python3="1" + python_descriptive_name="Python 3" + python_version_option="--python3" + PYTHON_INTERPRETERS_GROUP="3" + ;; + *) + die -q "Unrecognized argument '$1'" + ;; + esac + shift + done + + if [[ "${python2}" == "1" && "${python3}" == "1" ]]; then + die -q "'--python2' and '--python3' options cannot be specified simultaneously" + elif [[ "${pypy1}" == "1" && "${python2}" == "1" ]]; then + die -q "'--pypy-c1' and '--python2' options cannot be specified simultaneously" + elif [[ "${pypy1}" == "1" && "${python3}" == "1" ]]; then + die -q "'--pypy-c1' and '--python3' options cannot be specified simultaneously" + fi + + targets=($(find_targets)) + + write_list_start "Available ${python_descriptive_name} interpreters:" + + active="$(do_show ${python_version_option})" + for ((i = 0; i < ${#targets[@]}; i++)); do + if [[ ${targets[${i}]} == ${active} ]]; then + targets[${i}]="$(highlight_marker "${targets[${i}]}")" + fi + done + write_numbered_list -m "(none found)" "${targets[@]}" +} + +### set action ### + +describe_set() { + echo "Set main active Python interpreter" +} + +describe_set_options() { + echo "--pypy-c1 : Set active Pypy-c 1 interpreter without setting of main active Python interpreter if it is not set to Pypy-c 1" + echo "--python2 : Set active Python 2 interpreter without setting of main active Python interpreter if it is not set to Python 2" + echo "--python3 : Set active Python 3 interpreter without setting of main active Python interpreter if it is not set to Python 3" + echo +} + +describe_set_parameters() { + echo "<target>" +} + +do_set() { + local main_active_python_interpreter python2="0" python3="0" pypy1="0" + SET_MAIN_ACTIVE_PYTHON_INTERPRETER="1" + while [[ $# > 0 ]]; do + case "$1" in + --pypy1) + pypy1="1" + PYTHON_INTERPRETERS_GROUP="1" + ;; + --python2) + python2="1" + PYTHON_INTERPRETERS_GROUP="2" + ;; + --python3) + python3="1" + PYTHON_INTERPRETERS_GROUP="3" + ;; + *) + break + ;; + esac + shift + done + + if [[ "${python2}" == "1" && "${python3}" == "1" ]]; then + die -q "'--python2' and '--python3' options cannot be specified simultaneously" + elif [[ "${pypy1}" == "1" && "${python2}" == "1" ]]; then + die -q "'--pypy-c1' and '--python2' options cannot be specified simultaneously" + elif [[ "${pypy1}" == "1" && "${python3}" == "1" ]]; then + die -q "'--pypy-c1' and '--python3' options cannot be specified simultaneously" + fi + + if [[ $# -lt 1 ]]; then + die -q "'eselect python set' requires Python interpreter filename" + elif [[ $# -gt 1 ]]; then + die -q "'eselect python set' requires 1 argument" + else + main_active_python_interpreter="$(do_show)" + if [[ "${python2}" == "1" && "${main_active_python_interpreter}" != "python2."* ]]; then + if [[ "${python3}" == "1" && "${main_active_python_interpreter}" != "python3."* ]]; then + if [[ "${pypy1}" == "1" && "${main_active_python_interpreter}" != "pypy-c1."* ]]; then + SET_MAIN_ACTIVE_PYTHON_INTERPRETER="0" + fi + fi + fi + + if ! set_scripts_and_symlinks "${1}"; then + die -q "Can't set new provider" + fi + + if [[ "${SET_MAIN_ACTIVE_PYTHON_INTERPRETER}" == "1" ]]; then + set_python_docs "${1}" + fi + fi +} + +### update action ### + +describe_update() { + echo "Switch to the most recent CPython interpreter" +} + +describe_update_options() { + echo "--if-unset : Do not override existing implementation" + echo "--ignore SLOT : Ignore SLOT when setting symlinks" + echo "--pypy-c1 : Set active Pypy-c 1 interpreter without setting of main active Python interpreter if it is not set to Pypy-c 1" + echo "--python2 : Set active Python 2 interpreter without setting of main active Python interpreter if it is not set to Python 2" + echo "--python3 : Set active Python 3 interpreter without setting of main active Python interpreter if it is not set to Python 3" +} + +do_update() { + local if_unset="0" ignored_slots=() interpreters="python?.?" python2="0" python3="0" pypy1="0" + local python_version_option= slot= target targets=() + while [[ $# > 0 ]]; do + case "$1" in + --if-unset) + if_unset="1" + ;; + --ignore) + ignored_slots+=("${2}") + shift;; + --pypy1) + pypy1="1" + python_version_option="--pypy-c1" + ;; + --python2) + python2="1" + python_version_option="--python2" + ;; + --python3) + python3="1" + python_version_option="--python3" + ;; + *) + die -q "Unrecognized argument '$1'" + ;; + esac + shift + done + + if [[ "${python2}" == "1" && "${python3}" == "1" ]]; then + die -q "'--python2' and '--python3' options cannot be specified simultaneously" + elif [[ "${pypy1}" == "1" && "${python2}" == "1" ]]; then + die -q "'--pypy-c1' and '--python2' options cannot be specified simultaneously" + elif [[ "${pypy1}" == "1" && "${python3}" == "1" ]]; then + die -q "'--pypy-c1' and '--python3' options cannot be specified simultaneously" + fi + + # This reduceS by 3 lines + if [[ "${if_unset}" == "1" && -f "${INTERPRETER_PATH}python" && -f "${ENV_D_PATH}/python/config" ]]; then + if [[ "${pypy1}" == "1" && -f "${INTERPRETER_PATH}pypy1" ]]; then + if [[ "${python2}" == "1" && -f "${INTERPRETER_PATH}python2" ]]; then + if [[ "${python3}" == "1" && -f "${INTERPRETER_PATH}python3" ]]; then + if [[ "${python2}" == "0" && "${python3}" == "0" && "${pypy1}" == "0" ]]; then + return + fi + fi + fi + fi + fi + + if [[ "${pypy1}" == "1" ]]; then + interpreters="pypy-c1.?" + elif [[ "${python2}" == "1" ]]; then + interpreters="python2.?" + elif [[ "${python3}" == "1" ]]; then + interpreters="python3.?" + fi + + targets=($(cd "${INTERPRETER_PATH}"; ls ${interpreters} 2> /dev/null | sort -r)) + + # Ignore slots + for slot in ${ignored_slots[@]}; do + targets=(${targets[@]/python${slot}/}) + done + + if [[ ${#targets[@]} -gt 0 ]]; then + target=${targets[0]} + echo "Switching to ${target}" + do_set ${python_version_option} ${target} + else + die -q "No Python interpreter available" + fi +} + +# vim: set ft=eselect : |