diff options
-rwxr-xr-x | python-updater | 910 |
1 files changed, 455 insertions, 455 deletions
diff --git a/python-updater b/python-updater index 706bdb9..f4e2c5e 100755 --- a/python-updater +++ b/python-updater @@ -67,7 +67,7 @@ PKG_DBDIR=/var/db/pkg # usage() # display usage usage() { - cat <<EOF_USAGE + cat <<EOF_USAGE ${0##*/} -- Find & rebuild packages broken due to a Python upgrade Usage: python-updater [OPTION] @@ -84,9 +84,9 @@ Options: $(for p in ${SUPPORTED_PMS}; do echo -ne $'\t\t '\* ${p} if [[ ${p} == portage ]]; then - echo ' (Default)' + echo ' (Default)' else - echo + echo fi done) -c CMD, --command CMD @@ -115,51 +115,51 @@ EOF_USAGE # veinfo(verbosity, message) # einfo message if VERBOSE is bigger than verbosity. veinfo() { - if [[ VERBOSE -ge ${1} ]]; then - shift - einfo "${@}" - fi + if [[ VERBOSE -ge ${1} ]]; then + shift + einfo "${@}" + fi } # die(message) # Print error message and exit. die() { - eerror "${@}" - exit 1 + eerror "${@}" + exit 1 } # has_version(cpv) has_version() { - if [[ "${PMS_COMMAND[${PMS_INDEX}]}" == "emerge" ]]; then - /usr/bin/portageq has_version / "${1}" - elif [[ "${PMS_COMMAND[${PMS_INDEX}]}" == "pmerge" ]]; then - pquery --vdb "${1}" - else - cave has-version "${1}" - fi + if [[ "${PMS_COMMAND[${PMS_INDEX}]}" == "emerge" ]]; then + /usr/bin/portageq has_version / "${1}" + elif [[ "${PMS_COMMAND[${PMS_INDEX}]}" == "pmerge" ]]; then + pquery --vdb "${1}" + else + cave has-version "${1}" + fi } # get_vdb_variable(variable, environment_file) get_vdb_variable() { - local variable="${1}" - local environment_file="${2}" - - unset "${variable}" - local output - output="$(bzip2 -cd "${environment_file}" | grep -E "^declare (-[[:alnum:]-]+ )?${variable}=")" - if [[ -z "${output}" ]]; then - output="$(bzip2 -cd "${environment_file}" | grep -E "^(declare (-[[:alnum:]-]+ )?)?${variable}=")" - fi - if [[ -n "${output}" ]]; then - output="$(echo "${output}" | sed -e "s/^\(declare \(-[[:alnum:]-]\+ \)\?\)\?${variable}=\(\"\)\?//;s/\(\"\)\?$//")" - if [[ "${output}" == "'"*"'" ]]; then - output="${output:1:$((${#output}-2))}" - fi - eval "${variable}=\"\${output}\"" - return 0 - else - return 1 - fi + local variable="${1}" + local environment_file="${2}" + + unset "${variable}" + local output + output="$(bzip2 -cd "${environment_file}" | grep -E "^declare (-[[:alnum:]-]+ )?${variable}=")" + if [[ -z "${output}" ]]; then + output="$(bzip2 -cd "${environment_file}" | grep -E "^(declare (-[[:alnum:]-]+ )?)?${variable}=")" + fi + if [[ -n "${output}" ]]; then + output="$(echo "${output}" | sed -e "s/^\(declare \(-[[:alnum:]-]\+ \)\?\)\?${variable}=\(\"\)\?//;s/\(\"\)\?$//")" + if [[ "${output}" == "'"*"'" ]]; then + output="${output:1:$((${#output}-2))}" + fi + eval "${variable}=\"\${output}\"" + return 0 + else + return 1 + fi } # set_unless_changed(variable=value) @@ -201,245 +201,245 @@ global_USE_PYTHON="" # get_USE_PYTHON(CATEGORY, PN, SLOT) get_USE_PYTHON() { - if [[ "${PMS_COMMAND[${PMS_INDEX}]}" =~ ^(emerge|pmerge)$ ]]; then - if [[ -z "${global_USE_PYTHON}" ]]; then - global_USE_PYTHON="$(/usr/bin/portageq envvar USE_PYTHON)" - fi - USE_PYTHON="${global_USE_PYTHON}" - if [[ -f "/etc/portage/env/${1}/${2}" ]]; then - USE_PYTHON="$(. "/etc/portage/env/${1}/${2}"; echo "${USE_PYTHON}")" - fi - if [[ -f "/etc/portage/env/${1}/${2}:${3}" ]]; then - USE_PYTHON="$(. "/etc/portage/env/${1}/${2}:${3}"; echo "${USE_PYTHON}")" - fi - else - USE_PYTHON="$(cave print-id-environment-variable "${1}/${2}${3:+:}${3}::/?" --best --format %v --variable-name USE_PYTHON)" - fi - if [[ -z "${USE_PYTHON}" ]]; then - USE_PYTHON="${NEW_PYTHON2_VERSION} ${NEW_PYTHON3_VERSION}" - USE_PYTHON="${USE_PYTHON# }" - USE_PYTHON="${USE_PYTHON% }" - fi - echo "${USE_PYTHON}" + if [[ "${PMS_COMMAND[${PMS_INDEX}]}" =~ ^(emerge|pmerge)$ ]]; then + if [[ -z "${global_USE_PYTHON}" ]]; then + global_USE_PYTHON="$(/usr/bin/portageq envvar USE_PYTHON)" + fi + USE_PYTHON="${global_USE_PYTHON}" + if [[ -f "/etc/portage/env/${1}/${2}" ]]; then + USE_PYTHON="$(. "/etc/portage/env/${1}/${2}"; echo "${USE_PYTHON}")" + fi + if [[ -f "/etc/portage/env/${1}/${2}:${3}" ]]; then + USE_PYTHON="$(. "/etc/portage/env/${1}/${2}:${3}"; echo "${USE_PYTHON}")" + fi + else + USE_PYTHON="$(cave print-id-environment-variable "${1}/${2}${3:+:}${3}::/?" --best --format %v --variable-name USE_PYTHON)" + fi + if [[ -z "${USE_PYTHON}" ]]; then + USE_PYTHON="${NEW_PYTHON2_VERSION} ${NEW_PYTHON3_VERSION}" + USE_PYTHON="${USE_PYTHON# }" + USE_PYTHON="${USE_PYTHON% }" + fi + echo "${USE_PYTHON}" } # get_ebuild_path(CATEGORY, PN, SLOT) get_ebuild_path() { - # These manual calls to Portage API are 2 times faster than 'portageq get_repo_path / "$(portageq metadata / ebuild "$(portageq best_visible / "${1}")" repository)"'. - /usr/bin/python -c " + # These manual calls to Portage API are 2 times faster than 'portageq get_repo_path / "$(portageq metadata / ebuild "$(portageq best_visible / "${1}")" repository)"'. + /usr/bin/python -c " import sys if '' in sys.path: - sys.path.remove('') + sys.path.remove('') import portage dbapi = portage.db['/']['porttree'].dbapi pkg_list = dbapi.match('${1}/${2}${3:+:}${3}') if pkg_list: - best_visible = portage.best(pkg_list) - if best_visible: - repository = dbapi.aux_get(best_visible, ['repository']) - if repository: - repository_path = dbapi.getRepositoryPath(repository[0]) - if repository_path: - print(repository_path + '/${1}/${2}/' + best_visible.split('/')[1] + '.ebuild')" + best_visible = portage.best(pkg_list) + if best_visible: + repository = dbapi.aux_get(best_visible, ['repository']) + if repository: + repository_path = dbapi.getRepositoryPath(repository[0]) + if repository_path: + print(repository_path + '/${1}/${2}/' + best_visible.split('/')[1] + '.ebuild')" } # get_RESTRICT_PYTHON_ABIS(CATEGORY, PN, SLOT) get_RESTRICT_PYTHON_ABIS() { - if [[ "${PMS_COMMAND[${PMS_INDEX}]}" =~ ^(emerge|pmerge)$ ]]; then - local ebuild_path="$(get_ebuild_path "${1}" "${2}" "${3}")" - if [[ -f "${ebuild_path}" ]]; then - grep "^RESTRICT_PYTHON_ABIS=" "${ebuild_path}" | sed -e "s/RESTRICT_PYTHON_ABIS=[\"']\(.*\)[\"']/\1/" - fi - else - cave print-id-environment-variable "${1}/${2}${3:+:}${3}::/?" --best --format %v --variable-name RESTRICT_PYTHON_ABIS - fi + if [[ "${PMS_COMMAND[${PMS_INDEX}]}" =~ ^(emerge|pmerge)$ ]]; then + local ebuild_path="$(get_ebuild_path "${1}" "${2}" "${3}")" + if [[ -f "${ebuild_path}" ]]; then + grep "^RESTRICT_PYTHON_ABIS=" "${ebuild_path}" | sed -e "s/RESTRICT_PYTHON_ABIS=[\"']\(.*\)[\"']/\1/" + fi + else + cave print-id-environment-variable "${1}/${2}${3:+:}${3}::/?" --best --format %v --variable-name RESTRICT_PYTHON_ABIS + fi } # check_python_abi_matching(PYTHON_ABI, PYTHON_ABI_pattern) check_python_abi_matching() { - if [[ "$2" == *"-cpython" ]]; then - [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ && "$1" == ${2%-cpython} ]] - elif [[ "$2" == *"-jython" ]]; then - [[ "$1" == $2 ]] - else - if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then - [[ "$1" == $2 ]] - elif [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then - [[ "${1%-jython}" == $2 ]] - else - die "Unrecognized Python ABI '$1'" - fi - fi + if [[ "$2" == *"-cpython" ]]; then + [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ && "$1" == ${2%-cpython} ]] + elif [[ "$2" == *"-jython" ]]; then + [[ "$1" == $2 ]] + else + if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then + [[ "$1" == $2 ]] + elif [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then + [[ "${1%-jython}" == $2 ]] + else + die "Unrecognized Python ABI '$1'" + fi + fi } # get_OLD_PYTHON_VERSIONS_REGEX() get_OLD_PYTHON_VERSIONS_REGEX() { - if [[ -n "${PYTHON_REQUESTED_ACTIVE_VERSION}" ]]; then - if [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" == "2" ]]; then - echo "${OLD_PYTHON2_VERSIONS_REGEX}" - elif [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" == "3" ]]; then - echo "${OLD_PYTHON3_VERSIONS_REGEX}" - fi - else - echo "${OLD_PYTHON_VERSIONS_REGEX}" - fi + if [[ -n "${PYTHON_REQUESTED_ACTIVE_VERSION}" ]]; then + if [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" == "2" ]]; then + echo "${OLD_PYTHON2_VERSIONS_REGEX}" + elif [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" == "3" ]]; then + echo "${OLD_PYTHON3_VERSIONS_REGEX}" + fi + else + echo "${OLD_PYTHON_VERSIONS_REGEX}" + fi } # get_OLD_PYTHON_SHARED_LIBRARIES_REGEX() get_OLD_PYTHON_SHARED_LIBRARIES_REGEX() { - if [[ -n "${PYTHON_REQUESTED_ACTIVE_VERSION}" ]]; then - if [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" == "2" ]]; then - echo "${OLD_PYTHON2_SHARED_LIBRARIES_REGEX}" - elif [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" == "3" ]]; then - echo "${OLD_PYTHON3_SHARED_LIBRARIES_REGEX}" - fi - else - echo "${OLD_PYTHON_SHARED_LIBRARIES_REGEX}" - fi + if [[ -n "${PYTHON_REQUESTED_ACTIVE_VERSION}" ]]; then + if [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" == "2" ]]; then + echo "${OLD_PYTHON2_SHARED_LIBRARIES_REGEX}" + elif [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" == "3" ]]; then + echo "${OLD_PYTHON3_SHARED_LIBRARIES_REGEX}" + fi + else + echo "${OLD_PYTHON_SHARED_LIBRARIES_REGEX}" + fi } # Respect PYUPDATER_OPTIONS if [[ -n "${PYUPDATER_OPTIONS}" ]]; then - set -- ${PYUPDATER_OPTIONS} "${@}" + set -- ${PYUPDATER_OPTIONS} "${@}" fi # Respect PACKAGE_MANAGER environment variable i=0 for pm in ${SUPPORTED_PMS}; do - if [[ "${pm}" == "${PACKAGE_MANAGER}" ]]; then - PMS_INDEX="${i}" - break - fi - ((i++)) + if [[ "${pm}" == "${PACKAGE_MANAGER}" ]]; then + PMS_INDEX="${i}" + break + fi + ((i++)) done # Command Line Parsing while [[ -n "${1}" ]]; do - case "${1}" in - -h|--help) - usage - exit 0 - ;; - -V|--version) - echo "${VERSION}" - exit 0 - ;; - -p|--pretend) - PRETEND=1 - ;; - -v|--verbose) - ((VERBOSE++)) - ;; - --reinstall-identical-versions) - REINSTALL_IDENTICAL_VERSIONS=1 - ;; - -P|--package-manager) - shift - PACKAGE_MANAGER="${1}" - case "${PACKAGE_MANAGER}" in - portage|pkgcore|paludis) - ;; - *) - echo "Unrecognized package manager selected. Please select between ${SUPPORTED_PMS}" - exit 1 - ;; - esac - - # PMS_INDEX is used to select the right commands and options for the selected package manager - PMS_INDEX=0 - for PM in ${SUPPORTED_PMS}; do - [[ ${PM} == ${PACKAGE_MANAGER} ]] && break - PMS_INDEX=$((${PMS_INDEX} + 1)) - done - ;; - --package-manager-command) - shift - CUSTOM_PMS_COMMAND="${1}" - ;; - -c|--command) - shift - PIPE_COMMAND="${1}" - ;; - -emanual|--enable-manual) - CHECK_MANUAL=1 - ;; - -dmanual|--disable-manual) - CHECK_MANUAL=0 - ;; - -ePYTHON_ABIS|--enable-PYTHON_ABIS) - CHECK_PYTHON_ABIS=1 - ;; - -dPYTHON_ABIS|--disable-PYTHON_ABIS) - CHECK_PYTHON_ABIS=0 - ;; - -epylibdir|--enable-pylibdir) - CHECK_PYLIBDIR=1 - ;; - -dpylibdir|--disable-pylibdir) - CHECK_PYLIBDIR=0 - ;; - -eshared_linking|--enable-shared_linking) - CHECK_SHARED_LINKING=1 - ;; - -dshared_linking|--disable-shared_linking) - CHECK_SHARED_LINKING=0 - ;; - -estatic_linking|--enable-static_linking) - CHECK_STATIC_LINKING=1 - ;; - -dstatic_linking|--disable-static_linking) - CHECK_STATIC_LINKING=0 - ;; - -eneed_rebuild|--enable-need_rebuild) - CHECK_ECLASS_NEED_REBUILD=1 - ;; - -dneed_rebuild|--disable-need_rebuild) - CHECK_ECLASS_NEED_REBUILD=0 - ;; - --) - shift - ADDITIONAL_OPTIONS="${*}" - break - ;; - *) - usage - echo "Unrecognized option '${1}'" - exit 1 - ;; - esac - shift + case "${1}" in + -h|--help) + usage + exit 0 + ;; + -V|--version) + echo "${VERSION}" + exit 0 + ;; + -p|--pretend) + PRETEND=1 + ;; + -v|--verbose) + ((VERBOSE++)) + ;; + --reinstall-identical-versions) + REINSTALL_IDENTICAL_VERSIONS=1 + ;; + -P|--package-manager) + shift + PACKAGE_MANAGER="${1}" + case "${PACKAGE_MANAGER}" in + portage|pkgcore|paludis) + ;; + *) + echo "Unrecognized package manager selected. Please select between ${SUPPORTED_PMS}" + exit 1 + ;; + esac + + # PMS_INDEX is used to select the right commands and options for the selected package manager + PMS_INDEX=0 + for PM in ${SUPPORTED_PMS}; do + [[ ${PM} == ${PACKAGE_MANAGER} ]] && break + PMS_INDEX=$((${PMS_INDEX} + 1)) + done + ;; + --package-manager-command) + shift + CUSTOM_PMS_COMMAND="${1}" + ;; + -c|--command) + shift + PIPE_COMMAND="${1}" + ;; + -emanual|--enable-manual) + CHECK_MANUAL=1 + ;; + -dmanual|--disable-manual) + CHECK_MANUAL=0 + ;; + -ePYTHON_ABIS|--enable-PYTHON_ABIS) + CHECK_PYTHON_ABIS=1 + ;; + -dPYTHON_ABIS|--disable-PYTHON_ABIS) + CHECK_PYTHON_ABIS=0 + ;; + -epylibdir|--enable-pylibdir) + CHECK_PYLIBDIR=1 + ;; + -dpylibdir|--disable-pylibdir) + CHECK_PYLIBDIR=0 + ;; + -eshared_linking|--enable-shared_linking) + CHECK_SHARED_LINKING=1 + ;; + -dshared_linking|--disable-shared_linking) + CHECK_SHARED_LINKING=0 + ;; + -estatic_linking|--enable-static_linking) + CHECK_STATIC_LINKING=1 + ;; + -dstatic_linking|--disable-static_linking) + CHECK_STATIC_LINKING=0 + ;; + -eneed_rebuild|--enable-need_rebuild) + CHECK_ECLASS_NEED_REBUILD=1 + ;; + -dneed_rebuild|--disable-need_rebuild) + CHECK_ECLASS_NEED_REBUILD=0 + ;; + --) + shift + ADDITIONAL_OPTIONS="${*}" + break + ;; + *) + usage + echo "Unrecognized option '${1}'" + exit 1 + ;; + esac + shift done if has_version "=dev-lang/python-2*"; then - if [[ "$(readlink /usr/bin/python2)" != "python2."* ]]; then - die "'/usr/bin/python2' is not valid symlink" - fi - NEW_PYTHON2_VERSION="$(/usr/bin/python2 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" + if [[ "$(readlink /usr/bin/python2)" != "python2."* ]]; then + die "'/usr/bin/python2' is not valid symlink" + fi + NEW_PYTHON2_VERSION="$(/usr/bin/python2 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" fi if has_version "=dev-lang/python-3*"; then - if [[ "$(readlink /usr/bin/python3)" != "python3."* ]]; then - die "'/usr/bin/python3' is not valid symlink" - fi - NEW_PYTHON3_VERSION="$(/usr/bin/python3 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" + if [[ "$(readlink /usr/bin/python3)" != "python3."* ]]; then + die "'/usr/bin/python3' is not valid symlink" + fi + NEW_PYTHON3_VERSION="$(/usr/bin/python3 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" fi if [[ -z "${NEW_PYTHON2_VERSION}" && -z "${NEW_PYTHON3_VERSION}" ]]; then - die "Python 2 and Python 3 not installed" + die "Python 2 and Python 3 not installed" fi OLD_PYTHON_SHARED_LIBRARIES_REGEX="" for python_version in ${PYTHON_VERSIONS}; do - if [[ "${python_version}" != "${NEW_PYTHON_VERSION}" ]]; then - OLD_PYTHON_VERSIONS+="${OLD_PYTHON_VERSIONS:+ }${python_version}" - soname="$(readlink -n /usr/lib/libpython${python_version}.so)" - if [[ -z "${soname}" ]]; then - # Use relatively safe, default value. - soname="libpython${python_version}.so.1.0" - fi - OLD_PYTHON_SHARED_LIBRARIES_REGEX+="${OLD_PYTHON_SHARED_LIBRARIES_REGEX:+|}${soname//./\.}" - fi + if [[ "${python_version}" != "${NEW_PYTHON_VERSION}" ]]; then + OLD_PYTHON_VERSIONS+="${OLD_PYTHON_VERSIONS:+ }${python_version}" + soname="$(readlink -n /usr/lib/libpython${python_version}.so)" + if [[ -z "${soname}" ]]; then + # Use relatively safe, default value. + soname="libpython${python_version}.so.1.0" + fi + OLD_PYTHON_SHARED_LIBRARIES_REGEX+="${OLD_PYTHON_SHARED_LIBRARIES_REGEX:+|}${soname//./\.}" + fi done OLD_PYTHON_VERSIONS_REGEX="(${OLD_PYTHON_VERSIONS// /|})" OLD_PYTHON_VERSIONS_REGEX="${OLD_PYTHON_VERSIONS_REGEX//./\.}" @@ -447,15 +447,15 @@ OLD_PYTHON_SHARED_LIBRARIES_REGEX="(${OLD_PYTHON_SHARED_LIBRARIES_REGEX})" OLD_PYTHON2_SHARED_LIBRARIES_REGEX="" for python_version in ${PYTHON2_VERSIONS}; do - if [[ "${python_version}" != "${NEW_PYTHON2_VERSION}" ]]; then - OLD_PYTHON2_VERSIONS+="${OLD_PYTHON2_VERSIONS:+ }${python_version}" - soname="$(readlink -n /usr/lib/libpython${python_version}.so)" - if [[ -z "${soname}" ]]; then - # Use relatively safe, default value. - soname="libpython${python_version}.so.1.0" - fi - OLD_PYTHON2_SHARED_LIBRARIES_REGEX+="${OLD_PYTHON2_SHARED_LIBRARIES_REGEX:+|}${soname//./\.}" - fi + if [[ "${python_version}" != "${NEW_PYTHON2_VERSION}" ]]; then + OLD_PYTHON2_VERSIONS+="${OLD_PYTHON2_VERSIONS:+ }${python_version}" + soname="$(readlink -n /usr/lib/libpython${python_version}.so)" + if [[ -z "${soname}" ]]; then + # Use relatively safe, default value. + soname="libpython${python_version}.so.1.0" + fi + OLD_PYTHON2_SHARED_LIBRARIES_REGEX+="${OLD_PYTHON2_SHARED_LIBRARIES_REGEX:+|}${soname//./\.}" + fi done OLD_PYTHON2_VERSIONS_REGEX="(${OLD_PYTHON2_VERSIONS// /|})" OLD_PYTHON2_VERSIONS_REGEX="${OLD_PYTHON2_VERSIONS_REGEX//./\.}" @@ -463,15 +463,15 @@ OLD_PYTHON2_SHARED_LIBRARIES_REGEX="(${OLD_PYTHON2_SHARED_LIBRARIES_REGEX})" OLD_PYTHON3_SHARED_LIBRARIES_REGEX="" for python_version in ${PYTHON3_VERSIONS}; do - if [[ "${python_version}" != "${NEW_PYTHON3_VERSION}" ]]; then - OLD_PYTHON3_VERSIONS+="${OLD_PYTHON3_VERSIONS:+ }${python_version}" - soname="$(readlink -n /usr/lib/libpython${python_version}.so)" - if [[ -z "${soname}" ]]; then - # Use relatively safe, default value. - soname="libpython${python_version}.so.1.0" - fi - OLD_PYTHON3_SHARED_LIBRARIES_REGEX+="${OLD_PYTHON3_SHARED_LIBRARIES_REGEX:+|}${soname//./\.}" - fi + if [[ "${python_version}" != "${NEW_PYTHON3_VERSION}" ]]; then + OLD_PYTHON3_VERSIONS+="${OLD_PYTHON3_VERSIONS:+ }${python_version}" + soname="$(readlink -n /usr/lib/libpython${python_version}.so)" + if [[ -z "${soname}" ]]; then + # Use relatively safe, default value. + soname="libpython${python_version}.so.1.0" + fi + OLD_PYTHON3_SHARED_LIBRARIES_REGEX+="${OLD_PYTHON3_SHARED_LIBRARIES_REGEX:+|}${soname//./\.}" + fi done OLD_PYTHON3_VERSIONS_REGEX="(${OLD_PYTHON3_VERSIONS// /|})" OLD_PYTHON3_VERSIONS_REGEX="${OLD_PYTHON3_VERSIONS_REGEX//./\.}" @@ -483,235 +483,235 @@ einfo $'\e[1;36m'"Active version of Python 2: ${NEW_PYTHON2_VERSION:-(None)} einfo $'\e[1;36m'"Active version of Python 3: ${NEW_PYTHON3_VERSION:-(None)}"$'\e[0m' if [[ CHECK_SHARED_LINKING -ne 0 ]]; then - if ! type -P scanelf >/dev/null 2>&1; then - ewarn "scanelf not found!" - ewarn "check shared_linking is disabled." - CHECK_SHARED_LINKING=0 - else - veinfo 1 'check "shared_linking" enabled.' - fi + if ! type -P scanelf >/dev/null 2>&1; then + ewarn "scanelf not found!" + ewarn "check shared_linking is disabled." + CHECK_SHARED_LINKING=0 + else + veinfo 1 'check "shared_linking" enabled.' + fi else - veinfo 1 'check "shared_linking" disabled.' + veinfo 1 'check "shared_linking" disabled.' fi if [[ CHECK_STATIC_LINKING -ne 0 ]]; then - if ! type -P scanelf >/dev/null 2>&1; then - ewarn "scanelf not found!" - ewarn "check static_linking is disabled." - CHECK_STATIC_LINKING=0 - else - veinfo 1 'check "static_linking" enabled.' - fi + if ! type -P scanelf >/dev/null 2>&1; then + ewarn "scanelf not found!" + ewarn "check static_linking is disabled." + CHECK_STATIC_LINKING=0 + else + veinfo 1 'check "static_linking" enabled.' + fi else - veinfo 1 'check "static_linking" disabled.' + veinfo 1 'check "static_linking" disabled.' fi [[ CHECK_PYLIBDIR -ne 0 ]] \ - && veinfo 1 'check "pylibdir" enabled.' \ - || veinfo 1 'check "pylibdir" disabled.' + && veinfo 1 'check "pylibdir" enabled.' \ + || veinfo 1 'check "pylibdir" disabled.' [[ CHECK_MANUAL -ne 0 ]] \ - && veinfo 1 'check "manual" enabled.' \ - || veinfo 1 'check "manual" disabled.' + && veinfo 1 'check "manual" enabled.' \ + || veinfo 1 'check "manual" disabled.' [[ CHECK_ECLASS_NEED_REBUILD -ne 0 ]] \ - && veinfo 1 'check "need_rebuild" enabled.' \ - || veinfo 1 'check "need_rebuild" disabled.' + && veinfo 1 'check "need_rebuild" enabled.' \ + || veinfo 1 'check "need_rebuild" disabled.' # Iterate through the contents of all the installed packages. # ${PKG_DBDIR} must be followed by '/' to avoid problems when ${PKG_DBDIR} is a symlink. for content in $(find ${PKG_DBDIR}/ -name CONTENTS | sort); do - environment_file="${content/CONTENTS/environment.bz2}" - - # Extract some variables. SUPPORT_PYTHON_ABIS, PYTHON_ABIS and PYTHON_REQUESTED_ACTIVE_VERSION are optional. - get_vdb_variable PVR "${environment_file}" || die "Missing metadata in '${environment_file}' file. Manually reinstall corresponding package." - get_vdb_variable SUPPORT_PYTHON_ABIS "${environment_file}" - get_vdb_variable PYTHON_ABIS "${environment_file}" - get_vdb_variable PYTHON_REQUESTED_ACTIVE_VERSION "${environment_file}" - - # Manually calculate CATEGORY, PF, PN and SLOT to avoid problems with moved packages. - CATEGORY="$(echo "${environment_file#${PKG_DBDIR}/}" | sed -e "s:/.*::")" - PF="$(echo "${environment_file#${PKG_DBDIR}/${CATEGORY}/}" | sed -e "s:/.*::")" - PN="${PF%-${PVR}}" - if [[ -f "${content/CONTENTS/SLOT}" ]]; then - SLOT="$(<"${content/CONTENTS/SLOT}")" - else - get_vdb_variable SLOT "${environment_file}" - fi - - CATPKG="${CATEGORY}/${PN}" - CATPKGVER="${CATEGORY}/${PF}" - veinfo 2 "Checking ${CATEGORY}/${PF}${SLOT:+:}${SLOT}" - - # Exclude packages that are exceptions, like Portage and Python itself. - exception=0 - for exp in ${PKGS_EXCEPTIONS}; do - if [[ -z "${CATPKG##${exp}}" ]]; then - veinfo 2 "Skipping ${CATPKG}, reason: exception" - exception=1 - break; - fi - done - - [[ ${exception} == 1 ]] && continue - - # Check if package is in PKGS_MANUAL - if [[ CHECK_MANUAL -ne 0 ]]; then - for pkg in ${PKGS_MANUAL}; do - if [[ -z "${CATPKG##${pkg}}" ]]; then - exception=2 - break; - fi - done - fi - - # Replace SLOT by version number when REINSTALL_IDENTICAL_VERSIONS == 1 - # Reinstall identical versions when SLOT doesn't exist, bug #201848 - if [[ REINSTALL_IDENTICAL_VERSIONS -eq 1 || -z "${SLOT}" ]]; then - CATPKGVER="=${CATPKGVER}" - else - CATPKGVER="${CATPKG}:${SLOT}" - fi - - if [[ ${exception} = 2 ]]; then - PKGS_TO_REMERGE+=" ${CATPKGVER}" - eindent - einfo "Adding to list: ${CATPKGVER}" - eindent - einfo "check: manual [Added to list manually, see CHECKS in manpage for more information.]" - eoutdent && eoutdent - continue - fi - - if [[ CHECK_PYTHON_ABIS -ne 0 ]]; then - if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then - new_PYTHON_ABIS="" - RESTRICT_PYTHON_ABIS="$(get_RESTRICT_PYTHON_ABIS "${CATEGORY}" "${PN}" "${SLOT}")" - USE_PYTHON="$(get_USE_PYTHON "${CATEGORY}" "${PN}" "${SLOT}")" - for PYTHON_ABI in ${USE_PYTHON}; do - support_ABI="1" - for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do - if check_python_abi_matching "${PYTHON_ABI}" "${restricted_ABI}"; then - support_ABI="0" - break - fi - done - [[ "${support_ABI}" == "1" ]] && new_PYTHON_ABIS+="${new_PYTHON_ABIS:+ }${PYTHON_ABI}" - done - eindent && eindent - veinfo 3 "Requested ABIs: \"${USE_PYTHON}\"" - veinfo 3 "Restricted ABIs: \"${RESTRICT_PYTHON_ABIS}\"" - veinfo 3 "Previously enabled ABIs: \"${PYTHON_ABIS}\"" - veinfo 3 "Newly enabled ABIs: \"${new_PYTHON_ABIS}\"" - eoutdent && eoutdent - if [[ "${PYTHON_ABIS}" != "${new_PYTHON_ABIS}" ]]; then - PKGS_TO_REMERGE+=" ${CATPKGVER}" - eindent - einfo "Adding to list: ${CATPKGVER}" - eindent - veinfo 1 "check: PYTHON_ABIS [ Previous Python ABIs: ${PYTHON_ABIS}, new Python ABIs: ${new_PYTHON_ABIS} ]" - eoutdent && eoutdent - continue - fi - # Don't run other checks if PYTHON_ABIS check has been run. - continue - fi - fi - - if [[ CHECK_STATIC_LINKING -ne 0 ]]; then - binaries="$(scanelf -qs +Py_Initialize < <(grep -E "^obj" "${content}" | cut -d" " -f2 | grep -Ev "^/usr/lib(32|64)?/debug/") | sed "s/.* //")" - if [[ -n "${binaries}" ]]; then - PKGS_TO_REMERGE+=" ${CATPKGVER}" - eindent - einfo "Adding to list: ${CATPKGVER}" - eindent - veinfo 1 "check: static_linking [ Binaries linked against Python static libraries found:" - eindent - old_IFS="${IFS}" - IFS=$'\n' - for binary in ${binaries}; do - veinfo 1 "${binary}" - done - IFS="${old_IFS}" - eoutdent - veinfo 1 "]" - eoutdent && eoutdent - fi - fi - - if [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then - eindent && eindent - veinfo 2 "Requested active version of Python: \"${PYTHON_REQUESTED_ACTIVE_VERSION}\"" - eoutdent && eoutdent - # Don't run other checks if given package has been built with precisely specified requested active version of Python. - continue - fi - - if [[ CHECK_ECLASS_NEED_REBUILD -ne 0 ]]; then - get_vdb_variable PYTHON_NEED_REBUILD "${environment_file}" - if echo "${PYTHON_NEED_REBUILD}" | grep -qE "$(get_OLD_PYTHON_VERSIONS_REGEX)"; then - PKGS_TO_REMERGE+=" ${CATPKGVER}" - eindent - einfo "Adding to list: ${CATPKGVER}" - eindent - veinfo 1 "check: need_rebuild [ Ebuild set PYTHON_NEED_REBUILD=${PYTHON_NEED_REBUILD} ]" - eoutdent && eoutdent - continue - fi - fi - - if [[ CHECK_PYLIBDIR -ne 0 ]]; then - # Search for possible old Python dirs in CONTENTS - # /usr/include/python$old - # /usr/lib/python$old - # /usr/lib32/python$old - # /usr/lib64/python$old - if grep -qE "/usr/(include|lib(32|64)?)/python$(get_OLD_PYTHON_VERSIONS_REGEX)" "${content}"; then - PKGS_TO_REMERGE+=" ${CATPKGVER}" - eindent - einfo "Adding to list: ${CATPKGVER}" - eindent - veinfo 1 "check: pylibdir [ Installed file under old Python include/library directory ]" - eoutdent && eoutdent - continue - fi - fi - - if [[ CHECK_SHARED_LINKING -ne 0 ]]; then - binaries="$(scanelf -qF "%F %n" < <(grep -E "^obj" "${content}" | cut -d" " -f2 | grep -Ev "^/usr/lib(32|64)?/debug/") | grep -E "( |,)$(get_OLD_PYTHON_SHARED_LIBRARIES_REGEX)(,|$)")" - if [[ -n "${binaries}" ]]; then - PKGS_TO_REMERGE+=" ${CATPKGVER}" - eindent - einfo "Adding to list: ${CATPKGVER}" - eindent - veinfo 1 "check: shared_linking [ Binaries linked against old Python shared libraries found:" - eindent - old_IFS="${IFS}" - IFS=$'\n' - for binary in ${binaries}; do - veinfo 1 "${binary}" - done - IFS="${old_IFS}" - eoutdent - veinfo 1 "]" - eoutdent && eoutdent - fi - fi + environment_file="${content/CONTENTS/environment.bz2}" + + # Extract some variables. SUPPORT_PYTHON_ABIS, PYTHON_ABIS and PYTHON_REQUESTED_ACTIVE_VERSION are optional. + get_vdb_variable PVR "${environment_file}" || die "Missing metadata in '${environment_file}' file. Manually reinstall corresponding package." + get_vdb_variable SUPPORT_PYTHON_ABIS "${environment_file}" + get_vdb_variable PYTHON_ABIS "${environment_file}" + get_vdb_variable PYTHON_REQUESTED_ACTIVE_VERSION "${environment_file}" + + # Manually calculate CATEGORY, PF, PN and SLOT to avoid problems with moved packages. + CATEGORY="$(echo "${environment_file#${PKG_DBDIR}/}" | sed -e "s:/.*::")" + PF="$(echo "${environment_file#${PKG_DBDIR}/${CATEGORY}/}" | sed -e "s:/.*::")" + PN="${PF%-${PVR}}" + if [[ -f "${content/CONTENTS/SLOT}" ]]; then + SLOT="$(<"${content/CONTENTS/SLOT}")" + else + get_vdb_variable SLOT "${environment_file}" + fi + + CATPKG="${CATEGORY}/${PN}" + CATPKGVER="${CATEGORY}/${PF}" + veinfo 2 "Checking ${CATEGORY}/${PF}${SLOT:+:}${SLOT}" + + # Exclude packages that are exceptions, like Portage and Python itself. + exception=0 + for exp in ${PKGS_EXCEPTIONS}; do + if [[ -z "${CATPKG##${exp}}" ]]; then + veinfo 2 "Skipping ${CATPKG}, reason: exception" + exception=1 + break; + fi + done + + [[ ${exception} == 1 ]] && continue + + # Check if package is in PKGS_MANUAL + if [[ CHECK_MANUAL -ne 0 ]]; then + for pkg in ${PKGS_MANUAL}; do + if [[ -z "${CATPKG##${pkg}}" ]]; then + exception=2 + break; + fi + done + fi + + # Replace SLOT by version number when REINSTALL_IDENTICAL_VERSIONS == 1 + # Reinstall identical versions when SLOT doesn't exist, bug #201848 + if [[ REINSTALL_IDENTICAL_VERSIONS -eq 1 || -z "${SLOT}" ]]; then + CATPKGVER="=${CATPKGVER}" + else + CATPKGVER="${CATPKG}:${SLOT}" + fi + + if [[ ${exception} = 2 ]]; then + PKGS_TO_REMERGE+=" ${CATPKGVER}" + eindent + einfo "Adding to list: ${CATPKGVER}" + eindent + einfo "check: manual [Added to list manually, see CHECKS in manpage for more information.]" + eoutdent && eoutdent + continue + fi + + if [[ CHECK_PYTHON_ABIS -ne 0 ]]; then + if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then + new_PYTHON_ABIS="" + RESTRICT_PYTHON_ABIS="$(get_RESTRICT_PYTHON_ABIS "${CATEGORY}" "${PN}" "${SLOT}")" + USE_PYTHON="$(get_USE_PYTHON "${CATEGORY}" "${PN}" "${SLOT}")" + for PYTHON_ABI in ${USE_PYTHON}; do + support_ABI="1" + for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do + if check_python_abi_matching "${PYTHON_ABI}" "${restricted_ABI}"; then + support_ABI="0" + break + fi + done + [[ "${support_ABI}" == "1" ]] && new_PYTHON_ABIS+="${new_PYTHON_ABIS:+ }${PYTHON_ABI}" + done + eindent && eindent + veinfo 3 "Requested ABIs: \"${USE_PYTHON}\"" + veinfo 3 "Restricted ABIs: \"${RESTRICT_PYTHON_ABIS}\"" + veinfo 3 "Previously enabled ABIs: \"${PYTHON_ABIS}\"" + veinfo 3 "Newly enabled ABIs: \"${new_PYTHON_ABIS}\"" + eoutdent && eoutdent + if [[ "${PYTHON_ABIS}" != "${new_PYTHON_ABIS}" ]]; then + PKGS_TO_REMERGE+=" ${CATPKGVER}" + eindent + einfo "Adding to list: ${CATPKGVER}" + eindent + veinfo 1 "check: PYTHON_ABIS [ Previous Python ABIs: ${PYTHON_ABIS}, new Python ABIs: ${new_PYTHON_ABIS} ]" + eoutdent && eoutdent + continue + fi + # Don't run other checks if PYTHON_ABIS check has been run. + continue + fi + fi + + if [[ CHECK_STATIC_LINKING -ne 0 ]]; then + binaries="$(scanelf -qs +Py_Initialize < <(grep -E "^obj" "${content}" | cut -d" " -f2 | grep -Ev "^/usr/lib(32|64)?/debug/") | sed "s/.* //")" + if [[ -n "${binaries}" ]]; then + PKGS_TO_REMERGE+=" ${CATPKGVER}" + eindent + einfo "Adding to list: ${CATPKGVER}" + eindent + veinfo 1 "check: static_linking [ Binaries linked against Python static libraries found:" + eindent + old_IFS="${IFS}" + IFS=$'\n' + for binary in ${binaries}; do + veinfo 1 "${binary}" + done + IFS="${old_IFS}" + eoutdent + veinfo 1 "]" + eoutdent && eoutdent + fi + fi + + if [[ "${PYTHON_REQUESTED_ACTIVE_VERSION}" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then + eindent && eindent + veinfo 2 "Requested active version of Python: \"${PYTHON_REQUESTED_ACTIVE_VERSION}\"" + eoutdent && eoutdent + # Don't run other checks if given package has been built with precisely specified requested active version of Python. + continue + fi + + if [[ CHECK_ECLASS_NEED_REBUILD -ne 0 ]]; then + get_vdb_variable PYTHON_NEED_REBUILD "${environment_file}" + if echo "${PYTHON_NEED_REBUILD}" | grep -qE "$(get_OLD_PYTHON_VERSIONS_REGEX)"; then + PKGS_TO_REMERGE+=" ${CATPKGVER}" + eindent + einfo "Adding to list: ${CATPKGVER}" + eindent + veinfo 1 "check: need_rebuild [ Ebuild set PYTHON_NEED_REBUILD=${PYTHON_NEED_REBUILD} ]" + eoutdent && eoutdent + continue + fi + fi + + if [[ CHECK_PYLIBDIR -ne 0 ]]; then + # Search for possible old Python dirs in CONTENTS + # /usr/include/python$old + # /usr/lib/python$old + # /usr/lib32/python$old + # /usr/lib64/python$old + if grep -qE "/usr/(include|lib(32|64)?)/python$(get_OLD_PYTHON_VERSIONS_REGEX)" "${content}"; then + PKGS_TO_REMERGE+=" ${CATPKGVER}" + eindent + einfo "Adding to list: ${CATPKGVER}" + eindent + veinfo 1 "check: pylibdir [ Installed file under old Python include/library directory ]" + eoutdent && eoutdent + continue + fi + fi + + if [[ CHECK_SHARED_LINKING -ne 0 ]]; then + binaries="$(scanelf -qF "%F %n" < <(grep -E "^obj" "${content}" | cut -d" " -f2 | grep -Ev "^/usr/lib(32|64)?/debug/") | grep -E "( |,)$(get_OLD_PYTHON_SHARED_LIBRARIES_REGEX)(,|$)")" + if [[ -n "${binaries}" ]]; then + PKGS_TO_REMERGE+=" ${CATPKGVER}" + eindent + einfo "Adding to list: ${CATPKGVER}" + eindent + veinfo 1 "check: shared_linking [ Binaries linked against old Python shared libraries found:" + eindent + old_IFS="${IFS}" + IFS=$'\n' + for binary in ${binaries}; do + veinfo 1 "${binary}" + done + IFS="${old_IFS}" + eoutdent + veinfo 1 "]" + eoutdent && eoutdent + fi + fi done # Pipe to command if we have one if [[ -n "${PIPE_COMMAND}" ]]; then - echo "${PKGS_TO_REMERGE}" | ${PIPE_COMMAND} - exit "${?}" + echo "${PKGS_TO_REMERGE}" | ${PIPE_COMMAND} + exit "${?}" fi if [[ "${PMS_COMMAND[${PMS_INDEX}]}" == "emerge" ]] ; then - # Filter out --getbinpkg, --getbinpkgonly, --usepkg and --usepkgonly options in EMERGE_DEFAULT_OPTS environment variable - emerge_default_opts="" - for option in $(/usr/bin/portageq envvar EMERGE_DEFAULT_OPTS); do - if [[ "${option}" == -[[:alnum:]]* ]]; then - [[ "${option//[gGkK]/}" != "-" ]] && emerge_default_opts+=" ${option//[gGkK]/}" - elif [[ "${option}" != "--getbinpkg" && "${option}" != "--getbinpkgonly" && "${option}" != "--usepkg" && "${option}" != "--usepkgonly" ]]; then - emerge_default_opts+=" ${option}" - fi - done - export EMERGE_DEFAULT_OPTS="${emerge_default_opts# }" + # Filter out --getbinpkg, --getbinpkgonly, --usepkg and --usepkgonly options in EMERGE_DEFAULT_OPTS environment variable + emerge_default_opts="" + for option in $(/usr/bin/portageq envvar EMERGE_DEFAULT_OPTS); do + if [[ "${option}" == -[[:alnum:]]* ]]; then + [[ "${option//[gGkK]/}" != "-" ]] && emerge_default_opts+=" ${option//[gGkK]/}" + elif [[ "${option}" != "--getbinpkg" && "${option}" != "--getbinpkgonly" && "${option}" != "--usepkg" && "${option}" != "--usepkgonly" ]]; then + emerge_default_opts+=" ${option}" + fi + done + export EMERGE_DEFAULT_OPTS="${emerge_default_opts# }" fi # Only pretending? @@ -719,11 +719,11 @@ fi # (Pretend to) reinstall packages if [[ -n "${PKGS_TO_REMERGE}" ]]; then - pmscmd="${CUSTOM_PMS_COMMAND}" - [[ -z "${pmscmd}" ]] && pmscmd="${PMS_COMMAND[${PMS_INDEX}]}" - cmd="${pmscmd} ${PMS_OPTIONS[${PMS_INDEX}]} ${PKGS_TO_REMERGE} ${ADDITIONAL_OPTIONS}" - einfo ${cmd} - ${cmd} + pmscmd="${CUSTOM_PMS_COMMAND}" + [[ -z "${pmscmd}" ]] && pmscmd="${PMS_COMMAND[${PMS_INDEX}]}" + cmd="${pmscmd} ${PMS_OPTIONS[${PMS_INDEX}]} ${PKGS_TO_REMERGE} ${ADDITIONAL_OPTIONS}" + einfo ${cmd} + ${cmd} else - einfo "No packages need to be reinstalled." + einfo "No packages need to be reinstalled." fi |