Hello!

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:

  # EMERGE_DEFAULT_OPTS= emerge -1av =virtual/debug-eselect-python-2.7
  # eselect python set python2.6
  # EMERGE_DEFAULT_OPTS= emerge -1av =virtual/debug-eselect-python-2.7.1

The output of the third call is the interesting part, see attachment.
Besides my earlier mixup of

  eselect python set --pythonX pythonX.Y    # good

with

  eselect python set pythonX.Y --pythonX    # bad

the patch proposed earlier seems to be a promising approach.

Next I will apply this appraoch to dev-lang/python int the main tree.
I expect that to take no longer than two hours, hopefully less.

If you spot any practical problems with this please mail me ASAP.

Wish me luck so I don't break anything for worse.

Best,



Sebastian
# 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   \${active_python_2} = '${active_python_2}'"
        echo "DEBUG   \${active_python_3} = '${active_python_3}'"
        echo "DEBUG   \${active_python_main} = '${active_python_main}'"
        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)'"
}

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}

        restore_active_python_version
        ensure_python_symlink

        DEBUG_DUMP_ACTIVE After ${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...

Reply via email to