summaryrefslogtreecommitdiff
path: root/eclass/sab-patches.eclass
diff options
context:
space:
mode:
Diffstat (limited to 'eclass/sab-patches.eclass')
-rw-r--r--eclass/sab-patches.eclass114
1 files changed, 114 insertions, 0 deletions
diff --git a/eclass/sab-patches.eclass b/eclass/sab-patches.eclass
new file mode 100644
index 00000000..d4e74cef
--- /dev/null
+++ b/eclass/sab-patches.eclass
@@ -0,0 +1,114 @@
+# Copyright 2014 Sabayon
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+# @ECLASS: sab-patches.eclass
+# @MAINTAINER:
+# slawomir.nizio@sabayon.org
+# @AUTHOR:
+# SÅ‚awomir Nizio <slawomir.nizio@sabayon.org>
+# @BLURB: eclass that makes it easier to apply patches from tarballs
+# @DESCRIPTION:
+# Adds a patch or patches to SRC_URI and makes it easy to apply them.
+# It is intended to work with tarballs containing patches, and is
+# made to make it easier for Sabayon split ebuilds.
+# (Plain patches kept in a VCS are very nice, but in the case of split
+# ebuilds, duplicating the patches is not effective.)
+# The eclass does not define any phase function.
+
+# @ECLASS-VARIABLE: SAB_PATCHES_SRC
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Array that contains URIs of patches to be added to SRC_URI. Mandatory!
+
+# @ECLASS-VARIABLE: SAB_PATCHES_SKIP
+# @DESCRIPTION:
+# Array that contains patterns of patch names to be skipped.
+# It does not need to be a global variable.
+
+inherit eutils
+
+if [[ ${#SAB_PATCHES_SRC[@]} -eq 0 ]]; then
+ die "SAB_PATCHES_SRC is not set"
+fi
+
+for _sab_patch in "${SAB_PATCHES_SRC[@]}"; do
+ SRC_URI=${_sab_patch}
+done
+unset _sab_patch
+
+# @FUNCTION: sab-patches_apply_all
+# @DESCRIPTION:
+# Applies patches that can be found under
+# ${WORKDIR}/<name of the patch tarball without ext.>, for each tarball.
+# Order of patching is specified by the 'order' file, which must exist in
+# each tarball.
+# Patch names that are listed in SAB_PATCHES_SKIP are skipped
+# by _sab-patches_apply_from_dir.
+sab-patches_apply_all() {
+ local p
+ for p in "${SAB_PATCHES_SRC[@]}"; do
+ local dir=${p##*/}
+ dir=${dir%.tar*}
+ _sab-patches_apply_from_dir "${WORKDIR}/${dir}"
+ done
+}
+
+# @FUNCTION: sab-patches_apply
+# @DESCRIPTION:
+# Apply selected patches. Arguments are the directory containing
+# the patch, followed by one or more patch names.
+sab-patches_apply() {
+ [[ $# -lt 2 ]] && die "sab-patches_apply: missing arguments"
+ local dir=$1
+ shift
+ local patch
+ for patch; do
+ epatch "${dir}/${patch}"
+ done
+}
+
+# @FUNCTION: _sab-patches_apply_from_dir
+# @INTERNAL
+# @DESCRIPTION:
+# Apply all patches from a directory in order. Obeys SAB_PATCHES_SKIP.
+_sab-patches_apply_from_dir() {
+ local dir=$1
+ local order_file=${dir}/order
+ if [[ ! -r ${order_file} ]] || [[ ! -f ${order_file} ]]; then
+ die "Problems with '${order_file}'... (Does it exist?)"
+ fi
+
+ local patch
+ while read patch; do
+ local patch_path=${dir}/${patch}
+ if \
+ [[ -z ${patch} ]] || \
+ [[ ${patch} = *\ * ]] || \
+ [[ ${patch} = */* ]] || \
+ [[ ! -f ${patch_path} ]]; then
+ die "Problems with the patch '${patch}', see ${order_file}."
+ fi
+
+ if _sab-patches_is_skipped "${patch}"; then
+ einfo "(skipping ${patch})"
+ else
+ epatch "${patch_path}"
+ fi
+ done < "${order_file}"
+
+ [[ $? -ne 0 ]] && die "_sab-patches_apply_from_dir: loop failed"
+}
+
+# @FUNCTION: _sab-patches_is_skipped
+# @INTERNAL
+# @DESCRIPTION:
+# Returns success if the patch should be skipped. O(n). :)
+_sab-patches_is_skipped() {
+ local arg=$1
+ local p
+ for p in "${SAB_PATCHES_SKIP[@]}"; do
+ [[ ${arg} = ${p} ]] && return 0
+ done
+ return 1
+}