I have done a bit more testing now. To do so I have isolated the
eselect-python-update behavior into testing ebuilds (package
"virtual/debug-eselect-python") reduced to just that problem (no
compilation and the like, see attachment, also in sping overlay).
The test scenario is made of two halves: one half is an ebuild running
eselect python update on pkg_postrm (the 2.7 one, to emulate what users
may have still installed), the other is an ebuild with the
work-in-progress patch I plan to apply to dev-lang/python instrumented
with debugging output (the 2.7.1 one).
To recall, the goal is:
1) Having valid symlinks for /usr/bin/python
2) Keeping active Python versions untouched, i.e. reverting a change
by an ebuild calling eselect-python-update during pkg_postrm.
The test scenario is these three commands on a root shell:
save_active_python_version() {
active_python_2=$(eselect python show --python2)
active_python_3=$(eselect python show --python3)
active_python_main=$(eselect python show)
}
pkg_preinst() {
DEBUG_DUMP_ACTIVE Before ${FUNCNAME}
save_active_python_version
DEBUG_DUMP_ACTIVE After ${FUNCNAME}
}
ensure_python_symlink() {
if [[ -z "$(eselect python show --python${PV%%.*})" ]]; then
eselect python update --python${PV%%.*}
fi
}
restore_active_python_version() {
if [[ -n "${active_python_2}" &&
"${active_python_2}" != $(eselect python show --python2) ]] ; then
einfo "Restoring active Python 2.x interpreter: ${active_python_2}"
eselect python set --python2 "${active_python_2}"
fi
if [[ -n "${active_python_3}" &&
"${active_python_3}" != $(eselect python show --python3) ]] ; then
einfo "Restoring active Python 3.x interpreter: ${active_python_3}"
eselect python set --python3 "${active_python_3}"
fi
if [[ -n "${active_python_main}" &&
"${active_python_main}" != $(eselect python show) ]] ; then
einfo "Restoring main active Python interpreter: ${active_python_main}"
eselect python set "${active_python_main}"
fi
}
pkg_postinst() {
DEBUG_DUMP_ACTIVE Before ${FUNCNAME}
pkg_postrm() {
DEBUG_DUMP_ACTIVE Before ${FUNCNAME}
ensure_python_symlink
DEBUG_DUMP_ACTIVE After ${FUNCNAME}
}
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
EAPI="2"
SLOT="2.7"
KEYWORDS="amd64"
DEBUG_DUMP_ACTIVE() {
echo "DEBUG $1 $2 (slot ${SLOT}, version ${PV})"
echo "DEBUG $(eselect python show --python2) = '$(eselect python show --python2)'"
echo "DEBUG $(eselect python show --python3) = '$(eselect python show --python3)'"
echo "DEBUG $(eselect python show) = '$(eselect python show)'"
}
eselect_python_update() {
# Exaggerated to worst case: update of all active python versions
eselect python update --python2
eselect python update --python3
eselect python update
}
pkg_postinst() {
DEBUG_DUMP_ACTIVE Before ${FUNCNAME}
eselect_python_update
DEBUG_DUMP_ACTIVE After ${FUNCNAME}
}
pkg_postrm() {
DEBUG_DUMP_ACTIVE Before ${FUNCNAME}
eselect_python_update
DEBUG_DUMP_ACTIVE After ${FUNCNAME}
}
>>> Installing (1 of 1) virtual/debug-eselect-python-2.7.1
* checking 0 files for package collisions
DEBUG Before pkg_preinst (slot 2.7, version 2.7.1)
DEBUG ${active_python_2} = '
DEBUG ${active_python_3} = '
DEBUG ${active_python_main} = '
DEBUG $(eselect python show --python2) = 'python2.6'
DEBUG $(eselect python show --python3) = 'python3.1'
DEBUG $(eselect python show) = 'python2.6'
DEBUG After pkg_preinst (slot 2.7, version 2.7.1)
DEBUG ${active_python_2} = 'python2.6'
DEBUG ${active_python_3} = 'python3.1'
DEBUG ${active_python_main} = 'python2.6'
DEBUG $(eselect python show --python2) = 'python2.6'
DEBUG $(eselect python show --python3) = 'python3.1'
DEBUG $(eselect python show) = 'python2.6'
>>> Safely unmerging already-installed instance...
No package files given... Grabbing a set.
DEBUG Before pkg_postrm (slot 2.7, version 2.7)
DEBUG $(eselect python show --python2) = 'python2.6'
DEBUG $(eselect python show --python3) = 'python3.1'
DEBUG $(eselect python show) = 'python2.6'
Switching to python2.7 <---
Switching to python3.1 <---
Switching to python3.1 <---
DEBUG After pkg_postrm (slot 2.7, version 2.7)
DEBUG $(eselect python show --python2) = 'python2.7' <---
DEBUG $(eselect python show --python3) = 'python3.1'
DEBUG $(eselect python show) = 'python3.1' <---
>>> Original instance of package unmerged safely.
DEBUG Before pkg_postinst (slot 2.7, version 2.7.1)
DEBUG ${active_python_2} = 'python2.6'
DEBUG ${active_python_3} = 'python3.1'
DEBUG ${active_python_main} = 'python2.6'
DEBUG $(eselect python show --python2) = 'python2.7'
DEBUG $(eselect python show --python3) = 'python3.1'
DEBUG $(eselect python show) = 'python3.1'
* Restoring active Python 2.x interpreter: python2.6 <---
* Restoring main active Python interpreter: python2.6 <---
DEBUG After pkg_postinst (slot 2.7, version 2.7.1)
DEBUG ${active_python_2} = 'python2.6'
DEBUG ${active_python_3} = 'python3.1'
DEBUG ${active_python_main} = 'python2.6'
DEBUG $(eselect python show --python2) = 'python2.6' <---
DEBUG $(eselect python show --python3) = 'python3.1'
DEBUG $(eselect python show) = 'python2.6' <---
>>> Auto-cleaning packages...