summaryrefslogtreecommitdiffstats
path: root/support/scripts/apply-patches.sh
blob: 1f632aa88b64a730665c00c5aa57160d1e4ed0d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#! /bin/bash
# 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>

# Set directories from arguments, or use defaults.
builddir=${1-.}
patchdir=${2-../kernel-patches}
shift 2
patchpattern=${@-*}

if [ ! -d "${builddir}" ] ; then
    echo "Aborting.  '${builddir}' is not a directory."
    exit 1
fi
if [ ! -d "${patchdir}" ] ; then
    echo "Aborting.  '${patchdir}' is not a directory."
    exit 1
fi

# Remove any rejects present BEFORE patching - Because if there are
# any, even if patches are well applied, at the end it will complain
# about rejects in builddir.
find ${builddir}/ '(' -name '*.rej' -o -name '.*.rej' ')' -print0 | \
    xargs -0 -r rm -f

function apply_patch {
    path=$1
    patch=$2
    case "$patch" in
	*.gz)
	type="gzip"; uncomp="gunzip -dc"; ;; 
	*.bz)
	type="bzip"; uncomp="bunzip -dc"; ;; 
	*.bz2)
	type="bzip2"; uncomp="bunzip2 -dc"; ;; 
	*.zip)
	type="zip"; uncomp="unzip -d"; ;; 
	*.Z)
	type="compress"; uncomp="uncompress -c"; ;; 
	*)
	type="plaintext"; uncomp="cat"; ;; 
    esac
    echo ""
    echo "Applying $patch using ${type}: "
	echo $patch >> ${builddir}/.applied_patches_list
    ${uncomp} "${path}/$patch" | patch -g0 -p1 -E -d "${builddir}"
    if [ $? != 0 ] ; then
        echo "Patch failed!  Please fix ${patch}!"
	exit 1
    fi
}

function scan_patchdir {
    path=$1
    shift 1
    patches=${@-*}

    for i in `cd $path; ls -d $patches 2> /dev/null` ; do
        if [ -d "${path}/$i" ] ; then
            echo "${path}/$i skipped"
        elif echo "$i" | grep -q -E "\.tar(\..*)?$|\.tbz2?$|\.tgz$" ; then
            unpackedarchivedir="$builddir/.patches-$(basename $i)-unpacked"
            rm -rf "$unpackedarchivedir" 2> /dev/null
            mkdir "$unpackedarchivedir"
            tar -C "$unpackedarchivedir" --strip-components=1 -xaf "${path}/$i"
            scan_patchdir "$unpackedarchivedir"
        else
            apply_patch "$path" "$i" || exit 1
        fi
    done
}

scan_patchdir $patchdir $patchpattern

# Check for rejects...
if [ "`find $builddir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then
    echo "Aborting.  Reject files found."
    exit 1
fi

# Remove backup files
find $builddir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;