2014-10-21 16:05:56 +02:00
|
|
|
#!/usr/bin/env bash
|
2002-12-31 16:43:10 +01:00
|
|
|
# A little script I whipped up to make it easy to
|
|
|
|
# patch source trees and have sane error handling
|
|
|
|
# -Erik
|
|
|
|
#
|
|
|
|
# (c) 2002 Erik Andersen <andersen@codepoet.org>
|
2012-05-18 12:47:01 +02:00
|
|
|
#
|
|
|
|
# Parameters:
|
2014-10-22 18:20:11 +02:00
|
|
|
# - "-s", optional. Silent operation, don't print anything if there
|
|
|
|
# isn't any error.
|
2012-05-18 12:47:01 +02:00
|
|
|
# - the build directory, optional, default value is '.'. The place where are
|
|
|
|
# the package sources.
|
|
|
|
# - the patch directory, optional, default '../kernel-patches'. The place
|
|
|
|
# where are the scripts you want to apply.
|
|
|
|
# - other parameters are the patch name patterns, optional, default value is
|
|
|
|
# '*'. Pattern(s) describing the patch names you want to apply.
|
|
|
|
#
|
|
|
|
# The script will look recursively for patches from the patch directory. If a
|
|
|
|
# file is named 'series' then only patches mentionned into it will be applied.
|
|
|
|
# If not, the script will look for file names matching pattern(s). If the name
|
|
|
|
# ends with '.tar.*', '.tbz2' or '.tgz', the file is considered as an archive
|
|
|
|
# and will be uncompressed into a directory named
|
|
|
|
# '.patches-name_of_the_archive-unpacked'. It's the turn of this directory to
|
|
|
|
# be scanned with '*' as pattern. Remember that scanning is recursive. Other
|
|
|
|
# files than series file and archives are considered as a patch.
|
|
|
|
#
|
|
|
|
# Once a patch is found, the script will try to apply it. If its name doesn't
|
2013-03-25 14:28:00 +01:00
|
|
|
# end with '.gz', '.bz', '.bz2', '.xz', '.zip', '.Z', '.diff*' or '.patch*',
|
|
|
|
# it will be skipped. If necessary, the patch will be uncompressed before being
|
2012-05-18 12:47:01 +02:00
|
|
|
# applied. The list of the patches applied is stored in '.applied_patches_list'
|
|
|
|
# file in the build directory.
|
2002-12-11 00:26:31 +01:00
|
|
|
|
2014-10-22 18:20:11 +02:00
|
|
|
silent=
|
|
|
|
if [ "$1" = "-s" ] ; then
|
|
|
|
# add option to be used by the patch tool
|
|
|
|
silent=-s
|
|
|
|
shift
|
|
|
|
fi
|
|
|
|
|
2002-12-11 00:26:31 +01:00
|
|
|
# Set directories from arguments, or use defaults.
|
2012-03-14 16:33:53 +01:00
|
|
|
builddir=${1-.}
|
2002-12-11 00:26:31 +01:00
|
|
|
patchdir=${2-../kernel-patches}
|
2005-09-30 23:01:44 +02:00
|
|
|
shift 2
|
|
|
|
patchpattern=${@-*}
|
2002-12-11 00:26:31 +01:00
|
|
|
|
2013-06-12 23:01:46 +02:00
|
|
|
# use a well defined sorting order
|
|
|
|
export LC_COLLATE=C
|
|
|
|
|
2012-03-14 16:33:53 +01:00
|
|
|
if [ ! -d "${builddir}" ] ; then
|
|
|
|
echo "Aborting. '${builddir}' is not a directory."
|
2002-12-11 00:26:31 +01:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
if [ ! -d "${patchdir}" ] ; then
|
|
|
|
echo "Aborting. '${patchdir}' is not a directory."
|
|
|
|
exit 1
|
|
|
|
fi
|
2012-03-14 16:33:52 +01:00
|
|
|
|
|
|
|
# Remove any rejects present BEFORE patching - Because if there are
|
|
|
|
# any, even if patches are well applied, at the end it will complain
|
2012-03-14 16:33:53 +01:00
|
|
|
# about rejects in builddir.
|
|
|
|
find ${builddir}/ '(' -name '*.rej' -o -name '.*.rej' ')' -print0 | \
|
2012-03-14 16:33:52 +01:00
|
|
|
xargs -0 -r rm -f
|
|
|
|
|
2012-03-14 16:33:56 +01:00
|
|
|
function apply_patch {
|
|
|
|
path=$1
|
|
|
|
patch=$2
|
|
|
|
case "$patch" in
|
2002-12-11 00:26:31 +01:00
|
|
|
*.gz)
|
|
|
|
type="gzip"; uncomp="gunzip -dc"; ;;
|
|
|
|
*.bz)
|
|
|
|
type="bzip"; uncomp="bunzip -dc"; ;;
|
|
|
|
*.bz2)
|
|
|
|
type="bzip2"; uncomp="bunzip2 -dc"; ;;
|
2013-03-25 14:28:00 +01:00
|
|
|
*.xz)
|
|
|
|
type="xz"; uncomp="unxz -dc"; ;;
|
2002-12-11 00:26:31 +01:00
|
|
|
*.zip)
|
|
|
|
type="zip"; uncomp="unzip -d"; ;;
|
|
|
|
*.Z)
|
|
|
|
type="compress"; uncomp="uncompress -c"; ;;
|
2012-03-21 14:26:27 +01:00
|
|
|
*.diff*)
|
|
|
|
type="diff"; uncomp="cat"; ;;
|
|
|
|
*.patch*)
|
|
|
|
type="patch"; uncomp="cat"; ;;
|
2002-12-11 00:26:31 +01:00
|
|
|
*)
|
2013-09-16 22:42:47 +02:00
|
|
|
echo "Unsupported file type for ${path}/${patch}, skipping";
|
|
|
|
return 0
|
2012-03-21 14:26:27 +01:00
|
|
|
;;
|
2012-03-14 16:33:56 +01:00
|
|
|
esac
|
2014-10-22 18:20:11 +02:00
|
|
|
if [ -z "$silent" ] ; then
|
|
|
|
echo ""
|
|
|
|
echo "Applying $patch using ${type}: "
|
|
|
|
fi
|
2013-09-15 16:13:14 +02:00
|
|
|
if [ ! -e "${path}/$patch" ] ; then
|
|
|
|
echo "Error: missing patch file ${path}/$patch"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
echo $patch >> ${builddir}/.applied_patches_list
|
2014-10-22 18:20:11 +02:00
|
|
|
${uncomp} "${path}/$patch" | patch -g0 -p1 -E -d "${builddir}" -t -N $silent
|
2002-12-11 00:26:31 +01:00
|
|
|
if [ $? != 0 ] ; then
|
2012-03-14 16:33:56 +01:00
|
|
|
echo "Patch failed! Please fix ${patch}!"
|
2002-12-11 00:26:31 +01:00
|
|
|
exit 1
|
|
|
|
fi
|
2012-03-14 16:33:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function scan_patchdir {
|
2014-02-07 11:16:28 +01:00
|
|
|
local path=$1
|
2012-03-14 16:33:56 +01:00
|
|
|
shift 1
|
|
|
|
patches=${@-*}
|
|
|
|
|
2012-03-14 16:33:57 +01:00
|
|
|
# If there is a series file, use it instead of using ls sort order
|
|
|
|
# to apply patches. Skip line starting with a dash.
|
|
|
|
if [ -e "${path}/series" ] ; then
|
|
|
|
for i in `grep -Ev "^#" ${path}/series 2> /dev/null` ; do
|
2013-09-15 16:13:14 +02:00
|
|
|
apply_patch "$path" "$i"
|
2012-03-14 16:33:57 +01:00
|
|
|
done
|
|
|
|
else
|
|
|
|
for i in `cd $path; ls -d $patches 2> /dev/null` ; do
|
|
|
|
if [ -d "${path}/$i" ] ; then
|
2012-03-21 14:26:27 +01:00
|
|
|
scan_patchdir "${path}/$i"
|
2012-03-14 16:33:57 +01:00
|
|
|
elif echo "$i" | grep -q -E "\.tar(\..*)?$|\.tbz2?$|\.tgz$" ; then
|
|
|
|
unpackedarchivedir="$builddir/.patches-$(basename $i)-unpacked"
|
|
|
|
rm -rf "$unpackedarchivedir" 2> /dev/null
|
|
|
|
mkdir "$unpackedarchivedir"
|
2012-03-21 14:26:27 +01:00
|
|
|
tar -C "$unpackedarchivedir" -xaf "${path}/$i"
|
2012-03-14 16:33:57 +01:00
|
|
|
scan_patchdir "$unpackedarchivedir"
|
|
|
|
else
|
2013-09-15 16:13:14 +02:00
|
|
|
apply_patch "$path" "$i"
|
2012-03-14 16:33:57 +01:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
fi
|
2012-03-14 16:33:56 +01:00
|
|
|
}
|
|
|
|
|
2012-04-16 18:02:53 +02:00
|
|
|
scan_patchdir "$patchdir" "$patchpattern"
|
2002-12-11 00:26:31 +01:00
|
|
|
|
|
|
|
# Check for rejects...
|
2012-03-14 16:33:53 +01:00
|
|
|
if [ "`find $builddir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then
|
2002-12-11 00:26:31 +01:00
|
|
|
echo "Aborting. Reject files found."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Remove backup files
|
2012-03-14 16:33:53 +01:00
|
|
|
find $builddir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
|