#!/bin/bash # autoepatch - Automatic patch scripting # Copyright (C) 2006 Gentoo Foundation # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with autoepatch; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA main() { # To allow installing on any prefix, make sure that # the prefix is actually set local PREFIX="@PREFIX@" [[ ${PREFIX//@/|} == "|PREFIX|" ]] && PREFIX="/usr" # When running out of SVN, load local modules and # libraries only. local basedir="$(dirname $0)" [[ $0 == "${PREFIX}/bin/autoepatch.sh" ]] && \ basedir="${PREFIX}/share/autoepatch" # Source baselayout functions.sh for einfo/ewarn and similar # functions. If on an offset prefix, use the prefixed path. [[ ${PREFIX} == "/usr" ]] && \ source "/sbin/functions.sh" || \ source "${PREFIX}/sbin/functions.sh" source "${basedir}/lib/functions.sh" [[ -z ${CHOST} ]] && CHOST="$(portageq envvar CHOST)" [[ -z ${WORKDIR} ]] && WORKDIR="$(pwd)" [[ -z ${T} ]] && T="/tmp" for patchset in "${basedir}"/patches/*; do ( source "${patchset}/${patchset##*/}.sh" targets="$(patch_targets)" [[ -z ${targets} ]] && exit 0 while read target; do for patch in "${patchset}"/*.patch; do if try_patch "${target}" "${patch}"; then PATCH_APPLIED="yes" break fi done # Check if the patchset requires us to fail if the # patch is not applied, if there's no patch_required # function, just skip over type patch_required &>/dev/null || continue if ! type patch_failed_msg &>/dev/null; then patch_failed_msg() { eerror "Failed patch ${patchset##*/}" } fi if [[ -z ${PATCH_APPLIED} ]]; then patch_required && patch_failed_msg && exit 1 fi done <<<"${targets}" exit 0 ) || eerror "Error in subshell" done IFS="${save_IFS}" } main