diff options
author | Fabian Groffen <grobian@gentoo.org> | 2012-01-09 10:42:19 +0000 |
---|---|---|
committer | Fabian Groffen <grobian@gentoo.org> | 2012-01-09 10:42:19 +0000 |
commit | ebdb1e77e5c01746f475fba158405b1a5f75742e (patch) | |
tree | 4412ba2bc57843b5492b6d30f581bc370d9fdade /eclass/mysql_fx.eclass | |
parent | mysql eclasses from gx86 should be good to go now (diff) | |
download | historical-ebdb1e77e5c01746f475fba158405b1a5f75742e.tar.gz historical-ebdb1e77e5c01746f475fba158405b1a5f75742e.tar.bz2 historical-ebdb1e77e5c01746f475fba158405b1a5f75742e.zip |
Restore incorrectly removed eclasses, wrong repo
Diffstat (limited to 'eclass/mysql_fx.eclass')
-rw-r--r-- | eclass/mysql_fx.eclass | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/eclass/mysql_fx.eclass b/eclass/mysql_fx.eclass new file mode 100644 index 000000000000..2e56fbac354c --- /dev/null +++ b/eclass/mysql_fx.eclass @@ -0,0 +1,305 @@ +# Copyright 1999-2012 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/eclass/mysql_fx.eclass,v 1.30 2012/01/09 10:42:19 grobian Exp $ + +# Author: Francesco Riosa (Retired) <vivo@gentoo.org> +# Maintainer: +# - MySQL Team <mysql-bugs@gentoo.org> +# - Luca Longinotti <chtekk@gentoo.org> + +inherit multilib + +# +# Helper function, version (integer) may have sections separated by dots +# for readability. +# +stripdots() { + local dotver=${1:-"0"} + local v="" + local ret=0 + if [[ "${dotver/./}" != "${dotver}" ]] ; then + # dotted version number + for i in 1000000 10000 100 1 ; do + v=${dotver%%\.*} + # remove leading zeroes + while [[ ${#v} -gt 1 ]] && [[ ${v:0:1} == "0" ]] ; do v=${v#0} ; done + # increment integer version number + ret=$(( ${v} * ${i} + ${ret} )) + if [[ "${dotver}" == "${dotver/\.}" ]] ; then + dotver=0 + else + dotver=${dotver#*\.} + fi + done + echo "${ret}" + else + # already an integer + v=${dotver} + while [[ ${#v} -gt 1 ]] && [[ ${v:0:1} == "0" ]] ; do v=${v#0} ; done + echo "${v}" + fi +} + +# +# Check if a version number falls inside a given range. +# The range includes the extremes and must be specified as +# "low_version to high_version" i.e. "4.1.2 to 5.1.99.99". +# Returns true if inside the range. +# +mysql_check_version_range() { + local lbound="${1%% to *}" ; lbound=$(stripdots "${lbound}") + local rbound="${1#* to }" ; rbound=$(stripdots "${rbound}") + local my_ver="${2:-"${MYSQL_VERSION_ID}"}" + [[ ${lbound} -le ${my_ver} ]] && [[ ${my_ver} -le ${rbound} ]] && return 0 + return 1 +} + +# +# True if at least one applicable range is found for the patch. +# +_mysql_test_patch_ver_pn() { + local allelements=", version, package name" + # So that it fails the directory test if none of them exist + local filesdir="/dev/null" + for d in "${WORKDIR}/mysql-extras-${MY_EXTRAS_VER}" \ + "${WORKDIR}/mysql-extras" ; do + if [ -d "${d}" ]; then + filesdir="${d}" + break + fi + done + + [[ -d "${filesdir}" ]] || die "Source dir must be a directory" + local flags=$1 pname=$2 + if [[ $(( $flags & $(( 1 + 4 + 16 )) )) -eq 21 ]] ; then + einfo "using '${pname}'" + ln -sf "${filesdir}/${pname}" "${EPATCH_SOURCE}" || die "Couldn't move ${pname}" + return 0 + fi + + [[ $(( $flags & $(( 2 + 4 )) )) -gt 0 ]] \ + && allelements="${allelements//", version"}" + + [[ $(( $flags & $(( 8 + 16 )) )) -gt 0 ]] \ + && allelements="${allelements//", package name"}" + + [[ -n "${allelements}" ]] && [[ "${flags}" -gt 0 ]] \ + && ewarn "QA notice: ${allelements} missing in ${pname} patch" + + return 1 +} + +# +# Parse a "index_file" looking for patches to apply to the +# current MySQL version. +# If the patch applies, print its description. +# +mysql_mv_patches() { + # So that it fails the directory test if none of them exist + local filesdir="/dev/null" + if [[ -z "${1}" ]]; then + for d in "${WORKDIR}/mysql-extras-${MY_EXTRAS_VER}" \ + "${WORKDIR}/mysql-extras" ; do + if [ -d "${d}" ]; then + filesdir="${d}" + break + fi + done + [[ -d "${filesdir}" ]] || die "No patches directory found!" + fi + + for i in "$1" "${filesdir}/0000_index.txt" "${filesdir}/000_index.txt" ; do + if [ -n "$i" -a -f "$i" ]; then + local index_file="$i" + break + fi + done + + local my_ver="${2:-"${MYSQL_VERSION_ID}"}" + local my_test_fx=${3:-"_mysql_test_patch_ver_pn"} + _mysql_mv_patches "${index_file}" "${my_ver}" "${my_test_fx}" +} + +_mysql_mv_patches() { + local index_file="${1}" + local my_ver="${2}" + local my_test_fx="${3}" + local dsc ndsc=0 i + dsc=( ) + + # Values for flags are (2^x): + # 1 - one patch found + # 2 - at least one version range is wrong + # 4 - at least one version range is ok + # 8 - at least one ${PN} did not match + # 16 - at least one ${PN} has been matched + local flags=0 pname="" + while read row ; do + case "${row}" in + @patch\ *) + [[ -n "${pname}" ]] \ + && ${my_test_fx} ${flags} "${pname}" \ + && for (( i=0 ; $i < $ndsc ; i++ )) ; do einfo "> ${dsc[$i]}" ; done + flags=1 ; ndsc=0 ; dsc=( ) + pname=${row#"@patch "} + ;; + @ver\ *) + if mysql_check_version_range "${row#"@ver "}" "${my_ver}" ; then + flags=$(( ${flags} | 4 )) + else + flags=$(( ${flags} | 2 )) + fi + ;; + @pn\ *) + if [[ ${row#"@pn "} == "${PN}" ]] ; then + flags=$(( ${flags} | 16 )) + else + flags=$(( ${flags} | 8 )) + fi + ;; + # @use\ *) ;; + @@\ *) + dsc[$ndsc]="${row#"@@ "}" + (( ++ndsc )) + ;; + esac + done < "${index_file}" + + ${my_test_fx} ${flags} "${pname}" \ + && for (( i=0 ; $i < $ndsc ; i++ )) ; do einfo "> ${dsc[$i]}" ; done +} + +# +# Is $2 (defaults to $MYSQL_VERSION_ID) at least version $1? +# (nice) idea from versionator.eclass +# +mysql_version_is_at_least() { + local want_s=$(stripdots "$1") have_s=$(stripdots "${2:-${MYSQL_VERSION_ID}}") + [[ -z "${want_s}" ]] && die "mysql_version_is_at_least missing value to check" + [[ ${want_s} -le ${have_s} ]] && return 0 || return 1 +} + +# +# To be called on the live filesystem, reassigning symlinks of each MySQL +# library to the best version available. +# +mysql_lib_symlinks() { + + local d dirlist maxdots libname libnameln libsuffix reldir + libsuffix=$(get_libname) + + einfo "libsuffix = ${libsuffix}" + einfo "Updating MySQL libraries symlinks" + + reldir="${1}" + pushd "${reldir}/usr/$(get_libdir)" &> /dev/null + + # dirlist must contain the less significative directory left + dirlist="mysql" + + # waste some time in removing and recreating symlinks + for d in $dirlist ; do + for libname in $( find "${d}" -mindepth 1 -maxdepth 1 -name "*${libsuffix}*" -and -not -type "l" 2>/dev/null ) ; do + # maxdot is a limit versus infinite loop + maxdots=0 + libnameln=${libname##*/} + # loop in version of the library to link it, similar to how + # libtool works + if [[ ${CHOST} == *-darwin* ]] ; then + # macho: libname.x.y.z.dylib + local libbasename=${libnameln%%.*} # libname + local libver=${libnameln#${libbasename}} # .x.y.z.dylib + libver=${libver%${libsuffix}} # .x.y.z + while [[ -n ${libver} ]] && [[ ${maxdots} -lt 6 ]] ; do + libnameln="${libbasename}${libver}${libsuffix}" + rm -f "${libnameln}" + ln -s "${libname}" "${libnameln}" + (( ++maxdots )) + libver=${libver%.*} + done + libnameln="${libbasename}${libsuffix}" + rm -f "${libnameln}" + ln -s "${libname}" "${libnameln}" + else + # elf: libname.so.x.y.z + while [[ ${libnameln:0-3} != '${libsuffix}' ]] && [[ ${maxdots} -lt 6 ]] ; do + rm -f "${libnameln}" + ln -s "${libname}" "${libnameln}" + (( ++maxdots )) + libnameln="${libnameln%.*}" + done + rm -f "${libnameln}" + ln -s "${libname}" "${libnameln}" + fi + done + done + + popd &> /dev/null +} + +# @FUNCTION: mysql_init_vars +# @DESCRIPTION: +# void mysql_init_vars() +# Initialize global variables +# 2005-11-19 <vivo@gentoo.org> +mysql_init_vars() { + MY_SHAREDSTATEDIR=${MY_SHAREDSTATEDIR="${EPREFIX}/usr/share/mysql"} + MY_SYSCONFDIR=${MY_SYSCONFDIR="${EPREFIX}/etc/mysql"} + MY_LOCALSTATEDIR=${MY_LOCALSTATEDIR="${EPREFIX}/var/lib/mysql"} + MY_LOGDIR=${MY_LOGDIR="${EPREFIX}/var/log/mysql"} + MY_INCLUDEDIR=${MY_INCLUDEDIR="${EPREFIX}/usr/include/mysql"} + MY_LIBDIR=${MY_LIBDIR="${EPREFIX}/usr/$(get_libdir)/mysql"} + + if [[ -z "${MY_DATADIR}" ]] ; then + MY_DATADIR="" + if [[ -f "${MY_SYSCONFDIR}/my.cnf" ]] ; then + MY_DATADIR=`"my_print_defaults" mysqld 2>/dev/null \ + | sed -ne '/datadir/s|^--datadir=||p' \ + | tail -n1` + if [[ -z "${MY_DATADIR}" ]] ; then + MY_DATADIR=`grep ^datadir "${MY_SYSCONFDIR}/my.cnf" \ + | sed -e 's/.*=\s*//' \ + | tail -n1` + fi + fi + if [[ -z "${MY_DATADIR}" ]] ; then + MY_DATADIR="${MY_LOCALSTATEDIR}" + einfo "Using default MY_DATADIR" + fi + elog "MySQL MY_DATADIR is ${MY_DATADIR}" + + if [[ -z "${PREVIOUS_DATADIR}" ]] ; then + if [[ -e "${MY_DATADIR}" ]] ; then + # If you get this and you're wondering about it, see bug #207636 + elog "MySQL datadir found in ${MY_DATADIR}" + elog "A new one will not be created." + PREVIOUS_DATADIR="yes" + else + PREVIOUS_DATADIR="no" + fi + export PREVIOUS_DATADIR + fi + else + if [[ ${EBUILD_PHASE} == "config" ]]; then + local new_MY_DATADIR + new_MY_DATADIR=`"my_print_defaults" mysqld 2>/dev/null \ + | sed -ne '/datadir/s|^--datadir=||p' \ + | tail -n1` + + if [[ ( -n "${new_MY_DATADIR}" ) && ( "${new_MY_DATADIR}" != "${MY_DATADIR}" ) ]]; then + ewarn "MySQL MY_DATADIR has changed" + ewarn "from ${MY_DATADIR}" + ewarn "to ${new_MY_DATADIR}" + fi + fi + fi + + if [ "${MY_SOURCEDIR:-unset}" == "unset" ]; then + MY_SOURCEDIR=${SERVER_URI##*/} + MY_SOURCEDIR=${MY_SOURCEDIR%.tar*} + fi + + export MY_SHAREDSTATEDIR MY_SYSCONFDIR + export MY_LIBDIR MY_LOCALSTATEDIR MY_LOGDIR + export MY_INCLUDEDIR MY_DATADIR MY_SOURCEDIR +} |