aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app-admin/eselect-python/ChangeLog7
-rw-r--r--app-admin/eselect-python/Manifest1
-rw-r--r--app-admin/eselect-python/eselect-python-20111108-r1.ebuild63
-rw-r--r--app-admin/eselect-python/files/python-eselect.patch378
-rw-r--r--app-admin/eselect-python/files/wrapper.patch25
-rw-r--r--app-admin/eselect-python/metadata.xml5
-rw-r--r--app-admin/eselect-python/python.eselect479
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 :